fix: render slack emoji shortcodes as unicode characters (#12928)

This PR fixes an issue where Slack emojis are rendered as text
shortcodes (e.g. 🚀) instead of the actual emoji characters in
Chatwoot messages.

It introduces a new EmojiFormatter class that uses the emoji-data
mapping to convert shortcodes to unicode characters.

---------

Co-authored-by: Sony Mathew <sony@chatwoot.com>
Co-authored-by: Sony Mathew <2040199+sony-mathew@users.noreply.github.com>
This commit is contained in:
Lomuzord
2026-04-29 23:19:52 +05:30
committed by GitHub
co-authored by Sony Mathew Sony Mathew
parent bcdb73502e
commit 80fccbc526
5 changed files with 45 additions and 1 deletions
+16
View File
@@ -0,0 +1,16 @@
# frozen_string_literal: true
class Integrations::Slack::EmojiFormatter
def self.format(text)
return text if text.blank?
text.gsub(/:([a-zA-Z0-9_+-]+):/) do |match|
short_code = Regexp.last_match(1)
# gemoji exposes find_by_alias; Rails/DynamicFindBy is a false positive because Emoji is not an ActiveRecord model.
# rubocop:disable Rails/DynamicFindBy
emoji = Emoji.find_by_alias(short_code)
# rubocop:enable Rails/DynamicFindBy
emoji ? emoji.raw : match
end
end
end
@@ -35,7 +35,7 @@ module Integrations::Slack::SlackMessageHelper
message_type: :outgoing,
account_id: conversation.account_id,
inbox_id: conversation.inbox_id,
content: Slack::Messages::Formatting.unescape(params[:event][:text] || ''),
content: formatted_message_content,
external_source_id_slack: params[:event][:ts],
private: private_note?,
sender: resolved_sender,
@@ -104,6 +104,11 @@ module Integrations::Slack::SlackMessageHelper
[nil, nil, nil]
end
def formatted_message_content
text = Slack::Messages::Formatting.unescape(params[:event][:text] || '')
Integrations::Slack::EmojiFormatter.format(text)
end
def private_note?
params[:event][:text].strip.downcase.starts_with?('note:', 'private:')
end