module Qiita::Team::Services::Hooks::Concerns::Slack

Send richly-formatted messages to Slack. Override {HttpClient#url} to implement HttpClient.

@see api.slack.com/docs/attachments

Constants

DEFAULT_ICON_URL
ICON_EMOJI_FORMAT
TEXT_BYTESIZE_MAX

Public Instance Methods

item_became_coediting(event) click to toggle source

@param event [Qiita::Team::Services::Events::ItemBecameCoediting] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 76
def item_became_coediting(event)
  send_message(
    text: "#{user_link(event.user)} changed #{item_link(event.item)} to coedit mode",
  )
end
item_comment_created(event) click to toggle source

@param event [Qiita::Team::Services::Events::ItemCommentCreated] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 94
def item_comment_created(event)
  fallback =
    if event.item.coediting?
      "New #{comment_link(event.comment)} on #{item_link(event.item)}"
    else
      "New #{comment_link(event.comment)} on #{user_link(event.item.user)}'s " \
      "#{item_link(event.item)}"
    end
  send_message(
    attachments: [
      fallback: fallback,
      pretext: fallback,
      author_name: "@#{event.user.url_name}",
      author_link: event.user.url,
      author_icon: event.user.profile_image_url,
      text: truncate(Slacken.translate(event.comment.rendered_body), event.comment.url),
      mrkdwn_in: ["text"],
    ],
  )
end
item_comment_destroyed(event) click to toggle source

@param event [Qiita::Team::Services::Events::ItemCommentDestroyed] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 127
def item_comment_destroyed(event)
  send_message(
    text: "#{user_link(event.user)} deleted a comment on #{item_link(event.item)}",
  )
end
item_comment_updated(event) click to toggle source

@param event [Qiita::Team::Services::Events::ItemCommentUpdated] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 118
def item_comment_updated(event)
  text = "#{user_link(event.user)} updated a #{comment_link(event.comment)}"
  text << " on #{item_link(event.item)}"
  send_message(text: text)
end
item_created(event) click to toggle source

@param event [Qiita::Team::Services::Events::ItemCreated] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 47
def item_created(event)
  fallback = "#{user_link(event.user)} created a new post"
  send_message(
    attachments: [
      fallback: fallback,
      pretext: fallback,
      author_name: "@#{event.user.url_name}",
      author_link: event.user.url,
      author_icon: event.user.profile_image_url,
      title: event.item.title,
      title_link: event.item.url,
      text: truncate(Slacken.translate(event.item.rendered_body), event.item.url),
      mrkdwn_in: ["text"],
    ],
  )
end
item_destroyed(event) click to toggle source

@param event [Qiita::Team::Services::Events::ItemDestroyed] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 85
def item_destroyed(event)
  send_message(
    text: "#{user_link(event.user)} deleted #{event.item.title}",
  )
end
item_updated(event) click to toggle source

@param event [Qiita::Team::Services::Events::ItemUpdated] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 67
def item_updated(event)
  send_message(
    text: "#{user_link(event.user)} updated #{item_link(event.item)}",
  )
end
ping() click to toggle source

@return [void]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 38
def ping
  send_message(text: "Test message sent from Qiita:Team")
rescue DeliveryError
  nil
end
project_activated(event) click to toggle source

@param event [Qiita::Team::Services::Events::ProjectActivated] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 226
def project_activated(event)
  send_message(
    text: "#{user_link(event.user)} activated #{project_link(event.project)} project",
  )
end
project_archived(event) click to toggle source

@param event [Qiita::Team::Services::Events::ProjectArchived] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 217
def project_archived(event)
  send_message(
    text: "#{user_link(event.user)} archived #{project_link(event.project)} project",
  )
end
project_comment_created(event) click to toggle source

@param event [Qiita::Team::Services::Events::ProjectCommentCreated] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 136
def project_comment_created(event)
  fallback = "New #{comment_link(event.comment)} on #{project_link(event.project)}"
  send_message(
    attachments: [
      fallback: fallback,
      pretext: fallback,
      author_name: "@#{event.user.url_name}",
      author_link: event.user.url,
      author_icon: event.user.profile_image_url,
      text: truncate(Slacken.translate(event.comment.rendered_body), event.comment.url),
      mrkdwn_in: ["text"],
    ],
  )
end
project_comment_destroyed(event) click to toggle source

@param event [Qiita::Team::Services::Events::ProjectCommentDestroyed] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 163
def project_comment_destroyed(event)
  send_message(
    text: "#{user_link(event.user)} deleted a comemnt on #{project_link(event.project)}",
  )
end
project_comment_updated(event) click to toggle source

@param event [Qiita::Team::Services::Events::ProjectCommentUpdated] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 154
def project_comment_updated(event)
  text = "#{user_link(event.user)} updated a #{comment_link(event.comment)}"
  text << " on #{project_link(event.project)}"
  send_message(text: text)
end
project_created(event) click to toggle source

@param event [Qiita::Team::Services::Events::ProjectCreated] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 190
def project_created(event)
  send_message(
    text: "#{user_link(event.user)} created #{project_link(event.project)} project",
  )
end
project_destroyed(event) click to toggle source

@param event [Qiita::Team::Services::Events::ProjectDestroyed] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 208
def project_destroyed(event)
  send_message(
    text: "#{user_link(event.user)} deleted #{project_link(event.project)} project",
  )
end
project_updated(event) click to toggle source

@param event [Qiita::Team::Services::Events::ProjectUpdated] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 199
def project_updated(event)
  send_message(
    text: "#{user_link(event.user)} updated #{project_link(event.project)} project",
  )
end
service_name() click to toggle source

@note Override {Services::Base.service_name}.

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 32
def service_name
  "Slack"
end
team_member_added(event) click to toggle source

@param event [Qiita::Team::Services::Events::MemberAdded] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 172
def team_member_added(event)
  send_message(
    text: "#{user_link(event.member)} was added to the #{team_link(event.team)} team",
  )
end
team_member_removed(event) click to toggle source

@param event [Qiita::Team::Services::Events::MemberRemoved] @return [void] @raise [Qiita::Team::Services::DeliveryError]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 181
def team_member_removed(event)
  send_message(
    text: "#{event.member.name} was removed from the #{team_link(event.team)} team",
  )
end

Private Instance Methods

markup_escape(text) click to toggle source

Escape special characters for Slack markup.

@see api.slack.com/docs/formatting @param text [String] @return [String]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 284
def markup_escape(text)
  table_for_escape = {
    "&" => "&amp;",
    "<" => "&lt;",
    ">" => "&gt;",
  }
  text.gsub(/[&<>]/, table_for_escape)
end
send_message(request_body) click to toggle source

@param request_body [Hash] @return [void]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 236
def send_message(request_body)
  http_post(user_hash.merge(request_body))
end
truncate(text, url) click to toggle source

Truncate the text to 7500 bytes. Now, Slack has a bug that we cannot send text larger than 8000 bytes.

@param text [String] @param url [String] @return [String]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 299
def truncate(text, url)
  return text if text.bytesize <= TEXT_BYTESIZE_MAX
  tail = "...\n<#{url}|Read more at Qiita:Team...>"
  text.byteslice(0, TEXT_BYTESIZE_MAX - tail.bytesize).scrub("") + tail
end
user_hash() click to toggle source

@return [Hash]

# File lib/qiita/team/services/hooks/concerns/slack.rb, line 241
def user_hash
  if icon_emoji.blank?
    { username: username, icon_url: DEFAULT_ICON_URL }
  else
    { username: username, icon_emoji: icon_emoji }
  end
end