# frozen_string_literal: true ## # Processes slack-formatted text messages, as Mattermost does with # Slack incoming webhook interoperability, for example links in the # format and , and 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") text = text.gsub("", "@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