# frozen_string_literal: true module DiscourseChatIntegration::Provider::SlackProvider class SlackMessage def initialize(raw_message, transcript) @raw = raw_message @transcript = transcript end def username if user user["_transcript_username"] elsif @raw.key?("username") # This is for bot messages @raw["username"].gsub(' ', '_') end end def avatar user["profile"]["image_24"] if user end def url channel_id = @transcript.channel_id ts = @raw['ts'].gsub('.', '') "https://slack.com/archives/#{channel_id}/p#{ts}" end def text text = @raw['text'].nil? ? "" : @raw['text'] pre = {} # Extract code blocks and replace with placeholder text = text.gsub(/```(.*?)```/m) do |match| key = "pre:" + SecureRandom.alphanumeric(50) pre[key] = HTMLEntities.new.decode $1 "\n```\n#{key}\n```\n" end # # Extract inline code and replace with placeholder text = text.gsub(/(?/) do |match| group = $1 parts = group.split('|') link = parts[0].start_with?('@', '#', '!') ? nil : parts[0] text = parts.length > 1 ? parts[1] : parts[0] if parts[0].start_with?('@') user_id = parts[0][1..-1] if user = @transcript.users[user_id] user_name = user['_transcript_username'] else user_name = user_id end next "@#{user_name}" end if link.nil? text elsif link == text "<#{link}>" else "[#{text}](#{link})" end end # Add an extra * to each side for bold text = text.gsub(/\*.*?\*/) do |match| "*#{match}*" end # Add an extra ~ to each side for strikethrough text = text.gsub(/~.*?~/) do |match| "~#{match}~" end # Replace emoji - with _ text = text.gsub(/:[a-z0-9_-]+:/) do |match| match.gsub("-") { "_" } end # Restore pre-formatted code block content pre.each do |key, value| text = text.gsub(key) { value } end text end def attachments_string string = "" string += "\n" if !attachments.empty? attachments.each do |attachment| string += " - #{attachment}\n" end string end def processed_text_with_attachments self.text + attachments_string end def raw_text raw_text = @raw['text'].nil? ? "" : @raw['text'] raw_text += attachments_string raw_text end def attachments attachments = [] return attachments unless @raw.key?('attachments') @raw["attachments"].each do |attachment| next unless attachment.key?("fallback") attachments << attachment["fallback"] end attachments end def ts @raw["ts"] end private def user return nil unless user_id = @raw["user"] @transcript.users[user_id] end end end