mirror of
https://github.com/discourse/discourse.git
synced 2024-12-16 03:13:43 +08:00
61 lines
1.9 KiB
Ruby
61 lines
1.9 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
##
|
||
|
# Processes slack-formatted text messages, as Mattermost does with
|
||
|
# Slack incoming webhook interoperability, for example links in the
|
||
|
# format <LINK> and <LINK|TEXT>, <!here> and <!all> mentions.
|
||
|
#
|
||
|
# See https://api.slack.com/reference/surfaces/formatting for all of
|
||
|
# the different formatting slack supports with mrkdwn which is mostly
|
||
|
# identical to Markdown.
|
||
|
#
|
||
|
# Mattermost docs for translating the slack format:
|
||
|
#
|
||
|
# https://docs.mattermost.com/developer/webhooks-incoming.html?highlight=translate%20slack%20data%20format%20mattermost#translate-slack-s-data-format-to-mattermost
|
||
|
#
|
||
|
# We may want to process attachments and blocks from slack in future, and
|
||
|
# convert user IDs into user mentions.
|
||
|
class Chat::SlackCompatibility
|
||
|
MRKDWN_LINK_REGEX = Regexp.new(/(<[^\n<\|>]+>|<[^\n<\>]+>)/).freeze
|
||
|
|
||
|
class << self
|
||
|
def process_text(text)
|
||
|
text = text.gsub("<!here>", "@here")
|
||
|
text = text.gsub("<!all>", "@all")
|
||
|
|
||
|
text.scan(MRKDWN_LINK_REGEX) do |match|
|
||
|
match = match.first
|
||
|
|
||
|
if match.include?("|")
|
||
|
link, title = match.split("|")[0..1]
|
||
|
else
|
||
|
link = match
|
||
|
end
|
||
|
|
||
|
title = title&.gsub(/<|>/, "")
|
||
|
link = link&.gsub(/<|>/, "")
|
||
|
|
||
|
if title
|
||
|
text = text.gsub(match, "[#{title}](#{link})")
|
||
|
else
|
||
|
text = text.gsub(match, "#{link}")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
text
|
||
|
end
|
||
|
|
||
|
# TODO: This is quite hacky and is only here to support a single
|
||
|
# attachment for our OpsGenie integration. In future we would
|
||
|
# want to iterate through this attachments array and extract
|
||
|
# things properly.
|
||
|
#
|
||
|
# See https://api.slack.com/reference/messaging/attachments for
|
||
|
# more details on what fields are here.
|
||
|
def process_legacy_attachments(attachments)
|
||
|
text = CGI.unescape(attachments[0][:fallback])
|
||
|
process_text(text)
|
||
|
end
|
||
|
end
|
||
|
end
|