slack으로 접는 메시지를 hubot에서 보내기

6501 단어 슬랙slackbotHubot

목적



hubot등의 bot로 slack의 메세지를 송신할 때에 아래와 같은 접을 수 있는 형태로 보내고 싶다.



함정



slack attachment를 사용하면 할 수 있지만, slack attachment는 메시지(text)가 8000byte(8000문자는 아니다)로 중단된다고 하는 함정이 존재하므로, 긴 메시지를 보낼 때는 8000byte마다 구분해(가능하면 개행 등 단락의 좋은 곳에 잘라서) 보낼 필요가 있다.

회피 코드


toUtf8String = (str) ->
  return unescape(encodeURIComponent(str))

toJSString = (str) ->
  return decodeURIComponent(escape(str))

sendAttachmentMessage = (robot, msg, pretext, text, delay) ->
  setTimeout ->
    robot.emit 'slack.attachment',
    message: msg.message
    content:
      # see https://api.slack.com/docs/attachments
      pretext: pretext
      text: text
      fallback: "Attachment fallback"
  , delay


# robot : hubotのインスタンス
# msg : msgインスタンス
# message : 送信するメッセージ(string)
# reply : 返信かどうか(bool)
module.exports.longMessage = (robot, msg, message, reply) ->
  delay = 0
  if reply
    reply_to = "@#{msg.message.user.name}"
  else
    reply_to = ""

  # slackのattachmentsは8000byteで打ち切られるため、その対策
  message_utf8 = toUtf8String(message)
  while message_utf8.length > 0
    if message_utf8.length >= 8000
      idx = message_utf8.lastIndexOf('\n', 8000)
      if idx < 0
        idx = 8000
      else
        idx = idx + 1
    else
      idx = message_utf8.length
    tmp = message_utf8.substr(0, idx)
    message_utf8 = message_utf8.substr(idx)
    # メッセージ毎に1秒遅延を入れる(順番入れ替わり対策)
    sendAttachmentMessage(robot, msg, reply_to, toJSString(tmp), delay)
    reply_to = ""
    delay += 1000

메시지의 송신이 비동기 적으로 행해지기 때문에, 단락지어 송신했을 때에 순서가 바뀔 우려가 있다. 이 때문에, 지연을 넣어 송신하고 있다. 다사이.

좋은 웹페이지 즐겨찾기