From f265a154b9c26e956ce074704602bb042c707a81 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 12 May 2023 14:25:00 +0300 Subject: [PATCH] Refactor reply markup removal. --- td/telegram/MessagesManager.cpp | 44 +++++++++++++++++++-------------- td/telegram/MessagesManager.h | 2 ++ 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 53f8f58ea..6b53acfa3 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -34257,6 +34257,17 @@ void MessagesManager::fix_new_message(const Dialog *d, Message *m, bool from_dat } } +void MessagesManager::remove_message_remove_keyboard_reply_markup(Message *m) const { + CHECK(m != nullptr); + if (m->reply_markup == nullptr || m->reply_markup->type != ReplyMarkup::Type::RemoveKeyboard || + td_->auth_manager_->is_bot()) { + return; + } + CHECK(m->reply_markup->is_personal); // otherwise it was removed in fix_new_message + m->had_reply_markup = true; + m->reply_markup = nullptr; +} + // keep synced with add_scheduled_message_to_dialog MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, unique_ptr message, const bool from_database, const bool from_update, @@ -34389,31 +34400,26 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq *need_update = false; } - if (message->reply_markup != nullptr && message->reply_markup->type == ReplyMarkup::Type::RemoveKeyboard && - !td_->auth_manager_->is_bot()) { - CHECK(message->reply_markup->is_personal); // otherwise it was removed in fix_new_message - if (from_update && d->reply_markup_message_id != MessageId() && message_id > d->reply_markup_message_id) { + if (*need_update && d->reply_markup_message_id != MessageId()) { + UserId bot_user_id; + if (message->reply_markup != nullptr && message->reply_markup->type == ReplyMarkup::Type::RemoveKeyboard && + message_id > d->reply_markup_message_id) { + bot_user_id = message->sender_user_id; + } else { + bot_user_id = get_message_content_deleted_user_id(message->content.get()); + // do not check for is_user_bot to allow deleted bots + } + if (bot_user_id.is_valid()) { const Message *old_message = get_message_force(d, d->reply_markup_message_id, "add_message_to_dialog 1"); - if (old_message == nullptr || - (old_message->sender_user_id.is_valid() && old_message->sender_user_id == message->sender_user_id)) { - set_dialog_reply_markup(d, MessageId()); - } - } - message->had_reply_markup = true; - message->reply_markup = nullptr; - } - if (from_update && d->reply_markup_message_id != MessageId()) { - auto deleted_user_id = get_message_content_deleted_user_id(message->content.get()); - if (deleted_user_id.is_valid()) { // do not check for is_user_bot to allow deleted bots - const Message *old_message = get_message_force(d, d->reply_markup_message_id, "add_message_to_dialog 3"); - if (old_message == nullptr || old_message->sender_user_id == deleted_user_id) { - LOG(INFO) << "Remove reply markup in " << dialog_id << ", because bot " << deleted_user_id - << " isn't a member of the chat"; + if (old_message == nullptr || old_message->sender_user_id == bot_user_id) { set_dialog_reply_markup(d, MessageId()); } } } + // must be after set_dialog_reply_markup(d, MessageId()), but before try_restore_dialog_reply_markup + remove_message_remove_keyboard_reply_markup(message.get()); + { Message *m = from_database ? get_message(d, message_id) : get_message_force(d, message_id, "add_message_to_dialog 2"); diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index fce7f8065..e58ca5d0b 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -2248,6 +2248,8 @@ class MessagesManager final : public Actor { void fix_new_message(const Dialog *d, Message *m, bool from_database) const; + void remove_message_remove_keyboard_reply_markup(Message *m) const; + Message *add_message_to_dialog(Dialog *d, unique_ptr message, const bool from_database, const bool from_update, bool *need_update, bool *need_update_dialog_pos, const char *source);