diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 5b45ef55e..a55041069 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -834,7 +834,7 @@ messageCalendar total_count:int32 days:vector = MessageCalen //@sponsor_chat_id Chat identifier //@link An internal link to be opened when the sponsored message is clicked; may be null. If null, the sponsor chat needs to be opened instead //@content Content of the message. Currently, can be only of the type messageText -sponsoredMessage id:int32 sponsor_chat_id:int53 link:InternalLinkType content:MessageContent = SponsoredMessage; +sponsoredMessage id:int53 sponsor_chat_id:int53 link:InternalLinkType content:MessageContent = SponsoredMessage; //@class NotificationSettingsScope @description Describes the types of chats to which notification settings are relevant @@ -4361,7 +4361,7 @@ getMessagePublicForwards chat_id:int53 message_id:int53 offset:string limit:int3 getChatSponsoredMessage chat_id:int53 = SponsoredMessage; //@description Informs TDLib that a sponsored message was viewed by the user @chat_id Identifier of the chat with the sponsored message @sponsored_message_id The identifier of the sponsored message being viewed -viewSponsoredMessage chat_id:int53 sponsored_message_id:int32 = Ok; +viewSponsoredMessage chat_id:int53 sponsored_message_id:int53 = Ok; //@description Removes an active notification from notification list. Needs to be called only if the notification is removed by the current user @notification_group_id Identifier of notification group to which the notification belongs @notification_id Identifier of removed notification diff --git a/td/telegram/SponsoredMessageManager.cpp b/td/telegram/SponsoredMessageManager.cpp index 6f34de237..4106c137f 100644 --- a/td/telegram/SponsoredMessageManager.cpp +++ b/td/telegram/SponsoredMessageManager.cpp @@ -97,14 +97,14 @@ class ViewSponsoredMessageQuery final : public Td::ResultHandler { }; struct SponsoredMessageManager::SponsoredMessage { - int32 local_id = 0; + int64 local_id = 0; DialogId sponsor_dialog_id; ServerMessageId server_message_id; string start_param; unique_ptr content; SponsoredMessage() = default; - SponsoredMessage(int32 local_id, DialogId sponsor_dialog_id, ServerMessageId server_message_id, string start_param, + SponsoredMessage(int64 local_id, DialogId sponsor_dialog_id, ServerMessageId server_message_id, string start_param, unique_ptr content) : local_id(local_id) , sponsor_dialog_id(sponsor_dialog_id) @@ -117,7 +117,7 @@ struct SponsoredMessageManager::SponsoredMessage { struct SponsoredMessageManager::DialogSponsoredMessages { vector>> promises; vector messages; - std::unordered_map message_random_ids; + std::unordered_map message_random_ids; }; SponsoredMessageManager::SponsoredMessageManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) { @@ -274,8 +274,13 @@ void SponsoredMessageManager::on_get_dialog_sponsored_messages( } CHECK(disable_web_page_preview); - CHECK(current_sponsored_message_id_ < std::numeric_limits::max()); - auto local_id = ++current_sponsored_message_id_; + auto local_id = ++current_sponsored_message_id_ + MessageId::max().get(); + if (local_id >= (1ll << 52)) { + LOG(ERROR) << "Sponsored message ID overflowed"; + current_sponsored_message_id_ = 1; + local_id = MessageId::max().get() + 1; + } + CHECK(messages->message_random_ids.count(local_id) == 0); messages->message_random_ids[local_id] = sponsored_message->random_id_.as_slice().str(); messages->messages.emplace_back(local_id, sponsor_dialog_id, server_message_id, std::move(sponsored_message->start_param_), std::move(content)); @@ -287,7 +292,7 @@ void SponsoredMessageManager::on_get_dialog_sponsored_messages( delete_cached_sponsored_messages_timeout_.set_timeout_in(dialog_id.get(), 300.0); } -void SponsoredMessageManager::view_sponsored_message(DialogId dialog_id, int32 sponsored_message_id, +void SponsoredMessageManager::view_sponsored_message(DialogId dialog_id, int64 sponsored_message_id, Promise &&promise) { if (!td_->messages_manager_->have_dialog_force(dialog_id, "view_sponsored_message")) { return promise.set_error(Status::Error(400, "Chat not found")); diff --git a/td/telegram/SponsoredMessageManager.h b/td/telegram/SponsoredMessageManager.h index 528a2c3ca..df174e415 100644 --- a/td/telegram/SponsoredMessageManager.h +++ b/td/telegram/SponsoredMessageManager.h @@ -35,7 +35,7 @@ class SponsoredMessageManager final : public Actor { void get_dialog_sponsored_message(DialogId dialog_id, Promise> &&promise); - void view_sponsored_message(DialogId dialog_id, int32 sponsored_message_id, Promise &&promise); + void view_sponsored_message(DialogId dialog_id, int64 sponsored_message_id, Promise &&promise); private: struct SponsoredMessage; diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index dd4472826..6700be478 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2676,7 +2676,7 @@ class CliClient final : public Actor { string sponsored_message_id; get_args(args, chat_id, sponsored_message_id); send_request(td_api::make_object(as_chat_id(chat_id), - to_integer(sponsored_message_id))); + to_integer(sponsored_message_id))); } else if (op == "gmlink") { string chat_id; string message_id;