From 17f4f0a42de9aa1283f4b0b0becb6bb1c01f964e Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 1 May 2026 18:43:14 +0300 Subject: [PATCH] Add "guest_message" updates. --- telegram-bot-api/Client.cpp | 67 +++++++++++++++++++++++++++++++++++++ telegram-bot-api/Client.h | 19 +++++++++++ 2 files changed, 86 insertions(+) diff --git a/telegram-bot-api/Client.cpp b/telegram-bot-api/Client.cpp index bfa1928..2571f5c 100644 --- a/telegram-bot-api/Client.cpp +++ b/telegram-bot-api/Client.cpp @@ -4094,6 +4094,9 @@ void Client::JsonMessage::store(td::JsonValueScope *scope) const { if (message_->media_album_id != 0) { object("media_group_id", td::to_string(message_->media_album_id)); } + if (message_->guest_query_id != 0) { + object("guest_query_id", td::to_string(message_->guest_query_id)); + } switch (message_->content->get_id()) { case td_api::messageText::ID: { auto content = static_cast(message_->content.get()); @@ -9053,6 +9056,9 @@ void Client::on_update(object_ptr result) { case td_api::updateBusinessMessagesDeleted::ID: add_update_business_messages_deleted(move_object_as(result)); break; + case td_api::updateNewGuestQuery::ID: + add_new_guest_query(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) { @@ -16591,6 +16597,8 @@ td::Slice Client::get_update_type_name(UpdateType update_type) { return td::Slice("purchased_paid_media"); case UpdateType::ManagedBot: return td::Slice("managed_bot"); + case UpdateType::GuestMessage: + return td::Slice("guest_message"); default: UNREACHABLE(); return td::Slice(); @@ -17081,6 +17089,18 @@ void Client::add_business_message_edited(object_ptrconnection_id_, 0); } +void Client::add_new_guest_query(object_ptr &&update) { + CHECK(update != nullptr); + auto message_info = create_message(std::move(update->message_)); + message_info->reference_messages = + transform(std::move(update->reference_messages_), + [&](object_ptr &&message) { return create_message(std::move(message)); }); + message_info->guest_query_id = update->id_; + auto chat_id = message_info->chat_id; + new_guest_query_queues_[chat_id].queue_.emplace(std::move(message_info)); + process_new_guest_query_queue(chat_id, 0); +} + 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_) { @@ -17584,6 +17604,9 @@ td::vector Client::get_message_sticker_set_ids(const MessageInfo *mes if (message_info->business_reply_to_message != nullptr) { td::combine(sticker_set_ids, get_message_sticker_set_ids(message_info->business_reply_to_message.get())); } + for (const auto &reference_message : message_info->reference_messages) { + td::combine(sticker_set_ids, get_message_sticker_set_ids(reference_message.get())); + } return sticker_set_ids; } @@ -17704,6 +17727,50 @@ void Client::process_new_business_message_queue(const td::string &connection_id, new_business_message_queues_.erase(connection_id); } +void Client::process_new_guest_query_queue(int64 chat_id, int state) { + auto &queue = new_guest_query_queues_[chat_id]; + if (queue.has_active_request_) { + if (state != 0) { + queue.has_active_request_ = false; + } else { + return; + } + } else { + CHECK(state == 0); + } + if (logging_out_ || closing_) { + new_guest_query_queues_.erase(chat_id); + return; + } + while (!queue.queue_.empty()) { + auto &query = queue.queue_.front(); + if (state == 0) { + auto sticker_set_ids = get_message_sticker_set_ids(query.message_info_.get()); + if (!sticker_set_ids.empty()) { + queue.has_active_request_ = true; + return get_sticker_set_names(std::move(sticker_set_ids), + td::PromiseCreator::lambda([actor_id = actor_id(this), chat_id](td::Unit) { + send_closure(actor_id, &Client::process_new_guest_query_queue, chat_id, 1); + })); + } + state = 1; + } + CHECK(state == 1); + + auto message_info = std::move(query.message_info_); + queue.queue_.pop(); + + state = 0; + if (need_skip_update_message(0, message_info.get(), false)) { + continue; + } + + auto webhook_queue_id = message_info->chat_id + (static_cast(12) << 33); + add_message_update(UpdateType::GuestMessage, message_info.get(), webhook_queue_id); + } + new_guest_query_queues_.erase(chat_id); +} + td::unique_ptr Client::delete_message(int64 chat_id, int64 message_id, bool only_from_cache) { auto message_info = std::move(messages_[{chat_id, message_id}]); if (message_info == nullptr) { diff --git a/telegram-bot-api/Client.h b/telegram-bot-api/Client.h index c5c81ec..eec7c69 100644 --- a/telegram-bot-api/Client.h +++ b/telegram-bot-api/Client.h @@ -1140,10 +1140,12 @@ class Client final : public WebhookActor::Callback { int32 initial_send_date = 0; int32 sender_boost_count = 0; int64 paid_message_star_count = 0; + int64 guest_query_id = 0; object_ptr forward_origin; td::string author_signature; td::string sender_tag; td::unique_ptr business_reply_to_message; + td::vector> reference_messages; object_ptr reply_to_message; object_ptr reply_to_story; object_ptr topic_id; @@ -1248,6 +1250,10 @@ class Client final : public WebhookActor::Callback { void process_new_business_message_queue(const td::string &connection_id, int state); + void add_new_guest_query(object_ptr &&update); + + void process_new_guest_query_queue(int64 chat_id, int state); + struct MessageFullId { int64 chat_id; int64 message_id; @@ -1385,6 +1391,7 @@ class Client final : public WebhookActor::Callback { BusinessMessagesDeleted, PurchasedPaidMedia, ManagedBot, + GuestMessage, Size }; @@ -1513,6 +1520,18 @@ class Client final : public WebhookActor::Callback { }; td::FlatHashMap new_business_message_queues_; // connection_id -> queue + struct NewGuestQuery { + td::unique_ptr message_info_; + + explicit NewGuestQuery(td::unique_ptr &&message_info) : message_info_(std::move(message_info)) { + } + }; + struct NewGuestQueryQueue { + std::queue queue_; + bool has_active_request_ = false; + }; + td::FlatHashMap new_guest_query_queues_; // chat_id -> queue + struct NewCallbackQueryQueue { std::queue> queue_; bool has_active_request_ = false;