From 3883ffcc751b94e743454096f8350172e6dfe0d4 Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 19 Sep 2021 01:52:56 +0300 Subject: [PATCH] Check emoji in incoming chatActionEnjoyingAnimations. --- td/telegram/DialogAction.cpp | 7 +++++ td/telegram/DialogAction.h | 2 ++ td/telegram/MessageContent.cpp | 9 ++++++ td/telegram/MessageContent.h | 3 ++ td/telegram/MessagesManager.cpp | 5 ++++ td/telegram/StickersManager.cpp | 52 +++++++++++++++++++++++++++++++-- td/telegram/StickersManager.h | 13 +++++++++ 7 files changed, 88 insertions(+), 3 deletions(-) diff --git a/td/telegram/DialogAction.cpp b/td/telegram/DialogAction.cpp index a2bd86c89..aec48e3fb 100644 --- a/td/telegram/DialogAction.cpp +++ b/td/telegram/DialogAction.cpp @@ -444,6 +444,13 @@ int32 DialogAction::get_importing_messages_action_progress() const { return progress_; } +string DialogAction::get_enjoying_animations_emoji() const { + if (type_ == Type::EnjoyingAnimations) { + return emoji_; + } + return string(); +} + DialogAction::ClickingAnimateEmojiInfo DialogAction::get_clicking_animated_emoji_action_info() const { ClickingAnimateEmojiInfo result; if (type_ == Type::ClickingAnimatedEmoji) { diff --git a/td/telegram/DialogAction.h b/td/telegram/DialogAction.h index f70e1142c..d50664414 100644 --- a/td/telegram/DialogAction.h +++ b/td/telegram/DialogAction.h @@ -76,6 +76,8 @@ class DialogAction { int32 get_importing_messages_action_progress() const; + string get_enjoying_animations_emoji() const; + struct ClickingAnimateEmojiInfo { int32 message_id; string emoji; diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index a55a7d28a..cebf88a6c 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -17,6 +17,7 @@ #include "td/telegram/Contact.h" #include "td/telegram/ContactsManager.h" #include "td/telegram/Dependencies.h" +#include "td/telegram/DialogAction.h" #include "td/telegram/DialogParticipant.h" #include "td/telegram/Document.h" #include "td/telegram/DocumentsManager.h" @@ -5556,6 +5557,14 @@ StickerSetId add_sticker_set(Td *td, tl_object_ptrstickers_manager_->add_sticker_set(std::move(input_sticker_set)); } +bool is_unsent_animated_emoji_click(Td *td, DialogId dialog_id, const DialogAction &action) { + auto emoji = action.get_enjoying_animations_emoji(); + if (emoji.empty()) { + return false; + } + return !td->stickers_manager_->is_sent_animated_emoji_click(dialog_id, emoji); +} + void on_dialog_used(TopDialogCategory category, DialogId dialog_id, int32 date) { send_closure(G()->top_dialog_manager(), &TopDialogManager::on_dialog_used, category, dialog_id, date); } diff --git a/td/telegram/MessageContent.h b/td/telegram/MessageContent.h index 6b65947e5..83ce8c6ae 100644 --- a/td/telegram/MessageContent.h +++ b/td/telegram/MessageContent.h @@ -38,6 +38,7 @@ namespace td { struct Dependencies; +class DialogAction; class Game; struct Photo; class Td; @@ -245,6 +246,8 @@ void on_sent_message_content(Td *td, const MessageContent *content); StickerSetId add_sticker_set(Td *td, tl_object_ptr &&input_sticker_set); +bool is_unsent_animated_emoji_click(Td *td, DialogId dialog_id, const DialogAction &action); + void on_dialog_used(TopDialogCategory category, DialogId dialog_id, int32 date); void update_used_hashtags(Td *td, const MessageContent *content); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 077694820..a3518bc6c 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -7113,6 +7113,11 @@ void MessagesManager::on_user_dialog_action(DialogId dialog_id, MessageId top_th } } + if (is_unsent_animated_emoji_click(td_, dialog_id, action)) { + LOG(DEBUG) << "Ignore unsent " << action; + return; + } + if (!td_->contacts_manager_->have_min_user(user_id)) { LOG(DEBUG) << "Ignore " << action << " of unknown " << user_id; return; diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 9d435d964..ce9a15adb 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -1124,12 +1124,15 @@ class DeleteStickerFromSetQuery final : public Td::ResultHandler { class SendAnimatedEmojiClicksQuery final : public Td::ResultHandler { DialogId dialog_id_; + string emoji_; public: void send(DialogId dialog_id, tl_object_ptr &&input_peer, - tl_object_ptr &&action) { + tl_object_ptr &&action) { dialog_id_ = dialog_id; CHECK(input_peer != nullptr); + CHECK(action != nullptr); + emoji_ = action->emoticon_; int32 flags = 0; send_query(G()->net_query_creator().create( @@ -1149,6 +1152,8 @@ class SendAnimatedEmojiClicksQuery final : public Td::ResultHandler { if (!td->messages_manager_->on_get_dialog_error(dialog_id_, status, "SendAnimatedEmojiClicksQuery")) { LOG(INFO) << "Receive error for send animated emoji clicks: " << status; } + + td->stickers_manager_->on_send_animated_emoji_clicks(dialog_id_, emoji_); } }; @@ -4153,7 +4158,8 @@ void StickersManager::flush_pending_animated_emoji_clicks() { // includes deleted full_message_id return; } - auto input_peer = td_->messages_manager_->get_input_peer(full_message_id.get_dialog_id(), AccessRights::Write); + auto dialog_id = full_message_id.get_dialog_id(); + auto input_peer = td_->messages_manager_->get_input_peer(dialog_id, AccessRights::Write); if (input_peer == nullptr) { return; } @@ -4171,10 +4177,50 @@ void StickersManager::flush_pending_animated_emoji_clicks() { })); td_->create_handler()->send( - full_message_id.get_dialog_id(), std::move(input_peer), + dialog_id, std::move(input_peer), make_tl_object( emoji, full_message_id.get_message_id().get_server_message_id().get(), make_tl_object(data))); + + on_send_animated_emoji_clicks(dialog_id, emoji); +} + +void StickersManager::on_send_animated_emoji_clicks(DialogId dialog_id, const string &emoji) { + flush_sent_animated_emoji_clicks(); + + if (!sent_animated_emoji_clicks_.empty() && sent_animated_emoji_clicks_.back().dialog_id == dialog_id && + sent_animated_emoji_clicks_.back().emoji == emoji) { + sent_animated_emoji_clicks_.back().send_time = Time::now(); + return; + } + + SentAnimatedEmojiClicks clicks; + clicks.send_time = Time::now(); + clicks.dialog_id = dialog_id; + clicks.emoji = emoji; + sent_animated_emoji_clicks_.push_back(std::move(clicks)); +} + +void StickersManager::flush_sent_animated_emoji_clicks() { + if (sent_animated_emoji_clicks_.empty()) { + return; + } + auto min_send_time = Time::now() - 30.0; + auto it = sent_animated_emoji_clicks_.begin(); + while (it != sent_animated_emoji_clicks_.end() && it->send_time <= min_send_time) { + ++it; + } + sent_animated_emoji_clicks_.erase(sent_animated_emoji_clicks_.begin(), it); +} + +bool StickersManager::is_sent_animated_emoji_click(DialogId dialog_id, const string &emoji) { + flush_sent_animated_emoji_clicks(); + for (const auto &click : sent_animated_emoji_clicks_) { + if (click.dialog_id == dialog_id && click.emoji == emoji) { + return true; + } + } + return false; } Status StickersManager::on_animated_emoji_message_clicked(const string &emoji, FullMessageId full_message_id, diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index 693fef838..997d3241f 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -71,6 +71,10 @@ class StickersManager final : public Actor { void get_animated_emoji_click_sticker(const string &message_text, FullMessageId full_message_id, Promise> &&promise); + void on_send_animated_emoji_clicks(DialogId dialog_id, const string &emoji); + + bool is_sent_animated_emoji_click(DialogId dialog_id, const string &emoji); + Status on_animated_emoji_message_clicked(const string &emoji, FullMessageId full_message_id, string data); void create_sticker(FileId file_id, string minithumbnail, PhotoSize thumbnail, Dimensions dimensions, @@ -598,6 +602,8 @@ class StickersManager final : public Actor { FullMessageId full_message_id, double start_time, Promise> &&promise); + void flush_sent_animated_emoji_clicks(); + void flush_pending_animated_emoji_clicks(); void schedule_update_animated_emoji_clicked(const StickerSet *sticker_set, const string &emoji, @@ -765,6 +771,13 @@ class StickersManager final : public Actor { FullMessageId last_clicked_animated_emoji_full_message_id_; std::vector> pending_animated_emoji_clicks_; + struct SentAnimatedEmojiClicks { + double send_time = 0.0; + DialogId dialog_id; + string emoji; + }; + std::vector sent_animated_emoji_clicks_; + std::shared_ptr upload_sticker_file_callback_; std::unordered_map>, FileIdHash> being_uploaded_files_;