From 5f503b1a57076504d2075c3f74f4e78bf8949be1 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Thu, 16 Nov 2023 12:59:52 +0530 Subject: [PATCH] feat: Change slack bot and activity message appearance (#8349) --- .../slack/send_on_slack_service.rb | 18 +++++++++++--- public/integrations/slack/bot.png | Bin 0 -> 2165 bytes public/integrations/slack/system.png | Bin 0 -> 8123 bytes .../slack/send_on_slack_service_spec.rb | 22 ++++++++++++++++-- 4 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 public/integrations/slack/bot.png create mode 100644 public/integrations/slack/system.png diff --git a/lib/integrations/slack/send_on_slack_service.rb b/lib/integrations/slack/send_on_slack_service.rb index fc7ffe5ab..c840dd1d9 100644 --- a/lib/integrations/slack/send_on_slack_service.rb +++ b/lib/integrations/slack/send_on_slack_service.rb @@ -44,7 +44,7 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService def message_content private_indicator = message.private? ? 'private: ' : '' - sanitized_content = ActionView::Base.full_sanitizer.sanitize(message_text) + sanitized_content = ActionView::Base.full_sanitizer.sanitize(format_message_content) if conversation.identifier.present? "#{private_indicator}#{sanitized_content}" @@ -53,6 +53,10 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService end end + def format_message_content + message.message_type == 'activity' ? "_#{message_text}_" : message_text + end + def message_text if message.content.present? message.content.gsub(MENTION_REGEX, '\1') @@ -79,7 +83,7 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService end def avatar_url(sender) - sender_type = sender.instance_of?(Contact) ? 'contact' : 'user' + sender_type = sender_type(sender).downcase blob_key = sender&.avatar&.attached? ? sender.avatar.blob.key : nil generate_url(sender_type, blob_key) end @@ -137,7 +141,15 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService end def sender_type(sender) - sender.instance_of?(Contact) ? 'Contact' : 'Agent' + if sender.instance_of?(Contact) + 'Contact' + elsif message.message_type == 'template' && sender.nil? + 'Bot' + elsif message.message_type == 'activity' && sender.nil? + 'System' + else + 'Agent' + end end def update_reference_id diff --git a/public/integrations/slack/bot.png b/public/integrations/slack/bot.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5a2d686e7f86f29e4fac5142bffac3afaecb0a GIT binary patch literal 2165 zcmV-*2#WWKP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91GoS+i1ONa40RR91GXMYp0M89gSO5SA-$_J4RA>dw8e41>RrK81M|VpL z6jBAH3RI{xJfb0}5ik&Ax`s-8&@M_*5;S~if>DD3T|+SR#~A-4#G0V6R1gt@B`PRr zC4_*Y;blQu-cS@MbRXTF>p8QXb#``U=iZ@EPtwkPoO>SkaUS+_HkdwiTFc2 z4bvHeYT&#I7z_u_O7S~@bBHs>y8zfF4*VE?k1)nsOIgvbFY4I!z7T`m3=vY`)bT_O zSJnBz*pr;|VrhDer5J}@IBt!iZtjtrJ`JKsF z{4?B2kBbt&X*|Xb`@l1IYuNvr2rVIHLK~6~sHybkzT8qG!ewyS4aSuDE#aasoyI6m z2sP2}IXspAsecq9>G%K+>V{A>_73iff|Fmc6BT)b18YP@3gS6UNT2mHw)Th$vzt>{T-3CJ$F| z5{x}^Wz2`>QK-YT46!YKMbxht*^nZQGyG6pZnCpRB*Aj~RTWuDI~;N^oPP&`JV%dLRAab76HxJ?%D$W$w6#j0cn){gON{zG=02z~(V zHN|=^pi)79b(icw@*`Go@S+MkF`W4e9b+NrMCVFj&o5_Gu)>^HVNJgfO-$l^I1j7@ z@39Kw8G6aHlS4E^0zg zZ~;Dc{Ba7|CA&_mc8Y#)2gvflv#+8xqf2aYpfLV+fHWTl9k|ok5j?uW^0hmdU7gSY zyxdr_Goe?r-=$NFVCsm%XNr(1?~wsKDn~E^V68HP&SPRl`G^zHZB41gzQ4P~{>-(HDfeLXI1m-1o19Um3lJ+h zt*6rxdnH3bQTPsRnlMxQ9?#B9E5cT7B^Yfq)drx{?>x&^;|sO*q&Y0ymdK{og>dyg zl%n(DVL{A_GO$MP5cyKhL6?2E0=BfJr4%6<@bWksnZZ(;GW23a4?Qx%Z91BQednCF zn+(lkf2;86K{wf%w~6>@%Fxpr+KxsU#uTx<-i;F>-iscLI`<^MhM#)Aq1` zKgpnPGoYt8te=$;tQ#khQr-RMB_%L1p%r=U+c;iDnL3=RWVk%a5*;n)1c%ngURG7U zO79f?QmRX#3?){SkB9;tb~+=pwPaU>c%WPPxFsB1r1Q(+Jg1p^uBq|gG5j5;BglLy zL!`ut@(~K-?ST9UncwwzMXO&3+Tq%_vl|{y;J$5j?7WVX$8lCPIjM)Ie?}W29DM4; zj9B*>5D!FJ;D7 zY!3&Qnt5jpfU$!fL$M=bZ2RAo8GO}JA6RB3kEJq%xUD|098cI=rI((EBj0M9KN_BrAqLzLcg;SIurP8{Q^44)o2vZUiAau8KJFZw<5Yk zLdp;_y&=-m8?NsNeekXS(hnN=LbKJf<7>Ok%mcR8`SlgmG()a`d1R(*S*Kq* zp+h7;BB}_{5ndT1Q+j&i_+mv5J-GE;T|XM>8OtcpCJIqn>HsVT9(qC>lN0D!fo|jJ5*u+UtyYb0QIKl~ rh2 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 literal 0 HcmV?d00001 diff --git a/spec/lib/integrations/slack/send_on_slack_service_spec.rb b/spec/lib/integrations/slack/send_on_slack_service_spec.rb index aa0f37bde..3474cbfcd 100644 --- a/spec/lib/integrations/slack/send_on_slack_service_spec.rb +++ b/spec/lib/integrations/slack/send_on_slack_service_spec.rb @@ -183,11 +183,11 @@ describe Integrations::Slack::SendOnSlackService do it 'sent a template message on slack' do builder = described_class.new(message: template_message, hook: hook) allow(builder).to receive(:slack_client).and_return(slack_client) - + template_message.update!(sender: nil) expect(slack_client).to receive(:chat_postMessage).with( channel: hook.reference_id, text: template_message.content, - username: "#{template_message.sender.name} (Contact)", + username: 'Bot', thread_ts: conversation.identifier, icon_url: anything, unfurl_links: true @@ -198,6 +198,24 @@ describe Integrations::Slack::SendOnSlackService do expect(template_message.external_source_id_slack).to eq 'cw-origin-6789.12345' end + it 'sent a activity message on slack' do + template_message.update!(message_type: :activity) + template_message.update!(sender: nil) + builder = described_class.new(message: template_message, hook: hook) + allow(builder).to receive(:slack_client).and_return(slack_client) + expect(slack_client).to receive(:chat_postMessage).with( + channel: hook.reference_id, + text: "_#{template_message.content}_", + username: 'System', + thread_ts: conversation.identifier, + icon_url: anything, + unfurl_links: true + ).and_return(slack_message) + + builder.perform + expect(template_message.external_source_id_slack).to eq 'cw-origin-6789.12345' + end + it 'disables hook on Slack AccountInactive error' do expect(slack_client).to receive(:chat_postMessage).with( channel: hook.reference_id,