From c0d9533b3a3a5bfb07584ff23cc68290ff939021 Mon Sep 17 00:00:00 2001 From: Uchkun Rakhimov Date: Wed, 11 Jun 2025 02:31:28 +0500 Subject: [PATCH] feat: add support for telegram circular video messages (#11504) This PR adds support for handling Telegram's video_note messages (circular video messages), which are commonly used for short voice-style video replies in messaging. Fixes: #11503 Co-authored-by: Sojan Jose --- .../telegram/incoming_message_service.rb | 23 ++++++++++++--- .../telegram/incoming_message_service_spec.rb | 29 +++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/app/services/telegram/incoming_message_service.rb b/app/services/telegram/incoming_message_service.rb index e337a03f6..3a186676e 100644 --- a/app/services/telegram/incoming_message_service.rb +++ b/app/services/telegram/incoming_message_service.rb @@ -94,13 +94,25 @@ class Telegram::IncomingMessageService end def file_content_type - return :image if params[:message][:photo].present? || params.dig(:message, :sticker, :thumb).present? - return :audio if params[:message][:voice].present? || params[:message][:audio].present? - return :video if params[:message][:video].present? + return :image if image_message? + return :audio if audio_message? + return :video if video_message? file_type(params[:message][:document][:mime_type]) end + def image_message? + params[:message][:photo].present? || params.dig(:message, :sticker, :thumb).present? + end + + def audio_message? + params[:message][:voice].present? || params[:message][:audio].present? + end + + def video_message? + params[:message][:video].present? || params[:message][:video_note].present? + end + def attach_files return unless file @@ -174,6 +186,9 @@ class Telegram::IncomingMessageService end def visual_media_params - params[:message][:photo].presence&.last || params.dig(:message, :sticker, :thumb).presence || params[:message][:video].presence + params[:message][:photo].presence&.last || + params.dig(:message, :sticker, :thumb).presence || + params[:message][:video].presence || + params[:message][:video_note].presence end end diff --git a/spec/services/telegram/incoming_message_service_spec.rb b/spec/services/telegram/incoming_message_service_spec.rb index 0702baa32..78a8e9d7c 100644 --- a/spec/services/telegram/incoming_message_service_spec.rb +++ b/spec/services/telegram/incoming_message_service_spec.rb @@ -179,6 +179,35 @@ describe Telegram::IncomingMessageService do end end + context 'when valid video_note messages params' do + it 'creates appropriate conversations, message and contacts' do + allow(telegram_channel.inbox.channel).to receive(:get_telegram_file_path).and_return('https://chatwoot-assets.local/sample.mov') + params = { + 'update_id' => 2_342_342_343_242, + 'message' => { + 'video_note' => { + 'duration' => 3, + 'length' => 240, + 'thumb' => { + 'file_id' => 'AAMCBQADGQEAA4ZhXd78Xz6_c6gCzbdIkgGiXJcwwwACqwMAAp3x8Fbhf3EWamgCWAEAB20AAyEE', + 'file_unique_id' => 'AQADqwMAAp3x8FZy', + 'file_size' => 11_462, + 'width' => 240, + 'height' => 240 + }, + 'file_id' => 'DQACAgUAAxkBAAIBY2FdJlhf8PC2E3IalXSvXWO5m8GBAALJAwACwqHgVhb0truM0uhwIQQ', + 'file_unique_id' => 'AgADyQMAAsKh4FY', + 'file_size' => 132_446 + } + }.merge(message_params) + }.with_indifferent_access + described_class.new(inbox: telegram_channel.inbox, params: params).perform + expect(telegram_channel.inbox.conversations.count).not_to eq(0) + expect(Contact.all.first.name).to eq('Sojan Jose') + expect(telegram_channel.inbox.messages.first.attachments.first.file_type).to eq('video') + end + end + context 'when valid voice attachment params' do it 'creates appropriate conversations, message and contacts' do allow(telegram_channel.inbox.channel).to receive(:get_telegram_file_path).and_return('https://chatwoot-assets.local/sample.ogg')