From 668ea399eb67e7253c105c9cc9d3d1231b7a10d7 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 20 Dec 2023 17:35:18 +0300 Subject: [PATCH] Add "message_reaction" updates. --- telegram-bot-api/Client.cpp | 53 +++++++++++++++++++++++++++++++++++++ telegram-bot-api/Client.h | 11 +++++--- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/telegram-bot-api/Client.cpp b/telegram-bot-api/Client.cpp index 2a2b679..1a3a82e 100644 --- a/telegram-bot-api/Client.cpp +++ b/telegram-bot-api/Client.cpp @@ -3571,6 +3571,41 @@ class Client::JsonGameHighScore final : public td::Jsonable { const Client *client_; }; +class Client::JsonMessageReactionUpdated final : public td::Jsonable { + public: + JsonMessageReactionUpdated(const td_api::updateMessageReaction *update, const Client *client) + : update_(update), client_(client) { + } + void store(td::JsonValueScope *scope) const { + auto object = scope->enter_object(); + object("chat", JsonChat(update_->chat_id_, client_)); + object("message_id", as_client_message_id(update_->message_id_)); + switch (update_->actor_id_->get_id()) { + case td_api::messageSenderUser::ID: { + auto user_id = static_cast(update_->actor_id_.get())->user_id_; + object("user", JsonUser(user_id, client_)); + break; + } + case td_api::messageSenderChat::ID: { + auto actor_chat_id = static_cast(update_->actor_id_.get())->chat_id_; + object("actor_chat", JsonChat(actor_chat_id, client_)); + break; + } + default: + UNREACHABLE(); + } + object("date", update_->date_); + object("old_reaction", td::json_array(update_->old_reaction_types_, + [](const auto &reaction) { return JsonReactionType(reaction.get()); })); + object("new_reaction", td::json_array(update_->new_reaction_types_, + [](const auto &reaction) { return JsonReactionType(reaction.get()); })); + } + + private: + const td_api::updateMessageReaction *update_; + const Client *client_; +}; + class Client::JsonUpdateTypes final : public td::Jsonable { public: explicit JsonUpdateTypes(td::uint32 update_types) : update_types_(update_types) { @@ -6837,6 +6872,9 @@ void Client::on_update(object_ptr result) { case td_api::updateChatBoost::ID: add_update_chat_boost(move_object_as(result)); break; + case td_api::updateMessageReaction::ID: + add_update_message_reaction(move_object_as(result)); + break; case td_api::updateConnectionState::ID: { auto update = move_object_as(result); if (update->state_->get_id() == td_api::connectionStateReady::ID) { @@ -13074,6 +13112,8 @@ td::Slice Client::get_update_type_name(UpdateType update_type) { return td::Slice("chat_boost"); case UpdateType::ChatBoostRemoved: return td::Slice("removed_chat_boost"); + case UpdateType::MessageReaction: + return td::Slice("message_reaction"); default: UNREACHABLE(); return td::Slice(); @@ -13398,6 +13438,19 @@ void Client::add_update_chat_boost(object_ptr &&update) } } +void Client::add_update_message_reaction(object_ptr &&update) { + CHECK(update != nullptr); + auto left_time = update->date_ + 86400 - get_unix_time(); + if (left_time > 0) { + auto webhook_queue_id = update->chat_id_ + (static_cast(8) << 33); + add_update(UpdateType::MessageReaction, JsonMessageReactionUpdated(update.get(), this), left_time, + webhook_queue_id); + } else { + LOG(DEBUG) << "Skip updateMessageReaction with date " << update->date_ << ", because current date is " + << get_unix_time(); + } +} + td::int64 Client::choose_added_member_id(const td_api::messageChatAddMembers *message_add_members) const { CHECK(message_add_members != nullptr); for (auto &member_user_id : message_add_members->member_user_ids_) { diff --git a/telegram-bot-api/Client.h b/telegram-bot-api/Client.h index 01b602a..ab1f33e 100644 --- a/telegram-bot-api/Client.h +++ b/telegram-bot-api/Client.h @@ -173,6 +173,7 @@ class Client final : public WebhookActor::Callback { class JsonForumTopicEdited; class JsonForumTopicInfo; class JsonGameHighScore; + class JsonMessageReactionUpdated; class JsonAddress; class JsonOrderInfo; class JsonSuccessfulPaymentBot; @@ -1126,6 +1127,8 @@ class Client final : public WebhookActor::Callback { void add_update_chat_boost(object_ptr &&update); + void add_update_message_reaction(object_ptr &&update); + // append only before Size enum class UpdateType : int32 { Message, @@ -1146,6 +1149,7 @@ class Client final : public WebhookActor::Callback { ChatJoinRequest, ChatBoostUpdated, ChatBoostRemoved, + MessageReaction, Size }; @@ -1175,9 +1179,10 @@ class Client final : public WebhookActor::Callback { bool have_message_access(int64 chat_id) const; - // by default ChatMember updates are disabled - static constexpr td::uint32 DEFAULT_ALLOWED_UPDATE_TYPES = - (1 << static_cast(UpdateType::Size)) - 1 - (1 << static_cast(UpdateType::ChatMember)); + // by default ChatMember and MessageReaction updates are disabled + static constexpr td::uint32 DEFAULT_ALLOWED_UPDATE_TYPES = (1 << static_cast(UpdateType::Size)) - 1 - + (1 << static_cast(UpdateType::ChatMember)) - + (1 << static_cast(UpdateType::MessageReaction)); object_ptr authorization_state_; bool was_authorized_ = false;