slack으로 접는 메시지를 hubot에서 보내기
목적
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
메시지의 송신이 비동기 적으로 행해지기 때문에, 단락지어 송신했을 때에 순서가 바뀔 우려가 있다. 이 때문에, 지연을 넣어 송신하고 있다. 다사이.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(slack으로 접는 메시지를 hubot에서 보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/kackytw/items/1855e418221fd1144b17
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
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
메시지의 송신이 비동기 적으로 행해지기 때문에, 단락지어 송신했을 때에 순서가 바뀔 우려가 있다. 이 때문에, 지연을 넣어 송신하고 있다. 다사이.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(slack으로 접는 메시지를 hubot에서 보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/kackytw/items/1855e418221fd1144b17
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
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
Reference
이 문제에 관하여(slack으로 접는 메시지를 hubot에서 보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kackytw/items/1855e418221fd1144b17텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)