diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a33d86..5f486d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Unreleased +- Update to Bot API 7.0 - Add `# frozen_string_literal: true` to all source files. # 0.16.1 diff --git a/lib/telegram/bot/client/api_methods.txt b/lib/telegram/bot/client/api_methods.txt index 42e42e3..fd5a489 100644 --- a/lib/telegram/bot/client/api_methods.txt +++ b/lib/telegram/bot/client/api_methods.txt @@ -1,5 +1,5 @@ # Generated with bin/fetch-telegram-methods -# Bot API 6.8 +# Bot API 7.0 getUpdates setWebhook @@ -11,7 +11,9 @@ logOut close sendMessage forwardMessage +forwardMessages copyMessage +copyMessages sendPhoto sendAudio sendDocument @@ -26,6 +28,7 @@ sendContact sendPoll sendDice sendChatAction +setMessageReaction getUserProfilePhotos getFile banChatMember @@ -70,6 +73,7 @@ hideGeneralForumTopic unhideGeneralForumTopic unpinAllGeneralForumTopicMessages answerCallbackQuery +getUserChatBoosts setMyCommands deleteMyCommands getMyCommands @@ -92,6 +96,7 @@ stopMessageLiveLocation editMessageReplyMarkup stopPoll deleteMessage +deleteMessages sendSticker getStickerSet diff --git a/lib/telegram/bot/updates_controller.rb b/lib/telegram/bot/updates_controller.rb index 5520bc8..2dba9ad 100644 --- a/lib/telegram/bot/updates_controller.rb +++ b/lib/telegram/bot/updates_controller.rb @@ -89,11 +89,13 @@ class UpdatesController < AbstractController::Base # rubocop:disable Metrics/Cla extend Session::ConfigMethods - PAYLOAD_TYPES = %w[ + PAYLOAD_TYPES = Set.new(%w[ message edited_message channel_post edited_channel_post + message_reaction + message_reaction_count inline_query chosen_inline_result callback_query @@ -104,7 +106,9 @@ class UpdatesController < AbstractController::Base # rubocop:disable Metrics/Cla my_chat_member chat_member chat_join_request - ].freeze + chat_boost + removed_chat_boost + ].freeze) class << self # Initialize controller and process update. @@ -113,9 +117,28 @@ def dispatch(*args) end def payload_from_update(update) - update && PAYLOAD_TYPES.find do |type| - item = update[type] - return [item, type] if item + case update + when nil then nil + when Hash + # faster lookup for the case when telegram-bot-types is not used + update.find do |type, item| + return [item, type] if PAYLOAD_TYPES.include?(type) + end + else + payload_from_typed_update(update) + end + end + + private + + def payload_from_typed_update(update) + PAYLOAD_TYPES.find do |type| + begin + item = update[type] + return [item, type] if item + rescue Exception # rubocop:disable Lint/RescueException + # dry-rb raises exception if field is not defined in schema + end end end end diff --git a/spec/telegram/bot/updates_controller/typed_update_spec.rb b/spec/telegram/bot/updates_controller/typed_update_spec.rb index 877ce3b..1f2018b 100644 --- a/spec/telegram/bot/updates_controller/typed_update_spec.rb +++ b/spec/telegram/bot/updates_controller/typed_update_spec.rb @@ -18,6 +18,12 @@ my_chat_member chat_member chat_join_request + + # TODO: remove when added to telegram-bot-types + message_reaction + message_reaction_count + chat_boost + removed_chat_boost ]). map { |x| [x, Telegram::Bot::Types.const_get(x.camelize)] }.to_h. merge(