Module: CollavreSlack::MentionMapping
- Defined in:
- app/services/collavre_slack/mention_mapping.rb
Constant Summary collapse
- SLACK_MENTION_REGEX =
/<@([A-Z0-9]+)>/.freeze
- COLLABRE_MENTION_REGEX =
/@([^:]+):/.freeze
Class Method Summary collapse
- .fetch_slack_display_name(slack_account, slack_user_id) ⇒ Object
- .from_slack(text, slack_account) ⇒ Object
- .to_slack(text, slack_account) ⇒ Object
Class Method Details
.fetch_slack_display_name(slack_account, slack_user_id) ⇒ Object
23 24 25 26 27 28 29 |
# File 'app/services/collavre_slack/mention_mapping.rb', line 23 def self.fetch_slack_display_name(slack_account, slack_user_id) client = SlackClient.new(access_token: slack_account.access_token) client.get_user_display_name(user_id: slack_user_id) rescue StandardError => e Rails.logger.warn("[CollavreSlack] Failed to fetch Slack user info: #{e.}") nil end |
.from_slack(text, slack_account) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'app/services/collavre_slack/mention_mapping.rb', line 6 def self.from_slack(text, slack_account) return text if text.blank? text.gsub(SLACK_MENTION_REGEX) do |match| slack_user_id = Regexp.last_match(1) mapping = slack_account.slack_user_mappings.includes(:collavre_user).find_by(slack_user_id: slack_user_id) if mapping "@#{mapping.collavre_user.name}:" else # Fetch display name from Slack API for unmapped users display_name = fetch_slack_display_name(slack_account, slack_user_id) display_name ? "@#{display_name}:" : match end end end |
.to_slack(text, slack_account) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'app/services/collavre_slack/mention_mapping.rb', line 31 def self.to_slack(text, slack_account) return text if text.blank? mappings = slack_account.slack_user_mappings.includes(:collavre_user).to_a by_name = mappings.index_by { |mapping| mapping.collavre_user.name.to_s.downcase } by_email = mappings.index_by { |mapping| mapping.collavre_user.email.to_s.downcase } text.gsub(COLLABRE_MENTION_REGEX) do |match| key = Regexp.last_match(1).to_s.downcase mapping = by_name[key] || by_email[key] mapping ? "<@#{mapping.slack_user_id}>" : match end end |