diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ffafaef8..76a3650da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -484,6 +484,7 @@ set(TDLIB_SOURCE td/telegram/InlineQueriesManager.h td/telegram/Location.h td/telegram/logevent/LogEvent.h + td/telegram/logevent/LogEventHelper.h td/telegram/logevent/SecretChatEvent.h td/telegram/MessageEntity.h td/telegram/MessageId.h diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 1485fb1c6..d62f2b1ad 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -32,6 +32,7 @@ #include "td/telegram/HashtagHints.h" #include "td/telegram/InlineQueriesManager.h" #include "td/telegram/logevent/LogEvent.h" +#include "td/telegram/logevent/LogEventHelper.h" #include "td/telegram/MessageEntity.hpp" #include "td/telegram/MessagesDb.h" #include "td/telegram/misc.h" @@ -8134,16 +8135,8 @@ void MessagesManager::delete_messages_from_server(DialogId dialog_id, vectortd_db()->get_binlog(), LogEvent::HandlerType::DeleteMessagesFromServer, storer); } - if (logevent_id != 0) { - auto new_promise = PromiseCreator::lambda([logevent_id, promise = std::move(promise)](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - - promise.set_result(std::move(result)); - }); - promise = std::move(new_promise); - } + auto new_promise = get_erase_logevent_promise(logevent_id, std::move(promise)); + promise = std::move(new_promise); // to prevent self-move switch (dialog_id.get_type()) { case DialogType::User: @@ -8280,16 +8273,8 @@ void MessagesManager::delete_dialog_history_from_server(DialogId dialog_id, Mess BinlogHelper::add(G()->td_db()->get_binlog(), LogEvent::HandlerType::DeleteDialogHistoryFromServer, storer); } - if (logevent_id != 0) { - auto new_promise = PromiseCreator::lambda([logevent_id, promise = std::move(promise)](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - - promise.set_result(std::move(result)); - }); - promise = std::move(new_promise); - } + auto new_promise = get_erase_logevent_promise(logevent_id, std::move(promise)); + promise = std::move(new_promise); // to prevent self-move switch (dialog_id.get_type()) { case DialogType::User: @@ -8487,18 +8472,8 @@ void MessagesManager::delete_all_channel_messages_from_user_on_server(ChannelId LogEvent::HandlerType::DeleteAllChannelMessagesFromUserOnServer, storer); } - if (logevent_id != 0) { - auto new_promise = PromiseCreator::lambda([logevent_id, promise = std::move(promise)](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - - promise.set_result(std::move(result)); - }); - promise = std::move(new_promise); - } - - td_->create_handler(std::move(promise))->send(channel_id, user_id); + td_->create_handler(get_erase_logevent_promise(logevent_id, std::move(promise))) + ->send(channel_id, user_id); } void MessagesManager::unload_dialog(DialogId dialog_id) { @@ -8699,18 +8674,9 @@ void MessagesManager::read_all_dialog_mentions_on_server(DialogId dialog_id, uin BinlogHelper::add(G()->td_db()->get_binlog(), LogEvent::HandlerType::ReadAllDialogMentionsOnServer, storer); } - if (logevent_id != 0) { - auto new_promise = PromiseCreator::lambda([logevent_id, promise = std::move(promise)](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - - promise.set_result(std::move(result)); - }); - promise = std::move(new_promise); - } - - td_->create_handler(std::move(promise))->send(dialog_id); + LOG(INFO) << "Read all mentions on server in " << dialog_id; + td_->create_handler(get_erase_logevent_promise(logevent_id, std::move(promise))) + ->send(dialog_id); } void MessagesManager::read_message_content_from_updates(MessageId message_id) { @@ -12391,16 +12357,7 @@ void MessagesManager::toggle_dialog_is_pinned_on_server(DialogId dialog_id, bool BinlogHelper::add(G()->td_db()->get_binlog(), LogEvent::HandlerType::ToggleDialogIsPinnedOnServer, storer); } - Promise<> promise; - if (logevent_id != 0) { - promise = PromiseCreator::lambda([logevent_id](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - }); - } - - td_->create_handler(std::move(promise))->send(dialog_id, is_pinned); + td_->create_handler(get_erase_logevent_promise(logevent_id))->send(dialog_id, is_pinned); } Status MessagesManager::set_pinned_dialogs(vector dialog_ids) { @@ -12498,16 +12455,7 @@ void MessagesManager::reorder_pinned_dialogs_on_server(const vector &d BinlogHelper::add(G()->td_db()->get_binlog(), LogEvent::HandlerType::ReorderPinnedDialogsOnServer, storer); } - Promise<> promise; - if (logevent_id != 0) { - promise = PromiseCreator::lambda([logevent_id](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - }); - } - - td_->create_handler(std::move(promise))->send(dialog_ids); + td_->create_handler(get_erase_logevent_promise(logevent_id))->send(dialog_ids); } Status MessagesManager::toggle_dialog_silent_send_message(DialogId dialog_id, bool silent_send_message) { @@ -12941,15 +12889,7 @@ void MessagesManager::read_message_contents_on_server(DialogId dialog_id, vector BinlogHelper::add(G()->td_db()->get_binlog(), LogEvent::HandlerType::ReadMessageContentsOnServer, storer); } - Promise<> promise; - if (logevent_id != 0) { - promise = PromiseCreator::lambda([logevent_id](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - }); - } - + auto promise = get_erase_logevent_promise(logevent_id); switch (dialog_id.get_type()) { case DialogType::User: case DialogType::Chat: @@ -13358,17 +13298,8 @@ void MessagesManager::update_scope_notification_settings_on_server(NotificationS LogEvent::HandlerType::UpdateScopeNotificationSettingsOnServer, storer); } - Promise<> promise; - if (logevent_id != 0) { - promise = PromiseCreator::lambda([logevent_id](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - }); - } - LOG(INFO) << "Update " << scope << " notification settings on server with logevent " << logevent_id; - td_->create_handler(std::move(promise)) + td_->create_handler(get_erase_logevent_promise(logevent_id)) ->send(scope, *get_scope_notification_settings(scope)); } @@ -13409,17 +13340,8 @@ void MessagesManager::reset_all_notification_settings_on_server(uint64 logevent_ LogEvent::HandlerType::ResetAllNotificationSettingsOnServer, storer); } - Promise<> promise; - if (logevent_id != 0) { - promise = PromiseCreator::lambda([logevent_id](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - }); - } - LOG(INFO) << "Reset all notification settings"; - td_->create_handler(std::move(promise))->send(); + td_->create_handler(get_erase_logevent_promise(logevent_id))->send(); } unique_ptr MessagesManager::get_draft_message( @@ -13640,15 +13562,7 @@ void MessagesManager::read_history_on_server(DialogId dialog_id, MessageId max_m logevent_id = BinlogHelper::add(G()->td_db()->get_binlog(), LogEvent::HandlerType::ReadHistoryOnServer, storer); } - Promise<> promise; - if (logevent_id != 0) { - promise = PromiseCreator::lambda([logevent_id](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - }); - } - + auto promise = get_erase_logevent_promise(logevent_id); switch (dialog_id.get_type()) { case DialogType::User: case DialogType::Chat: @@ -18297,15 +18211,6 @@ void MessagesManager::do_forward_messages(DialogId to_dialog_id, DialogId from_d logevent_id = BinlogHelper::add(G()->td_db()->get_binlog(), LogEvent::HandlerType::ForwardMessages, storer); } - Promise<> promise; - if (logevent_id != 0) { - promise = PromiseCreator::lambda([logevent_id](Result result) mutable { - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - }); - } - int32 flags = 0; if (messages[0]->disable_notification) { flags |= SEND_MESSAGE_FLAG_DISABLE_NOTIFICATION; @@ -18322,8 +18227,8 @@ void MessagesManager::do_forward_messages(DialogId to_dialog_id, DialogId from_d vector random_ids = transform(messages, [this, to_dialog_id](const Message *m) { return begin_send_message(to_dialog_id, m); }); - send_closure(td_->create_net_actor(std::move(promise)), &ForwardMessagesActor::send, flags, - to_dialog_id, from_dialog_id, message_ids, std::move(random_ids), + send_closure(td_->create_net_actor(get_erase_logevent_promise(logevent_id)), + &ForwardMessagesActor::send, flags, to_dialog_id, from_dialog_id, message_ids, std::move(random_ids), get_sequence_dispatcher_id(to_dialog_id, -1)); } @@ -18631,18 +18536,9 @@ void MessagesManager::do_send_screenshot_taken_notification_message(DialogId dia logevent_id = save_send_screenshot_taken_notification_message_logevent(dialog_id, m); } - Promise<> promise; - if (logevent_id != 0) { - promise = PromiseCreator::lambda([logevent_id](Result result) mutable { - LOG(INFO) << "Erase logevent_id " << logevent_id; - if (!G()->close_flag()) { - BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); - } - }); - } - int64 random_id = begin_send_message(dialog_id, m); - td_->create_handler(std::move(promise))->send(dialog_id, random_id); + td_->create_handler(get_erase_logevent_promise(logevent_id)) + ->send(dialog_id, random_id); } Result MessagesManager::add_local_message( diff --git a/td/telegram/logevent/LogEventHelper.h b/td/telegram/logevent/LogEventHelper.h new file mode 100644 index 000000000..f5aa835d2 --- /dev/null +++ b/td/telegram/logevent/LogEventHelper.h @@ -0,0 +1,34 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#pragma once + +#include "td/actor/PromiseFuture.h" + +#include "td/db/binlog/BinlogHelper.h" + +#include "td/telegram/Global.h" +#include "td/telegram/TdDb.h" + +#include "td/utils/Status.h" + +namespace td { + +Promise get_erase_logevent_promise(uint64 logevent_id, Promise promise = Promise()) { + if (logevent_id == 0) { + return std::move(promise); + } + + return PromiseCreator::lambda([logevent_id, promise = std::move(promise)](Result result) mutable { + if (!G()->close_flag()) { + BinlogHelper::erase(G()->td_db()->get_binlog(), logevent_id); + } + + promise.set_result(std::move(result)); + }); +} + +} // namespace td