aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2026-05-01 18:43:14 +0300
committerlevlam <levlam@telegram.org>2026-05-01 18:43:14 +0300
commit17f4f0a42de9aa1283f4b0b0becb6bb1c01f964e (patch)
tree7d48278fe5197f3e083e401ebb564fc97971f1ee
parentfb0d5002dbbe87f85d0b2031b69906a09593c7b8 (diff)
Add "guest_message" updates.
-rw-r--r--telegram-bot-api/Client.cpp67
-rw-r--r--telegram-bot-api/Client.h19
2 files changed, 86 insertions, 0 deletions
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<const td_api::messageText *>(message_->content.get());
@@ -9053,6 +9056,9 @@ void Client::on_update(object_ptr<td_api::Object> result) {
case td_api::updateBusinessMessagesDeleted::ID:
add_update_business_messages_deleted(move_object_as<td_api::updateBusinessMessagesDeleted>(result));
break;
+ case td_api::updateNewGuestQuery::ID:
+ add_new_guest_query(move_object_as<td_api::updateNewGuestQuery>(result));
+ break;
case td_api::updateConnectionState::ID: {
auto update = move_object_as<td_api::updateConnectionState>(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_ptr<td_api::updateBusinessMessag
process_new_business_message_queue(update->connection_id_, 0);
}
+void Client::add_new_guest_query(object_ptr<td_api::updateNewGuestQuery> &&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<td_api::message> &&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<td::int64> 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<int64>(12) << 33);
+ add_message_update(UpdateType::GuestMessage, message_info.get(), webhook_queue_id);
+ }
+ new_guest_query_queues_.erase(chat_id);
+}
+
td::unique_ptr<Client::MessageInfo> 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<td_api::MessageOrigin> forward_origin;
td::string author_signature;
td::string sender_tag;
td::unique_ptr<MessageInfo> business_reply_to_message;
+ td::vector<td::unique_ptr<MessageInfo>> reference_messages;
object_ptr<td_api::messageReplyToMessage> reply_to_message;
object_ptr<td_api::messageReplyToStory> reply_to_story;
object_ptr<td_api::MessageTopic> 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<td_api::updateNewGuestQuery> &&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<td::string, NewBusinessMessageQueue> new_business_message_queues_; // connection_id -> queue
+ struct NewGuestQuery {
+ td::unique_ptr<MessageInfo> message_info_;
+
+ explicit NewGuestQuery(td::unique_ptr<MessageInfo> &&message_info) : message_info_(std::move(message_info)) {
+ }
+ };
+ struct NewGuestQueryQueue {
+ std::queue<NewGuestQuery> queue_;
+ bool has_active_request_ = false;
+ };
+ td::FlatHashMap<int64, NewGuestQueryQueue> new_guest_query_queues_; // chat_id -> queue
+
struct NewCallbackQueryQueue {
std::queue<object_ptr<td_api::updateNewCallbackQuery>> queue_;
bool has_active_request_ = false;