diff --git a/README.md b/README.md index b0f64c1..7d04efd 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,7 @@ class Telegram::WebhookController < Telegram::Bot::UpdatesController # do_smth_with(data) # There are `chat` & `from` shortcut methods. + # For callback queries `chat` if taken from `message` when it's available. response = from ? "Hello #{from['username']}!" : 'Hi there!' # There is `respond_with` helper to set `chat_id` from received message: respond_with :message, text: response diff --git a/lib/telegram/bot/updates_controller.rb b/lib/telegram/bot/updates_controller.rb index 9398076..a1fb482 100644 --- a/lib/telegram/bot/updates_controller.rb +++ b/lib/telegram/bot/updates_controller.rb @@ -141,10 +141,12 @@ module Telegram @_payload, @_payload_type = payload_data end - # Accessor to `'chat'` field of payload. Can be overriden with `chat` option - # for #initialize. + # Accessor to `'chat'` field of payload. Also tries `'chat'` in `'message'` + # when there is no such field in payload. + # + # Can be overriden with `chat` option for #initialize. def chat - @_chat ||= payload && payload['chat'] + @_chat ||= payload.try! { |x| x['chat'] || x['message'] && x['message']['chat'] } end # Accessor to `'from'` field of payload. Can be overriden with `from` option diff --git a/spec/telegram/bot/updates_controller_spec.rb b/spec/telegram/bot/updates_controller_spec.rb index 04e6a5c..cf57834 100644 --- a/spec/telegram/bot/updates_controller_spec.rb +++ b/spec/telegram/bot/updates_controller_spec.rb @@ -293,4 +293,49 @@ RSpec.describe Telegram::Bot::UpdatesController do end end end + + describe '#chat' do + subject { controller.chat } + let(:payload_type) { :message } + let(:payload) { {chat: 'test_value'} } + it { should eq payload[:chat] } + + context 'when payload is not set' do + let(:payload) {} + it { should eq nil } + end + + context 'when payload has no such field' do + let(:payload) { {smth: 'other'} } + it { should eq nil } + + context 'but has `message`' do + let(:payload) { {message: message} } + let(:message) { {text: 'Hello bot!'} } + it { should eq nil } + + context 'with `chat` set' do + let(:message) { super().merge(chat: 'test value') } + it { should eq message[:chat] } + end + end + end + end + + describe '#from' do + subject { controller.from } + let(:payload_type) { :message } + let(:payload) { {from: 'test_value'} } + it { should eq payload[:from] } + + context 'when payload is not set' do + let(:payload) {} + it { should eq nil } + end + + context 'when payload has no such field' do + let(:payload) { {smth: 'other'} } + it { should eq nil } + end + end end