From 9c88451e1c77b06422802258e24ef3016e771d15 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 9 Nov 2023 20:28:27 +0300 Subject: [PATCH] Add td_api::messagePremiumGiveawayCompleted. --- td/generate/scheme/td_api.tl | 6 ++ td/telegram/DialogAction.cpp | 1 + td/telegram/MessageContent.cpp | 104 ++++++++++++++++++++++++++++- td/telegram/MessageContentType.cpp | 6 ++ td/telegram/MessageContentType.h | 3 +- td/telegram/MessagesManager.cpp | 1 + 6 files changed, 117 insertions(+), 4 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 17513e401..6767082b2 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -2866,6 +2866,12 @@ messagePremiumGiveawayCreated = MessageContent; //@sticker A sticker to be shown in the message; may be null if unknown messagePremiumGiveaway parameters:premiumGiveawayParameters winner_count:int32 month_count:int32 sticker:sticker = MessageContent; +//@description A Telegram Premium giveaway has been completed for the chat +//@giveaway_message_id Identifier of the message with the giveaway, can be an identifier of a deleted message +//@winner_count Number of winners in the giveaway +//@unclaimed_prize_count Number of undistributed prizes +messagePremiumGiveawayCompleted giveaway_message_id:int53 winner_count:int32 unclaimed_prize_count:int32 = MessageContent; + //@description A contact has registered with Telegram messageContactRegistered = MessageContent; diff --git a/td/telegram/DialogAction.cpp b/td/telegram/DialogAction.cpp index 7fca21698..bb58e56b1 100644 --- a/td/telegram/DialogAction.cpp +++ b/td/telegram/DialogAction.cpp @@ -416,6 +416,7 @@ bool DialogAction::is_canceled_by_message_of_type(MessageContentType message_con case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: return false; default: UNREACHABLE(); diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index e87d8dfce..d952e911e 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -496,7 +496,7 @@ class MessageChatSetTtl final : public MessageContent { class MessageUnsupported final : public MessageContent { public: - static constexpr int32 CURRENT_VERSION = 24; + static constexpr int32 CURRENT_VERSION = 25; int32 version = CURRENT_VERSION; MessageUnsupported() = default; @@ -1004,6 +1004,22 @@ class MessageGiveawayLaunch final : public MessageContent { } }; +class MessageGiveawayResults final : public MessageContent { + public: + MessageId giveaway_message_id; + int32 winner_count = 0; + int32 unclaimed_count = 0; + + MessageGiveawayResults() = default; + MessageGiveawayResults(MessageId giveaway_message_id, int32 winner_count, int32 unclaimed_count) + : giveaway_message_id(giveaway_message_id), winner_count(winner_count), unclaimed_count(unclaimed_count) { + } + + MessageContentType get_type() const final { + return MessageContentType::GiveawayResults; + } +}; + template static void store(const MessageContent *content, StorerT &storer) { CHECK(content != nullptr); @@ -1446,6 +1462,27 @@ static void store(const MessageContent *content, StorerT &storer) { } case MessageContentType::GiveawayLaunch: break; + case MessageContentType::GiveawayResults: { + const auto *m = static_cast(content); + bool has_winner_count = m->winner_count != 0; + bool has_unclaimed_count = m->unclaimed_count != 0; + bool has_giveaway_message_id = m->giveaway_message_id.is_valid(); + BEGIN_STORE_FLAGS(); + STORE_FLAG(has_winner_count); + STORE_FLAG(has_unclaimed_count); + STORE_FLAG(has_giveaway_message_id); + END_STORE_FLAGS(); + if (has_winner_count) { + store(m->winner_count, storer); + } + if (has_unclaimed_count) { + store(m->unclaimed_count, storer); + } + if (has_giveaway_message_id) { + store(m->giveaway_message_id, storer); + } + break; + } default: UNREACHABLE(); } @@ -2040,6 +2077,31 @@ static void parse(unique_ptr &content, ParserT &parser) { case MessageContentType::GiveawayLaunch: content = make_unique(); break; + case MessageContentType::GiveawayResults: { + auto m = make_unique(); + bool has_winner_count; + bool has_unclaimed_count; + bool has_giveaway_message_id; + BEGIN_PARSE_FLAGS(); + PARSE_FLAG(has_winner_count); + PARSE_FLAG(has_unclaimed_count); + PARSE_FLAG(has_giveaway_message_id); + END_PARSE_FLAGS(); + if (has_winner_count) { + parse(m->winner_count, parser); + } + if (has_unclaimed_count) { + parse(m->unclaimed_count, parser); + } + if (has_giveaway_message_id) { + parse(m->giveaway_message_id, parser); + } + if (m->winner_count < 0 || m->unclaimed_count < 0) { + is_bad = true; + } + content = std::move(m); + break; + } default: is_bad = true; @@ -2697,6 +2759,7 @@ bool can_have_input_media(const Td *td, const MessageContent *content, bool is_s case MessageContentType::WriteAccessAllowedByRequest: case MessageContentType::GiftCode: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: return false; case MessageContentType::Animation: case MessageContentType::Audio: @@ -2833,6 +2896,7 @@ SecretInputMedia get_secret_input_media(const MessageContent *content, Td *td, case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: break; default: UNREACHABLE(); @@ -2969,6 +3033,7 @@ static tl_object_ptr get_input_media_impl( case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: break; default: UNREACHABLE(); @@ -3169,6 +3234,7 @@ void delete_message_content_thumbnail(MessageContent *content, Td *td) { case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: break; default: UNREACHABLE(); @@ -3377,6 +3443,7 @@ Status can_send_message_content(DialogId dialog_id, const MessageContent *conten case MessageContentType::WriteAccessAllowedByRequest: case MessageContentType::GiftCode: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: UNREACHABLE(); } return Status::OK(); @@ -3519,6 +3586,7 @@ static int32 get_message_content_media_index_mask(const MessageContent *content, case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: return 0; default: UNREACHABLE(); @@ -3753,6 +3821,8 @@ vector get_message_content_min_user_ids(const Td *td, const MessageConte break; case MessageContentType::GiveawayLaunch: break; + case MessageContentType::GiveawayResults: + break; default: UNREACHABLE(); break; @@ -4132,6 +4202,7 @@ void merge_message_contents(Td *td, const MessageContent *old_content, MessageCo case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: break; default: UNREACHABLE(); @@ -4277,6 +4348,7 @@ bool merge_message_content_file_id(Td *td, MessageContent *message_content, File case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: LOG(ERROR) << "Receive new file " << new_file_id << " in a sent message of the type " << content_type; break; default: @@ -4773,6 +4845,15 @@ void compare_message_contents(Td *td, const MessageContent *old_content, const M } case MessageContentType::GiveawayLaunch: break; + case MessageContentType::GiveawayResults: { + const auto *lhs = static_cast(old_content); + const auto *rhs = static_cast(new_content); + if (lhs->giveaway_message_id != rhs->giveaway_message_id || lhs->winner_count != rhs->winner_count || + lhs->unclaimed_count != rhs->unclaimed_count) { + need_update = true; + } + break; + } default: UNREACHABLE(); break; @@ -5873,6 +5954,7 @@ unique_ptr dup_message_content(Td *td, DialogId dialog_id, const case MessageContentType::WriteAccessAllowedByRequest: case MessageContentType::GiftCode: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: return nullptr; default: UNREACHABLE(); @@ -6246,8 +6328,16 @@ unique_ptr get_action_message_content(Td *td, tl_object_ptr(dialog_id, action->months_, action->via_giveaway_, action->unclaimed_, std::move(action->slug_)); } - case telegram_api::messageActionGiveawayResults::ID: - return make_unique(); + case telegram_api::messageActionGiveawayResults::ID: { + auto action = move_tl_object_as(action_ptr); + auto reply_to_message_id = replied_message_info.get_same_chat_reply_to_message_id(true); + if (!reply_to_message_id.is_valid()) { + LOG(ERROR) << "Receive giveaway results message with " << reply_to_message_id << " in " << owner_dialog_id; + reply_to_message_id = MessageId(); + } + return td::make_unique(reply_to_message_id, action->winners_count_, + action->unclaimed_count_); + } default: UNREACHABLE(); } @@ -6631,6 +6721,11 @@ tl_object_ptr get_message_content_object(const MessageCo } case MessageContentType::GiveawayLaunch: return td_api::make_object(); + case MessageContentType::GiveawayResults: { + const auto *m = static_cast(content); + return td_api::make_object(m->giveaway_message_id.get(), m->winner_count, + m->unclaimed_count); + } default: UNREACHABLE(); return nullptr; @@ -7061,6 +7156,7 @@ string get_message_content_search_text(const Td *td, const MessageContent *conte case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: return string(); default: UNREACHABLE(); @@ -7381,6 +7477,8 @@ void add_message_content_dependencies(Dependencies &dependencies, const MessageC } case MessageContentType::GiveawayLaunch: break; + case MessageContentType::GiveawayResults: + break; default: UNREACHABLE(); break; diff --git a/td/telegram/MessageContentType.cpp b/td/telegram/MessageContentType.cpp index cc057f648..be3755790 100644 --- a/td/telegram/MessageContentType.cpp +++ b/td/telegram/MessageContentType.cpp @@ -134,6 +134,8 @@ StringBuilder &operator<<(StringBuilder &string_builder, MessageContentType cont return string_builder << "Giveaway"; case MessageContentType::GiveawayLaunch: return string_builder << "GiveawayLaunch"; + case MessageContentType::GiveawayResults: + return string_builder << "GiveawayResults"; default: return string_builder << "Invalid type " << static_cast(content_type); } @@ -203,6 +205,7 @@ bool is_allowed_media_group_content(MessageContentType content_type) { case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: return false; default: UNREACHABLE(); @@ -281,6 +284,7 @@ bool is_secret_message_content(int32 ttl, MessageContentType content_type) { case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: return false; default: UNREACHABLE(); @@ -352,6 +356,7 @@ bool is_service_message_content(MessageContentType content_type) { case MessageContentType::WriteAccessAllowedByRequest: case MessageContentType::GiftCode: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: return true; default: UNREACHABLE(); @@ -423,6 +428,7 @@ bool can_have_message_content_caption(MessageContentType content_type) { case MessageContentType::GiftCode: case MessageContentType::Giveaway: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: return false; default: UNREACHABLE(); diff --git a/td/telegram/MessageContentType.h b/td/telegram/MessageContentType.h index 680a6c4f7..a91723969 100644 --- a/td/telegram/MessageContentType.h +++ b/td/telegram/MessageContentType.h @@ -74,7 +74,8 @@ enum class MessageContentType : int32 { WriteAccessAllowedByRequest, GiftCode, Giveaway, - GiveawayLaunch + GiveawayLaunch, + GiveawayResults }; // increase MessageUnsupported::CURRENT_VERSION each time a new message content type is added diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 93f8b4c98..8a49308c9 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -26464,6 +26464,7 @@ bool MessagesManager::can_edit_message(DialogId dialog_id, const Message *m, boo case MessageContentType::WriteAccessAllowedByRequest: case MessageContentType::GiftCode: case MessageContentType::GiveawayLaunch: + case MessageContentType::GiveawayResults: return false; default: UNREACHABLE();