diff --git a/app/models/channel/telegram.rb b/app/models/channel/telegram.rb index 94780cce4..d8d25ae97 100644 --- a/app/models/channel/telegram.rb +++ b/app/models/channel/telegram.rb @@ -149,12 +149,29 @@ class Channel::Telegram < ApplicationRecord }) end + def convert_markdown_to_telegram(text) + # Convert bold - double asterisks to single asterisk in Telegram + text.gsub!(/\*\*(.*?)\*\*/, '*\1*') + + # Convert italics - single underscore (same in both CommonMark and Telegram) + # No conversion needed for italics as both use _text_ + + # Convert underline - not typically used in CommonMark, so we'll leave it as is + + # Convert strikethrough - double tilde to single tilde in Telegram + text.gsub!(/~~(.*?)~~/, '~\1~') + + text + end + def message_request(chat_id, text, reply_markup = nil, reply_to_message_id = nil) + text_to_md = convert_markdown_to_telegram(text) HTTParty.post("#{telegram_api_url}/sendMessage", body: { chat_id: chat_id, - text: text, + text: text_to_md, reply_markup: reply_markup, + parse_mode: 'MarkdownV2', reply_to_message_id: reply_to_message_id }) end diff --git a/spec/models/channel/telegram_spec.rb b/spec/models/channel/telegram_spec.rb index 6ed932de7..6b53b59d0 100644 --- a/spec/models/channel/telegram_spec.rb +++ b/spec/models/channel/telegram_spec.rb @@ -10,7 +10,24 @@ RSpec.describe Channel::Telegram do stub_request(:post, "https://api.telegram.org/bot#{telegram_channel.bot_token}/sendMessage") .with( - body: 'chat_id=123&text=test&reply_markup=&reply_to_message_id=' + body: 'chat_id=123&text=test&reply_markup=&parse_mode=MarkdownV2&reply_to_message_id=' + ) + .to_return( + status: 200, + body: { result: { message_id: 'telegram_123' } }.to_json, + headers: { 'Content-Type' => 'application/json' } + ) + + expect(telegram_channel.send_message_on_telegram(message)).to eq('telegram_123') + end + + it 'send message with markdown converted to telegram markdown' do + message = create(:message, message_type: :outgoing, content: '**test** ~~test~~ *test* ~test~', + conversation: create(:conversation, inbox: telegram_channel.inbox, additional_attributes: { 'chat_id' => '123' })) + + stub_request(:post, "https://api.telegram.org/bot#{telegram_channel.bot_token}/sendMessage") + .with( + body: "chat_id=123&text=#{ERB::Util.url_encode('*test* ~test~ *test* ~test~')}&reply_markup=&parse_mode=MarkdownV2&reply_to_message_id=" ) .to_return( status: 200, @@ -32,7 +49,7 @@ RSpec.describe Channel::Telegram do .with( body: 'chat_id=123&text=test' \ '&reply_markup=%7B%22one_time_keyboard%22%3Atrue%2C%22inline_keyboard%22%3A%5B%5B%7B%22text%22%3A%22test%22%2C%22' \ - 'callback_data%22%3A%22test%22%7D%5D%5D%7D&reply_to_message_id=' + 'callback_data%22%3A%22test%22%7D%5D%5D%7D&parse_mode=MarkdownV2&reply_to_message_id=' ) .to_return( status: 200, @@ -49,7 +66,7 @@ RSpec.describe Channel::Telegram do stub_request(:post, "https://api.telegram.org/bot#{telegram_channel.bot_token}/sendMessage") .with( - body: 'chat_id=123&text=test&reply_markup=&reply_to_message_id=' + body: 'chat_id=123&text=test&reply_markup=&parse_mode=MarkdownV2&reply_to_message_id=' ) .to_return( status: 403,