discourse/plugins/chat/lib/slack_compatibility.rb

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