From 1a6ca887775e4943a6e2a3863f1e79f8e3fa6f82 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 8 Sep 2020 14:17:56 +0300 Subject: [PATCH 1/4] Support search within message thread. GitOrigin-RevId: 8ea2ac97000527d743b5a983eed57c3dd206b76c --- td/generate/scheme/td_api.tl | 5 ++-- td/generate/scheme/td_api.tlo | Bin 180928 -> 180972 bytes td/telegram/MessagesManager.cpp | 43 ++++++++++++++++++++++++-------- td/telegram/MessagesManager.h | 3 ++- td/telegram/Td.cpp | 11 +++++--- td/telegram/cli.cpp | 20 +++++++-------- 6 files changed, 54 insertions(+), 28 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 54d3a9167..f49662885 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -1842,7 +1842,7 @@ searchMessagesFilterVoiceAndVideoNote = SearchMessagesFilter; //@description Returns only messages with mentions of the current user, or messages that are replies to their messages searchMessagesFilterMention = SearchMessagesFilter; -//@description Returns only messages with unread mentions of the current user, or messages that are replies to their messages. When using this filter the results can't be additionally filtered by a query or by the sending user +//@description Returns only messages with unread mentions of the current user, or messages that are replies to their messages. When using this filter the results can't be additionally filtered by a query, a message thread or by the sending user searchMessagesFilterUnreadMention = SearchMessagesFilter; //@description Returns only failed to send messages. This filter can be used only if the message database is used @@ -3610,7 +3610,8 @@ deleteChatHistory chat_id:int53 remove_from_chat_list:Bool revoke:Bool = Ok; //@offset Specify 0 to get results from exactly the from_message_id or a negative offset to get the specified message and some newer messages //@limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached //@filter Filter for message content in the search results -searchChatMessages chat_id:int53 query:string sender_user_id:int32 from_message_id:int53 offset:int32 limit:int32 filter:SearchMessagesFilter = Messages; +//@message_thread_id If not 0, only messages in the specified thread will be returned; supergroups only +searchChatMessages chat_id:int53 query:string sender_user_id:int32 from_message_id:int53 offset:int32 limit:int32 filter:SearchMessagesFilter message_thread_id:int53 = Messages; //@description Searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chat_id, message_id)). //-For optimal performance the number of returned messages is chosen by the library diff --git a/td/generate/scheme/td_api.tlo b/td/generate/scheme/td_api.tlo index dbfff2331cd4380dac95e940aec93834f3d0c2a9..74b6d8b404ea87fc87746e641d8a0c59e47cf525 100644 GIT binary patch delta 66 zcmX@m%KfI5yP<_~3zJA23s1Oy*mQ|DCK*PK>5WGiHKxb5F`X8ces*6|FgLZhI59mn Wz9ge4H8Ev+{24~Y?FQ{k6RZIT$rru= delta 49 zcmV-10M7sHg$uxi3xI?Hv;q`{1hJ;yq?Z_m0vwmTivkFjh{ORQmtBSe%a^>20vNY! HhXQ~*{x=in diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 19f78f1d1..108e86250 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -1591,7 +1591,7 @@ class SearchMessagesQuery : public Td::ResultHandler { void send(DialogId dialog_id, const string &query, UserId sender_user_id, telegram_api::object_ptr &&sender_input_user, MessageId from_message_id, - int32 offset, int32 limit, MessageSearchFilter filter, int64 random_id) { + int32 offset, int32 limit, MessageSearchFilter filter, MessageId top_thread_message_id, int64 random_id) { auto input_peer = dialog_id.is_valid() ? td->messages_manager_->get_input_peer(dialog_id, AccessRights::Read) : make_tl_object(); if (input_peer == nullptr) { @@ -1617,9 +1617,13 @@ class SearchMessagesQuery : public Td::ResultHandler { if (sender_input_user != nullptr) { flags |= telegram_api::messages_search::FROM_ID_MASK; } + if (top_thread_message_id.is_valid()) { + flags |= telegram_api::messages_search::TOP_MSG_ID_MASK; + } send_query(G()->net_query_creator().create(telegram_api::messages_search( - flags, std::move(input_peer), query, std::move(sender_input_user), 0, get_input_messages_filter(filter), 0, + flags, std::move(input_peer), query, std::move(sender_input_user), + top_thread_message_id.get_server_message_id().get(), get_input_messages_filter(filter), 0, std::numeric_limits::max(), from_message_id.get_server_message_id().get(), offset, limit, std::numeric_limits::max(), 0, 0))); } @@ -18460,7 +18464,8 @@ void MessagesManager::on_read_history_finished(DialogId dialog_id, uint64 genera std::pair> MessagesManager::search_dialog_messages( DialogId dialog_id, const string &query, UserId sender_user_id, MessageId from_message_id, int32 offset, - int32 limit, MessageSearchFilter filter, int64 &random_id, bool use_db, Promise &&promise) { + int32 limit, MessageSearchFilter filter, MessageId top_thread_message_id, int64 &random_id, bool use_db, + Promise &&promise) { if (random_id != 0) { // request has already been sent before auto it = found_dialog_messages_.find(random_id); @@ -18473,8 +18478,8 @@ std::pair> MessagesManager::search_dialog_messages( random_id = 0; } LOG(INFO) << "Search messages with query \"" << query << "\" in " << dialog_id << " sent by " << sender_user_id - << " filtered by " << filter << " from " << from_message_id << " with offset " << offset << " and limit " - << limit; + << " in thread of " << top_thread_message_id << " filtered by " << filter << " from " << from_message_id + << " with offset " << offset << " and limit " << limit; std::pair> result; if (limit <= 0) { @@ -18523,6 +18528,17 @@ std::pair> MessagesManager::search_dialog_messages( return result; } + if (top_thread_message_id != MessageId()) { + if (!top_thread_message_id.is_valid() || !top_thread_message_id.is_server()) { + promise.set_error(Status::Error(400, "Invalid message thread ID specified")); + return result; + } + if (dialog_id.get_type() != DialogType::Channel || is_broadcast_channel(dialog_id)) { + promise.set_error(Status::Error(400, "Can't filter by message thread ID in the chat")); + return result; + } + } + do { random_id = Random::secure_int64(); } while (random_id == 0 || found_dialog_messages_.find(random_id) != found_dialog_messages_.end()); @@ -18534,14 +18550,18 @@ std::pair> MessagesManager::search_dialog_messages( return result; } if (input_user != nullptr) { - promise.set_error(Status::Error(6, "Non-empty sender user is unsupported with the specified filter")); + promise.set_error(Status::Error(6, "Filtering by sender user is unsupported with the specified filter")); + return result; + } + if (top_thread_message_id != MessageId()) { + promise.set_error(Status::Error(6, "Filtering by message thread is unsupported with the specified filter")); return result; } } // Trying to use database if (use_db && query.empty() && G()->parameters().use_message_db && filter != MessageSearchFilter::Empty && - input_user == nullptr) { // TODO support filter by users in the database + input_user == nullptr && top_thread_message_id == MessageId()) { // TODO support filter by users in the database MessageId first_db_message_id = get_first_database_message_id_by_index(d, filter); int32 message_count = d->message_count_by_index[message_search_filter_index(filter)]; auto fixed_from_message_id = from_message_id; @@ -18577,7 +18597,8 @@ std::pair> MessagesManager::search_dialog_messages( } LOG(DEBUG) << "Search messages on server in " << dialog_id << " with query \"" << query << "\" from user " - << sender_user_id << " from " << from_message_id << " and with limit " << limit; + << sender_user_id << " in thread of " << top_thread_message_id << " from " << from_message_id + << " and with limit " << limit; switch (dialog_id.get_type()) { case DialogType::None: @@ -18586,7 +18607,7 @@ std::pair> MessagesManager::search_dialog_messages( case DialogType::Channel: td_->create_handler(std::move(promise)) ->send(dialog_id, query, sender_user_id, std::move(input_user), from_message_id, offset, limit, filter, - random_id); + top_thread_message_id, random_id); break; case DialogType::SecretChat: if (filter == MessageSearchFilter::UnreadMention) { @@ -18675,7 +18696,7 @@ std::pair> MessagesManager::search_call_messages(Me LOG(DEBUG) << "Search call messages on server from " << from_message_id << " and with limit " << limit; td_->create_handler(std::move(promise)) - ->send(DialogId(), "", UserId(), nullptr, from_message_id, 0, limit, filter, random_id); + ->send(DialogId(), "", UserId(), nullptr, from_message_id, 0, limit, filter, MessageId(), random_id); return result; } @@ -19549,7 +19570,7 @@ int32 MessagesManager::get_dialog_message_count(DialogId dialog_id, MessageSearc case DialogType::Chat: case DialogType::Channel: td_->create_handler(std::move(promise)) - ->send(dialog_id, "", UserId(), nullptr, MessageId(), 0, 1, filter, random_id); + ->send(dialog_id, "", UserId(), nullptr, MessageId(), 0, 1, filter, MessageId(), random_id); break; case DialogType::None: case DialogType::SecretChat: diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index d2ef8a319..6a01c181d 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -661,7 +661,8 @@ class MessagesManager : public Actor { std::pair> search_dialog_messages(DialogId dialog_id, const string &query, UserId sender_user_id, MessageId from_message_id, int32 offset, int32 limit, MessageSearchFilter filter, - int64 &random_id, bool use_db, Promise &&promise); + MessageId top_thread_message_id, int64 &random_id, + bool use_db, Promise &&promise); struct FoundMessages { vector full_message_ids; diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index a6a63a9e7..94b74dc64 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -1398,14 +1398,15 @@ class SearchChatMessagesRequest : public RequestActor<> { int32 offset_; int32 limit_; MessageSearchFilter filter_; + MessageId top_thread_message_id_; int64 random_id_; std::pair> messages_; void do_run(Promise &&promise) override { messages_ = td->messages_manager_->search_dialog_messages(dialog_id_, query_, sender_user_id_, from_message_id_, - offset_, limit_, filter_, random_id_, get_tries() == 3, - std::move(promise)); + offset_, limit_, filter_, top_thread_message_id_, + random_id_, get_tries() == 3, std::move(promise)); } void do_send_result() override { @@ -1424,7 +1425,7 @@ class SearchChatMessagesRequest : public RequestActor<> { public: SearchChatMessagesRequest(ActorShared td, uint64 request_id, int64 dialog_id, string query, int32 user_id, int64 from_message_id, int32 offset, int32 limit, - tl_object_ptr filter) + tl_object_ptr filter, int64 message_thread_id) : RequestActor(std::move(td), request_id) , dialog_id_(dialog_id) , query_(std::move(query)) @@ -1433,6 +1434,7 @@ class SearchChatMessagesRequest : public RequestActor<> { , offset_(offset) , limit_(limit) , filter_(get_message_search_filter(filter)) + , top_thread_message_id_(message_thread_id) , random_id_(0) { set_tries(3); } @@ -5459,7 +5461,8 @@ void Td::on_request(uint64 id, td_api::searchChatMessages &request) { CHECK_IS_USER(); CLEAN_INPUT_STRING(request.query_); CREATE_REQUEST(SearchChatMessagesRequest, request.chat_id_, std::move(request.query_), request.sender_user_id_, - request.from_message_id_, request.offset_, request.limit_, std::move(request.filter_)); + request.from_message_id_, request.offset_, request.limit_, std::move(request.filter_), + request.message_thread_id_); } void Td::on_request(uint64 id, td_api::searchSecretMessages &request) { diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 1693fa3cc..81f6bcc98 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -319,7 +319,7 @@ class CliClient final : public Actor { LOG(ERROR) << (last_message_id >> 20); send_request(td_api::make_object( search_chat_id_, "", 0, last_message_id, 0, 100, - td_api::make_object())); + td_api::make_object(), 0)); } else { search_chat_id_ = 0; } @@ -1864,7 +1864,7 @@ class CliClient final : public Actor { search_chat_id_ = as_chat_id(args); send_request(td_api::make_object( - search_chat_id_, "", 0, 0, 0, 100, td_api::make_object())); + search_chat_id_, "", 0, 0, 0, 100, td_api::make_object(), 0)); } else if (op == "Search" || op == "SearchA" || op == "SearchM") { string from_date; string limit; @@ -1899,7 +1899,7 @@ class CliClient final : public Actor { } send_request(td_api::make_object(as_chat_id(chat_id), query, 0, 0, 0, - to_integer(limit), nullptr)); + to_integer(limit), nullptr, 0)); } else if (op == "SMME") { string chat_id; string limit; @@ -1910,7 +1910,7 @@ class CliClient final : public Actor { } send_request(td_api::make_object(as_chat_id(chat_id), "", my_id_, 0, 0, - to_integer(limit), nullptr)); + to_integer(limit), nullptr, 0)); } else if (op == "SMU") { string chat_id; string user_id; @@ -1923,7 +1923,7 @@ class CliClient final : public Actor { } send_request(td_api::make_object(as_chat_id(chat_id), "", as_user_id(user_id), 0, 0, - to_integer(limit), nullptr)); + to_integer(limit), nullptr, 0)); } else if (op == "SM") { string chat_id; string filter; @@ -1947,7 +1947,7 @@ class CliClient final : public Actor { send_request(td_api::make_object( as_chat_id(chat_id), "", 0, as_message_id(offset_message_id), to_integer(offset), - to_integer(limit), as_search_messages_filter(filter))); + to_integer(limit), as_search_messages_filter(filter), 0)); } else if (op == "SC") { string limit; string offset_message_id; @@ -1992,7 +1992,7 @@ class CliClient final : public Actor { } send_request(td_api::make_object( as_chat_id(chat_id), query, 0, as_message_id(offset_message_id), 0, to_integer(limit), - td_api::make_object())); + td_api::make_object(), 0)); } else if (op == "SearchDocument") { string chat_id; string offset_message_id; @@ -2010,7 +2010,7 @@ class CliClient final : public Actor { } send_request(td_api::make_object( as_chat_id(chat_id), query, 0, to_integer(offset_message_id), 0, to_integer(limit), - td_api::make_object())); + td_api::make_object(), 0)); } else if (op == "SearchPhoto") { string chat_id; string offset_message_id; @@ -2028,7 +2028,7 @@ class CliClient final : public Actor { } send_request(td_api::make_object( as_chat_id(chat_id), query, 0, as_message_id(offset_message_id), 0, to_integer(limit), - td_api::make_object())); + td_api::make_object(), 0)); } else if (op == "SearchChatPhoto") { string chat_id; string offset_message_id; @@ -2046,7 +2046,7 @@ class CliClient final : public Actor { } send_request(td_api::make_object( as_chat_id(chat_id), query, 0, as_message_id(offset_message_id), 0, to_integer(limit), - td_api::make_object())); + td_api::make_object(), 0)); } else if (op == "gcmc") { string chat_id; string filter; From 0540ae7b60e7daaf0e9ff397cb2164f3b43ed5aa Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 8 Sep 2020 14:58:02 +0300 Subject: [PATCH 2/4] Add min_date/max_date to searchMessages. GitOrigin-RevId: a340969e431dd2de018461f3904da6569a91b166 --- td/generate/scheme/td_api.tl | 4 +++- td/generate/scheme/td_api.tlo | Bin 180972 -> 181044 bytes td/telegram/MessagesManager.cpp | 22 ++++++++++++++-------- td/telegram/MessagesManager.h | 6 +++--- td/telegram/Td.cpp | 14 +++++++++----- td/telegram/cli.cpp | 4 ++-- 6 files changed, 31 insertions(+), 19 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index f49662885..b5b695ced 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -3622,7 +3622,9 @@ searchChatMessages chat_id:int53 query:string sender_user_id:int32 from_message_ //@offset_message_id The message identifier of the last found message, or 0 for the first request //@limit The maximum number of messages to be returned; up to 100. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached //@filter Filter for message content in the search results; searchMessagesFilterCall, searchMessagesFilterMissedCall, searchMessagesFilterMention, searchMessagesFilterUnreadMention and searchMessagesFilterFailedToSend are unsupported in this function -searchMessages chat_list:ChatList query:string offset_date:int32 offset_chat_id:int53 offset_message_id:int53 limit:int32 filter:SearchMessagesFilter = Messages; +//@min_date If not 0, the minimum date of the messages to return +//@max_date If not 0, the maximum date of the messages to return +searchMessages chat_list:ChatList query:string offset_date:int32 offset_chat_id:int53 offset_message_id:int53 limit:int32 filter:SearchMessagesFilter min_date:int32 max_date:int32 = Messages; //@description Searches for messages in secret chats. Returns the results in reverse chronological order. For optimal performance the number of returned messages is chosen by the library //@chat_id Identifier of the chat in which to search. Specify 0 to search in all secret chats diff --git a/td/generate/scheme/td_api.tlo b/td/generate/scheme/td_api.tlo index 74b6d8b404ea87fc87746e641d8a0c59e47cf525..815ea4c71a77d5bc1674d866b2035d7390213be1 100644 GIT binary patch delta 94 zcmV-k0HOcvg$uNX3xI?Hv;v@u9g=~Q@(y!lVRB<=O=WX)VP|D?01-k2|JlY8ObM4k z+W{+=oaO-_mk5jkvMPaaV`NL1qf|ncwduYoFkVIDgh9;)QkccHuqm6 AFaQ7m delta 74 zcmV-Q0JZnet_query_creator().create(telegram_api::messages_searchGlobal( - flags, folder_id.get(), query, get_input_messages_filter(filter), 0, 0, offset_date_, std::move(input_peer), - offset_message_id.get_server_message_id().get(), limit))); + flags, folder_id.get(), query, get_input_messages_filter(filter), min_date_, max_date_, offset_date_, + std::move(input_peer), offset_message_id.get_server_message_id().get(), limit))); } void on_result(uint64 id, BufferSlice packet) override { @@ -1698,8 +1702,8 @@ class SearchMessagesGlobalQuery : public Td::ResultHandler { auto info = td->messages_manager_->on_get_messages(result_ptr.move_as_ok(), "SearchMessagesGlobalQuery"); td->messages_manager_->on_get_messages_search_result(query_, offset_date_, offset_dialog_id_, offset_message_id_, - limit_, filter_, random_id_, info.total_count, - std::move(info.messages)); + limit_, filter_, min_date_, max_date_, random_id_, + info.total_count, std::move(info.messages)); promise_.set_value(Unit()); } @@ -8794,7 +8798,8 @@ void MessagesManager::on_failed_dialog_messages_search(DialogId dialog_id, int64 void MessagesManager::on_get_messages_search_result(const string &query, int32 offset_date, DialogId offset_dialog_id, MessageId offset_message_id, int32 limit, - MessageSearchFilter filter, int64 random_id, int32 total_count, + MessageSearchFilter filter, int32 min_date, int32 max_date, + int64 random_id, int32 total_count, vector> &&messages) { LOG(INFO) << "Receive " << messages.size() << " found messages"; auto it = found_messages_.find(random_id); @@ -19300,7 +19305,8 @@ void MessagesManager::on_messages_db_calls_result(Result std::pair> MessagesManager::search_messages( FolderId folder_id, bool ignore_folder_id, const string &query, int32 offset_date, DialogId offset_dialog_id, - MessageId offset_message_id, int32 limit, MessageSearchFilter filter, int64 &random_id, Promise &&promise) { + MessageId offset_message_id, int32 limit, MessageSearchFilter filter, int32 min_date, int32 max_date, + int64 &random_id, Promise &&promise) { if (random_id != 0) { // request has already been sent before auto it = found_messages_.find(random_id); @@ -19357,7 +19363,7 @@ std::pair> MessagesManager::search_messages( td_->create_handler(std::move(promise)) ->send(folder_id, ignore_folder_id, query, offset_date, offset_dialog_id, offset_message_id, limit, filter, - random_id); + min_date, max_date, random_id); return {}; } diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 6a01c181d..041a6e20b 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -240,7 +240,7 @@ class MessagesManager : public Actor { void on_get_messages_search_result(const string &query, int32 offset_date, DialogId offset_dialog_id, MessageId offset_message_id, int32 limit, MessageSearchFilter filter, - int64 random_id, int32 total_count, + int32 min_date, int32 max_date, int64 random_id, int32 total_count, vector> &&messages); void on_failed_messages_search(int64 random_id); @@ -678,8 +678,8 @@ class MessagesManager : public Actor { std::pair> search_messages(FolderId folder_id, bool ignore_folder_id, const string &query, int32 offset_date, DialogId offset_dialog_id, MessageId offset_message_id, - int32 limit, MessageSearchFilter filter, int64 &random_id, - Promise &&promise); + int32 limit, MessageSearchFilter filter, int32 min_date, + int32 max_date, int64 &random_id, Promise &&promise); std::pair> search_call_messages(MessageId from_message_id, int32 limit, bool only_missed, int64 &random_id, bool use_db, Promise &&promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 94b74dc64..a8a59d7d2 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -1481,14 +1481,16 @@ class SearchMessagesRequest : public RequestActor<> { MessageId offset_message_id_; int32 limit_; MessageSearchFilter filter_; + int32 min_date_; + int32 max_date_; int64 random_id_; std::pair> messages_; void do_run(Promise &&promise) override { - messages_ = - td->messages_manager_->search_messages(folder_id_, ignore_folder_id_, query_, offset_date_, offset_dialog_id_, - offset_message_id_, limit_, filter_, random_id_, std::move(promise)); + messages_ = td->messages_manager_->search_messages(folder_id_, ignore_folder_id_, query_, offset_date_, + offset_dialog_id_, offset_message_id_, limit_, filter_, + min_date_, max_date_, random_id_, std::move(promise)); } void do_send_result() override { @@ -1507,7 +1509,7 @@ class SearchMessagesRequest : public RequestActor<> { public: SearchMessagesRequest(ActorShared td, uint64 request_id, FolderId folder_id, bool ignore_folder_id, string query, int32 offset_date, int64 offset_dialog_id, int64 offset_message_id, int32 limit, - tl_object_ptr &&filter) + tl_object_ptr &&filter, int32 min_date, int32 max_date) : RequestActor(std::move(td), request_id) , folder_id_(folder_id) , ignore_folder_id_(ignore_folder_id) @@ -1517,6 +1519,8 @@ class SearchMessagesRequest : public RequestActor<> { , offset_message_id_(offset_message_id) , limit_(limit) , filter_(get_message_search_filter(filter)) + , min_date_(min_date) + , max_date_(max_date) , random_id_(0) { } }; @@ -5482,7 +5486,7 @@ void Td::on_request(uint64 id, td_api::searchMessages &request) { } CREATE_REQUEST(SearchMessagesRequest, dialog_list_id.get_folder_id(), request.chat_list_ == nullptr, std::move(request.query_), request.offset_date_, request.offset_chat_id_, request.offset_message_id_, - request.limit_, std::move(request.filter_)); + request.limit_, std::move(request.filter_), request.min_date_, request.max_date_); } void Td::on_request(uint64 id, td_api::searchCallMessages &request) { diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 81f6bcc98..94d67d5a4 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -1885,8 +1885,8 @@ class CliClient final : public Actor { chat_list = td_api::make_object(); } send_request(td_api::make_object( - std::move(chat_list), query, to_integer(from_date), 2147482647, 0, to_integer(limit), - as_search_messages_filter(filter))); + std::move(chat_list), query, to_integer(from_date), 2147483647, 0, to_integer(limit), + as_search_messages_filter(filter), 1, 2147483647)); } else if (op == "SCM") { string chat_id; string limit; From f05b8cec6168ad3e35e9827451df19270daaf69d Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 8 Sep 2020 22:08:10 +0300 Subject: [PATCH 3/4] Update layer 119. Add sender_chat_id. GitOrigin-RevId: ac837165b7bbd57631456291503e688339e04d03 --- td/generate/scheme/td_api.tl | 11 +- td/generate/scheme/td_api.tlo | Bin 181044 -> 181232 bytes td/generate/scheme/telegram_api.tl | 22 ++- td/generate/scheme/telegram_api.tlo | Bin 215056 -> 215360 bytes td/telegram/DialogParticipant.cpp | 2 +- td/telegram/MessageReplyInfo.cpp | 14 +- td/telegram/MessageReplyInfo.h | 1 - td/telegram/MessagesManager.cpp | 294 +++++++++++++++++----------- td/telegram/MessagesManager.h | 25 +-- td/telegram/NotificationManager.cpp | 86 +++++--- td/telegram/NotificationManager.h | 9 +- td/telegram/NotificationType.cpp | 28 +-- td/telegram/NotificationType.h | 7 +- td/telegram/UpdatesManager.cpp | 61 +++--- 14 files changed, 330 insertions(+), 230 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index b5b695ced..7e0e62e21 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -617,6 +617,9 @@ secretChat id:int32 user_id:int32 state:SecretChatState is_outbound:Bool ttl:int //@description The message was originally written by a known user @sender_user_id Identifier of the user that originally sent the message messageForwardOriginUser sender_user_id:int32 = MessageForwardOrigin; +//@description The message was originally written by an anonimous chat administrator on behalf of the chat @sender_chat_id Identifier of the chat that originally sent the message +messageForwardOriginChat sender_chat_id:int53 = MessageForwardOrigin; + //@description The message was originally written by a user, which is hidden by their privacy settings @sender_name Name of the sender messageForwardOriginHiddenUser sender_name:string = MessageForwardOrigin; @@ -655,7 +658,8 @@ messageSendingStateFailed error_code:int32 error_message:string can_retry:Bool r //@description Describes a message //@id Message identifier, unique for the chat to which the message belongs -//@sender_user_id Identifier of the user who sent the message; 0 if unknown. Currently, it is unknown for channel posts and for channel posts automatically forwarded to discussion group +//@sender_user_id Identifier of the user who sent the message; 0 if unknown. Currently, it is unknown for channel posts, for channel posts automatically forwarded to discussion group and for anonimously sent supergroup messages +//@sender_chat_id Identifier of the chat on behalf of which the message was sent; 0 if none //@chat_id Chat identifier //@sending_state Information about the sending state of the message; may be null //@scheduling_state Information about the scheduling state of the message; may be null @@ -681,7 +685,7 @@ messageSendingStateFailed error_code:int32 error_message:string can_retry:Bool r //@restriction_reason If non-empty, contains a human-readable description of the reason why access to this message must be restricted //@content Content of the message //@reply_markup Reply markup for the message; may be null -message id:int53 sender_user_id:int32 chat_id:int53 sending_state:MessageSendingState scheduling_state:MessageSchedulingState is_outgoing:Bool can_be_edited:Bool can_be_forwarded:Bool can_be_deleted_only_for_self:Bool can_be_deleted_for_all_users:Bool can_get_statistics:Bool can_get_replies:Bool is_channel_post:Bool contains_unread_mention:Bool date:int32 edit_date:int32 forward_info:messageForwardInfo interaction_info:messageInteractionInfo reply_to_message_id:int53 ttl:int32 ttl_expires_in:double via_bot_user_id:int32 author_signature:string media_album_id:int64 restriction_reason:string content:MessageContent reply_markup:ReplyMarkup = Message; +message id:int53 sender_user_id:int32 sender_chat_id:int53 chat_id:int53 sending_state:MessageSendingState scheduling_state:MessageSchedulingState is_outgoing:Bool can_be_edited:Bool can_be_forwarded:Bool can_be_deleted_only_for_self:Bool can_be_deleted_for_all_users:Bool can_get_statistics:Bool can_get_replies:Bool is_channel_post:Bool contains_unread_mention:Bool date:int32 edit_date:int32 forward_info:messageForwardInfo interaction_info:messageInteractionInfo reply_to_message_id:int53 ttl:int32 ttl_expires_in:double via_bot_user_id:int32 author_signature:string media_album_id:int64 restriction_reason:string content:MessageContent reply_markup:ReplyMarkup = Message; //@description Contains a list of messages @total_count Approximate total count of messages found @messages List of messages; messages may be null messages total_count:int32 messages:vector = Messages; @@ -2535,10 +2539,11 @@ notificationTypeNewCall call_id:int32 = NotificationType; //@description New message was received through a push notification //@message_id The message identifier. The message will not be available in the chat history, but the ID can be used in viewMessages and as reply_to_message_id //@sender_user_id Sender of the message; 0 if unknown. Corresponding user may be inaccessible +//@sender_chat_id Sender chat of the message; 0 if none //@sender_name Name of the sender; can be different from the name of the sender user //@is_outgoing True, if the message is outgoing //@content Push message content -notificationTypeNewPushMessage message_id:int53 sender_user_id:int32 sender_name:string is_outgoing:Bool content:PushMessageContent = NotificationType; +notificationTypeNewPushMessage message_id:int53 sender_user_id:int32 sender_chat_id:int53 sender_name:string is_outgoing:Bool content:PushMessageContent = NotificationType; //@class NotificationGroupType @description Describes the type of notifications in a notification group diff --git a/td/generate/scheme/td_api.tlo b/td/generate/scheme/td_api.tlo index 815ea4c71a77d5bc1674d866b2035d7390213be1..56c6c485a530576015ec7e8d73879e65ac3660a8 100644 GIT binary patch delta 991 zcmZuwO-vJE5bX@5Y@uoui3JK4SsRdzS=t^n5!s|1H0eQOql9pJYc-o{if7n+|!$R^IqP}?mii> zSevNO&sJOSz5YGR2C5%g53YKzFn5iM$qrX4RPzR{zYfQ)rrdR-mC&A=R4;hNY)U$H zq=Ho89#5$$2X;BSn@#l`Dyr5uRh_*>T+EL-aH76=e?UGWTA9Zw9nO3$D)c)?>#OOP!QF2)T9e6K1s^IO=hNDH6d18KWi zng+lxet{OIX;PJ#u+a0qzP!8tEe2e?L55wmBe`xtk;AoLKQ(V1j-Ky}4zY#)I_9}8 zi39QJMofBcqfB|{;dhfLQERCc3e`nwSNF^$fK12 delta 960 zcmZ{iQAkr^6vsWs&92VS65*;#SKg`B$h9pPv|_NN0s{lVC3{gfidY5uvIm0(q69)$ zzU&CS+y@~a41`Hv51A9f9ugF?hr)*i5i+*nwj=KYO`uHO5Y6! zcl8ds>}ETNbfQJf42BM@_71J0LkGOf+oAkT&YFLn>aRB=jy*_>j11gOnEZA1WOtJo zcvDB+3Ir*yqf4$Suw8ET$i-^-S#O<|j5Dyqq_;wlDX4*$DXBq#X;uRdQ#gRP$?b+t zYbm2{NP!hgu>lNFD2laGZHE-^MH^j(y%*2Htj+ovGS&&Q03MtOh&jcS%upc$zBJ3aI=_?Vozaz)JVUG9jv`8(LdL?fF5=yeW)Gj z71@tLmg4^X5Z#ZXtkni^^M4I;<`Vuo&aNK89*g951mnfaT%>6t#~%R6PZ%d3$V*K1Z#1i0~`)(8e@o w&zjHV;Jsd#H7^|_iHGr9hhM#2tPHnP?gh?q*d*aXjfGSQ+hWl*hZ{|Q0aGZAYXATM diff --git a/td/generate/scheme/telegram_api.tl b/td/generate/scheme/telegram_api.tl index 4e57dd8fc..25303aefb 100644 --- a/td/generate/scheme/telegram_api.tl +++ b/td/generate/scheme/telegram_api.tl @@ -128,8 +128,8 @@ chatPhotoEmpty#37c1011c = ChatPhoto; chatPhoto#d20b9f3c flags:# has_video:flags.0?true photo_small:FileLocation photo_big:FileLocation dc_id:int = ChatPhoto; messageEmpty#83e5de54 id:int = Message; -message#8a7e027d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int reply_to_top_id:flags.24?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector = Message; -messageService#9e19a1f6 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?int to_id:Peer reply_to_msg_id:flags.3?int date:int action:MessageAction = Message; +message#58ae39c9 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector = Message; +messageService#286fa604 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction = Message; messageMediaEmpty#3ded6320 = MessageMedia; messageMediaPhoto#695150d7 flags:# photo:flags.0?Photo ttl_seconds:flags.2?int = MessageMedia; @@ -357,8 +357,8 @@ updates.differenceSlice#a8fb1981 new_messages:Vector new_encrypted_mess updates.differenceTooLong#4afe8f6d pts:int = updates.Difference; updatesTooLong#e317af7e = Updates; -updateShortMessage#914fbf11 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int user_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int entities:flags.7?Vector = Updates; -updateShortChatMessage#16812688 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int from_id:int chat_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int entities:flags.7?Vector = Updates; +updateShortMessage#2296d2c8 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int user_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector = Updates; +updateShortChatMessage#402d5dbb flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int from_id:int chat_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector = Updates; updateShort#78d4dec1 update:Update date:int = Updates; updatesCombined#725b04c3 updates:Vector users:Vector chats:Vector date:int seq_start:int seq:int = Updates; updates#74ae4240 updates:Vector users:Vector chats:Vector date:int seq:int = Updates; @@ -591,7 +591,7 @@ channelMessagesFilter#cd77d957 flags:# exclude_new_messages:flags.1?true ranges: channelParticipant#15ebac1d user_id:int date:int = ChannelParticipant; channelParticipantSelf#a3289a6d user_id:int inviter_id:int date:int = ChannelParticipant; -channelParticipantCreator#808d15a4 flags:# user_id:int rank:flags.0?string = ChannelParticipant; +channelParticipantCreator#447dca4b flags:# user_id:int admin_rights:ChatAdminRights rank:flags.0?string = ChannelParticipant; channelParticipantAdmin#ccbebbaf flags:# can_edit:flags.0?true self:flags.1?true user_id:int inviter_id:flags.1?int promoted_by:int date:int admin_rights:ChatAdminRights rank:flags.2?string = ChannelParticipant; channelParticipantBanned#1c0facaf flags:# left:flags.0?true user_id:int kicked_by:int date:int banned_rights:ChatBannedRights = ChannelParticipant; @@ -638,7 +638,7 @@ messages.botResults#947ca848 flags:# gallery:flags.0?true query_id:long next_off exportedMessageLink#5dab1af4 link:string html:string = ExportedMessageLink; -messageFwdHeader#353a686b flags:# from_id:flags.0?int from_name:flags.5?string date:int channel_id:flags.1?int channel_post:flags.2?int post_author:flags.3?string saved_from_peer:flags.4?Peer saved_from_msg_id:flags.4?int psa_type:flags.6?string = MessageFwdHeader; +messageFwdHeader#5f777dce flags:# from_id:flags.0?Peer from_name:flags.5?string date:int channel_post:flags.2?int post_author:flags.3?string saved_from_peer:flags.4?Peer saved_from_msg_id:flags.4?int psa_type:flags.6?string = MessageFwdHeader; auth.codeTypeSms#72a3158c = auth.CodeType; auth.codeTypeCall#741cd3e3 = auth.CodeType; @@ -1019,7 +1019,7 @@ chatOnlines#f041e250 onlines:int = ChatOnlines; statsURL#47a971e0 url:string = StatsURL; -chatAdminRights#5fb224d5 flags:# change_info:flags.0?true post_messages:flags.1?true edit_messages:flags.2?true delete_messages:flags.3?true ban_users:flags.4?true invite_users:flags.5?true pin_messages:flags.7?true add_admins:flags.9?true = ChatAdminRights; +chatAdminRights#5fb224d5 flags:# change_info:flags.0?true post_messages:flags.1?true edit_messages:flags.2?true delete_messages:flags.3?true ban_users:flags.4?true invite_users:flags.5?true pin_messages:flags.7?true add_admins:flags.9?true anonymous:flags.10?true = ChatAdminRights; chatBannedRights#9f120418 flags:# view_messages:flags.0?true send_messages:flags.1?true send_media:flags.2?true send_stickers:flags.3?true send_gifs:flags.4?true send_games:flags.5?true send_inline:flags.6?true embed_links:flags.7?true send_polls:flags.8?true change_info:flags.10?true invite_users:flags.15?true pin_messages:flags.17?true until_date:int = ChatBannedRights; @@ -1147,8 +1147,6 @@ help.country#c3878e23 flags:# hidden:flags.0?true iso2:string default_name:strin help.countriesListNotModified#93cc1f32 = help.CountriesList; help.countriesList#87d0759e countries:Vector hash:int = help.CountriesList; -messageReplies#82e3c815 flags:# comments:flags.0?true replies:int replies_pts:int recent_repliers:flags.1?Vector channel_id:flags.0?int = MessageReplies; - messageViews#455b853d flags:# views:flags.0?int forwards:flags.1?int replies:flags.2?MessageReplies = MessageViews; messages.messageViews#2c3f2ae2 views:Vector users:Vector = messages.MessageViews; @@ -1157,6 +1155,10 @@ stats.messageStats#8999f295 views_graph:StatsGraph = stats.MessageStats; messages.discussionMessage#d25fad90 message:Message read_max_id:int chats:Vector users:Vector = messages.DiscussionMessage; +messageReplyHeader#a6d57763 flags:# reply_to_msg_id:int reply_to_peer_id:flags.0?Peer reply_to_top_id:flags.1?int = MessageReplyHeader; + +messageReplies#4128faac flags:# comments:flags.0?true replies:int replies_pts:int recent_repliers:flags.1?Vector channel_id:flags.0?int max_id:flags.2?int read_max_id:flags.3?int = MessageReplies; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -1289,7 +1291,7 @@ messages.receivedMessages#5a954c0 max_id:int = Vector; messages.setTyping#a3825e50 peer:InputPeer action:SendMessageAction = Bool; messages.sendMessage#520c3870 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int = Updates; messages.sendMedia#3491eba9 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int = Updates; -messages.forwardMessages#d9fee60e flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true grouped:flags.9?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer schedule_date:flags.10?int = Updates; +messages.forwardMessages#d9fee60e flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer schedule_date:flags.10?int = Updates; messages.reportSpam#cf1592db peer:InputPeer = Bool; messages.getPeerSettings#3672e09c peer:InputPeer = PeerSettings; messages.report#bd82b658 peer:InputPeer id:Vector reason:ReportReason = Bool; diff --git a/td/generate/scheme/telegram_api.tlo b/td/generate/scheme/telegram_api.tlo index 5fd375dff2dc75a97527c6e71b7d3afe1ce45125..5485b3fae21f2e7561a4a98cd5391dee250143bd 100644 GIT binary patch delta 2768 zcma)8e{54#6y7Z`dD`Y&V~qxiGm?x}eyeTUqim+u>-peXxCN9kb0D zu=W1xUde{%xaVxy`tiP^>QGx-{k@^PLM=_(R)^{v*n;WB$%#25vTglS9X}*f3s*a! zCJ8sT&CS)Ja@e{%=Chva8UdWCc4fKC?ySl>#qYeBtMd>g!)t>EEApKJRo2PouXtie zk2Al&>t8~NbrondO8VAErimnf8Tbv0$s66mHChH9<_*ZKWn+cIXlaV^@x1AQHScY& zWP=-3Q4>8-N=FhfpTz>@%(uz(1~&;LHn_Yrd1TX#Ad)WxJi>_ecv8!MTNiy8n0?Z%IEvSF6`N3@uG(X(N=53fq!J8mInZB2Vp_WwCnqrq^rp z9uV5=F$(?&Ug|szFOzo`xT#5o6mveKN-GjiI(2-AAtXpp^Dp2QN`z0V?dw zVVQ!04(#!cWI%bHWOZ+d1=|4^%?}ZO1Z*qM^B_-T;-4iY1_-qfn;}_d!g_c8m;x zKQG(S@h+5Lw!?M|&Wpt*e*#>Z`USXhjoH(eM~tM_atdPL(|1&VIsJmItEPGMozi{T z7asYrdtuSTEe-XN(E4z5YouCCU5=io`An}x4 ze*>fc2f1V_^3a!K?K85F^*D8%*d~FW-KiClI=?!3ag~!xBwhgAqB`kb!>Rfb+Hf4LDXP zYJ6c%z;Ukyn{LEj>I>r;5p~^<=XH#o#!=(PV}(MH%r@@SA+^p&ar`P_24m_ zLK5oRgI*Cny$4ffIQA0u2%w5MmI$kFFM22%$0~75$0rfYfQtrB@y!cAhN?*E+KVH? z^6x|Q`QrO5Jnmb{s<$jMGBnqIOii0i=3kWWU=ej5LWl5GzCPK_;!E+r`}W%opd>1k z7dhQj!s-@CpywY0>4b%BRFo&JieM6Z&5C}j*4J-F8UIP3o_-t_8Nq{?5ti#!-gc6= z)^i9Wrlv{?`;8oJB!$DdhRHHV%S7GCTj-vgV4%{^VHtUjn%CDVk7CS(IWveA0>(Xr z7iWs! zC-n&%MHl%laGJq$IE!tb$Rp)5>?i*?mJ3=t$I;w-7Ja&u-v0t0r}i)TmKooNz*iV^ zTAzZc-$l)l#&nU9$ccNpzcrsztNIyTGX%isacd#se_(@of4LUKmK^j+s|5gy{o>UI zilkj;N{vGjo1%3%qB8kwlPC>e zA&HixTq1sVu_R`uJHzGbyG-JbUM%@UQL5M^LFrY8nu1_r4H z4N*)gci}8yYQYT_L!{c_Eri6Piy=niz@b8_>qMpEBu!k*ek|g>_q`o;!FYe2^PKOm z_a+aOM#XrqfOHV zYBX*#x!I@1rsy@Wl4CIzYpfLZ?7tHp7aw<_79$>P?keOev320#R<0-QoQUr3GHXHf zA}=p4_4Zf48J4n7TDej1Z>*t3L$HJb16V9Yp0aVv#8bM9Y+X&f+PfY&?Ah+%M0k5f zBjSOl?Q^8bI!8R&76d7>uQ=Ya%N6DIN8fcU*V>X7elPBOz36#=XXnmm{i^KB=T&Yi zJ(PiOC|n74%9cTbrrNQxsH=TPTZ_R!$#QUNQy|j~sFlk4ERLn zB~h#=VW6YsFrQ*hD5a)SR-t7;!ga7wxC(4qx$4chjFw~Lfq1O1f! z2u%5YtdvY(2~+Ikj1wZLwLtD(4-LEd&e7fHVTWw{2%@HZ!2TI{it>Tf7huDDpyex= za_kp~!JS4OJysxX@0&}h>mZtEyF9Ss<#{Azz@pux?8?B% z|2olB>D&#law>I0xgFIpiNAwTqEc!lg>-Qn&Zpq-kQHW!t$+A~t|DGZr)C+RfDHE$ z_yg>m@@#<`dOico4s}=$$HB!{rmsTTvB*tm(3IrwZ-Vze-cr*NY@qJN7|~c+VY7?1 z<)UmQhA8$Rn&{vIIQVaDNFUe_z*doIBNo!%mH3=&dyYspEKotC&7S2bEpT z*-oFxQJTOrsIzit5EF%YCcaZx%h|qDcg~rn|3h%X8$-rzeR0(Ha43$B*;wsRE`3FB zHN7>2%eYEn2v2I16n)o1;nQg5c<+1t88Kbob~uUucw%Gd>(@X*5| zxyR5z!Dmou3{gzm$G%Dls@8+V<{9lB>(&amg!RML7&UEQfLgt%A#jG z+FuO%TTp-GO6Xz%TR`uR;g7u9gK3Ofa_`CPmr-sQ$8?pZsARobT0Opyd;*j(^)>9C zL}3nh61{~YFLU%3w(vwK@C4{!5LhGkBA=VfhIRS=YQ_&h5?>JIR5klv7bNC0eg&#P ztF+$261s4Dfi9%T8W2e_8zK8b7T}5WE@V6=&2*kbE92X6Xxu?*3o}u_mDO|oj8)Hp zOpDllUPA98mf-6yd0IvC*w{8wTD^h3+Q0<5e<|ZjE&G--w|*9}<*bJrH?Cm498@=S zBBT6RYpa-@k}0&`Ze93Z*29leQhu3-eag>r;@e{K)vzdcV_d_&M4n>0K`GO?E*GG0 I9qXU_54*6q9smFU diff --git a/td/telegram/DialogParticipant.cpp b/td/telegram/DialogParticipant.cpp index f32cc0f1a..fc46bce06 100644 --- a/td/telegram/DialogParticipant.cpp +++ b/td/telegram/DialogParticipant.cpp @@ -158,7 +158,7 @@ tl_object_ptr DialogParticipantStatus::get_chat_a LOG(INFO) << "Create chat admin rights " << flags; return make_tl_object(flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, - false /*ignored*/, false /*ignored*/); + false /*ignored*/, false /*ignored*/, false /*ignored*/); } tl_object_ptr DialogParticipantStatus::get_chat_banned_rights() const { diff --git a/td/telegram/MessageReplyInfo.cpp b/td/telegram/MessageReplyInfo.cpp index faa84002b..e4e77a85e 100644 --- a/td/telegram/MessageReplyInfo.cpp +++ b/td/telegram/MessageReplyInfo.cpp @@ -6,6 +6,8 @@ // #include "td/telegram/MessageReplyInfo.h" +#include "td/telegram/DialogId.h" + #include "td/utils/logging.h" namespace td { @@ -22,12 +24,14 @@ MessageReplyInfo::MessageReplyInfo(tl_object_ptr & pts = reply_info->replies_pts_; if (!is_bot) { - for (auto &user_id_int : reply_info->recent_repliers_) { - UserId user_id(user_id_int); - if (user_id.is_valid()) { - recent_replier_user_ids.push_back(user_id); + for (auto &peer : reply_info->recent_repliers_) { + DialogId dialog_id(peer); + if (dialog_id.is_valid()) { + if (dialog_id.get_type() == DialogType::User) { + recent_replier_user_ids.push_back(dialog_id.get_user_id()); + } } else { - LOG(ERROR) << "Receive " << user_id << " as a recent replier"; + LOG(ERROR) << "Receive " << dialog_id << " as a recent replier"; } } } diff --git a/td/telegram/MessageReplyInfo.h b/td/telegram/MessageReplyInfo.h index 07e4c65c0..c7ae14dc8 100644 --- a/td/telegram/MessageReplyInfo.h +++ b/td/telegram/MessageReplyInfo.h @@ -55,7 +55,6 @@ struct MessageReplyInfo { template void parse(ParserT &parser) { - CHECK(!is_empty()); bool has_recent_replier_user_ids = !recent_replier_user_ids.empty(); bool has_channel_id = channel_id.is_valid(); BEGIN_PARSE_FLAGS(); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 15e66c183..19cb1a1aa 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -1583,6 +1583,7 @@ class SearchMessagesQuery : public Td::ResultHandler { int32 offset_; int32 limit_; MessageSearchFilter filter_; + MessageId top_thread_message_id_; int64 random_id_; public: @@ -1606,6 +1607,7 @@ class SearchMessagesQuery : public Td::ResultHandler { offset_ = offset; limit_ = limit; filter_ = filter; + top_thread_message_id_ = top_thread_message_id; random_id_ = random_id; if (filter == MessageSearchFilter::UnreadMention) { @@ -1640,8 +1642,8 @@ class SearchMessagesQuery : public Td::ResultHandler { auto info = td->messages_manager_->on_get_messages(result_ptr.move_as_ok(), "SearchMessagesQuery"); td->messages_manager_->on_get_dialog_messages_search_result(dialog_id_, query_, sender_user_id_, from_message_id_, - offset_, limit_, filter_, random_id_, info.total_count, - std::move(info.messages)); + offset_, limit_, filter_, top_thread_message_id_, + random_id_, info.total_count, std::move(info.messages)); promise_.set_value(Unit()); } @@ -4190,6 +4192,7 @@ void MessagesManager::Message::store(StorerT &storer) const { bool has_forward_psa_type = is_forwarded && !forward_info->psa_type.empty(); bool has_forward_count = forward_count > 0; bool has_reply_info = !reply_info.is_empty(); + bool has_sender_dialog_id = sender_dialog_id.is_valid(); BEGIN_STORE_FLAGS(); STORE_FLAG(is_channel_post); STORE_FLAG(is_outgoing); @@ -4240,6 +4243,7 @@ void MessagesManager::Message::store(StorerT &storer) const { STORE_FLAG(has_forward_psa_type); STORE_FLAG(has_forward_count); STORE_FLAG(has_reply_info); + STORE_FLAG(has_sender_dialog_id); END_STORE_FLAGS(); } @@ -4260,7 +4264,7 @@ void MessagesManager::Message::store(StorerT &storer) const { if (is_forwarded) { store(forward_info->sender_user_id, storer); store(forward_info->date, storer); - store(forward_info->dialog_id, storer); + store(forward_info->sender_dialog_id, storer); store(forward_info->message_id, storer); if (has_forward_author_signature) { store(forward_info->author_signature, storer); @@ -4324,6 +4328,9 @@ void MessagesManager::Message::store(StorerT &storer) const { if (has_restriction_reasons) { store(restriction_reasons, storer); } + if (has_sender_dialog_id) { + store(sender_dialog_id, storer); + } store_message_content(content.get(), storer); if (has_reply_markup) { store(reply_markup, storer); @@ -4359,6 +4366,7 @@ void MessagesManager::Message::parse(ParserT &parser) { bool has_forward_psa_type = false; bool has_forward_count = false; bool has_reply_info = false; + bool has_sender_dialog_id = false; BEGIN_PARSE_FLAGS(); PARSE_FLAG(is_channel_post); PARSE_FLAG(is_outgoing); @@ -4409,6 +4417,7 @@ void MessagesManager::Message::parse(ParserT &parser) { PARSE_FLAG(has_forward_psa_type); PARSE_FLAG(has_forward_count); PARSE_FLAG(has_reply_info); + PARSE_FLAG(has_sender_dialog_id); END_PARSE_FLAGS(); } @@ -4435,7 +4444,7 @@ void MessagesManager::Message::parse(ParserT &parser) { forward_info = make_unique(); parse(forward_info->sender_user_id, parser); parse(forward_info->date, parser); - parse(forward_info->dialog_id, parser); + parse(forward_info->sender_dialog_id, parser); parse(forward_info->message_id, parser); if (has_forward_author_signature) { parse(forward_info->author_signature, parser); @@ -4499,6 +4508,9 @@ void MessagesManager::Message::parse(ParserT &parser) { if (has_restriction_reasons) { parse(restriction_reasons, parser); } + if (has_sender_dialog_id) { + parse(sender_dialog_id, parser); + } parse_message_content(content, parser); if (has_reply_markup) { parse(reply_markup, parser); @@ -8642,12 +8654,14 @@ void MessagesManager::on_failed_public_dialogs_search(const string &query, Statu void MessagesManager::on_get_dialog_messages_search_result(DialogId dialog_id, const string &query, UserId sender_user_id, MessageId from_message_id, int32 offset, int32 limit, MessageSearchFilter filter, - int64 random_id, int32 total_count, + MessageId top_thread_message_id, int64 random_id, + int32 total_count, vector> &&messages) { LOG(INFO) << "Receive " << messages.size() << " found messages in " << dialog_id; if (!dialog_id.is_valid()) { CHECK(query.empty()); CHECK(!sender_user_id.is_valid()); + CHECK(!top_thread_message_id.is_valid()); auto it = found_call_messages_.find(random_id); CHECK(it != found_call_messages_.end()); @@ -8753,7 +8767,7 @@ void MessagesManager::on_get_dialog_messages_search_result(DialogId dialog_id, c total_count = static_cast(result.size()); } if (query.empty() && !sender_user_id.is_valid() && filter != MessageSearchFilter::Empty && - G()->parameters().use_message_db) { + !top_thread_message_id.is_valid() && G()->parameters().use_message_db) { bool update_dialog = false; auto &old_message_count = d->message_count_by_index[message_search_filter_index(filter)]; @@ -9086,7 +9100,7 @@ bool MessagesManager::can_get_message_statistics(DialogId dialog_id, const Messa return false; } if (m == nullptr || m->message_id.is_scheduled() || !m->message_id.is_server() || m->view_count == 0 || - m->had_forward_info || (m->forward_info != nullptr && m->forward_info->dialog_id.is_valid())) { + m->had_forward_info || (m->forward_info != nullptr && m->forward_info->message_id.is_valid())) { return false; } return td_->contacts_manager_->can_get_channel_message_statistics(dialog_id); @@ -10797,37 +10811,21 @@ MessageId MessagesManager::get_message_id(const tl_object_ptr &message_ptr) const { - DialogId dialog_id; - UserId sender_user_id; switch (message_ptr->get_id()) { case telegram_api::messageEmpty::ID: return DialogId(); case telegram_api::message::ID: { auto message = static_cast(message_ptr.get()); - dialog_id = DialogId(message->to_id_); - if (message->flags_ & MESSAGE_FLAG_HAS_FROM_ID) { - sender_user_id = UserId(message->from_id_); - } - break; + return DialogId(message->peer_id_); } case telegram_api::messageService::ID: { auto message = static_cast(message_ptr.get()); - dialog_id = DialogId(message->to_id_); - if (message->flags_ & MESSAGE_FLAG_HAS_FROM_ID) { - sender_user_id = UserId(message->from_id_); - } - break; + return DialogId(message->peer_id_); } default: UNREACHABLE(); - break; + return DialogId(); } - - if (dialog_id == get_my_dialog_id()) { - LOG_IF(ERROR, !sender_user_id.is_valid()) << "Receive invalid " << sender_user_id; - return DialogId(sender_user_id); - } - return dialog_id; } FullMessageId MessagesManager::get_full_message_id(const tl_object_ptr &message_ptr, @@ -11974,22 +11972,6 @@ void MessagesManager::finish_add_secret_message(unique_ptr pending_secret_message->success_promise.set_value(Unit()); // TODO: set after message is saved } -void MessagesManager::fix_message_info_dialog_id(MessageInfo &message_info) const { - if (message_info.dialog_id != get_my_dialog_id()) { - return; - } - - UserId sender_user_id = message_info.sender_user_id; - if (!sender_user_id.is_valid()) { - LOG(ERROR) << "Receive invalid sender user id in private chat"; - return; - } - - message_info.dialog_id = DialogId(sender_user_id); - LOG_IF(ERROR, !message_info.message_id.is_scheduled() && (message_info.flags & MESSAGE_FLAG_IS_OUT) != 0) - << "Receive message out flag for incoming " << message_info.message_id << " in " << message_info.dialog_id; -} - MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( tl_object_ptr message_ptr, bool is_scheduled, const char *source) const { LOG(DEBUG) << "Receive from " << source << " " << to_string(message_ptr); @@ -12004,14 +11986,13 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( case telegram_api::message::ID: { auto message = move_tl_object_as(message_ptr); - message_info.dialog_id = DialogId(message->to_id_); + message_info.dialog_id = DialogId(message->peer_id_); if (message->flags_ & MESSAGE_FLAG_HAS_FROM_ID) { - message_info.sender_user_id = UserId(message->from_id_); + message_info.sender_dialog_id = DialogId(message->from_id_); } message_info.date = message->date_; message_info.forward_header = std::move(message->fwd_from_); - message_info.reply_to_message_id = MessageId(ServerMessageId( - message->flags_ & MESSAGE_FLAG_IS_REPLY ? message->reply_to_msg_id_ : 0)); // TODO zero init in fetch + message_info.reply_header = std::move(message->reply_to_); if (message->flags_ & MESSAGE_FLAG_IS_SENT_VIA_BOT) { message_info.via_bot_user_id = UserId(message->via_bot_id_); if (!message_info.via_bot_user_id.is_valid()) { @@ -12033,7 +12014,6 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( message_info.media_album_id = message->grouped_id_; } message_info.flags = message->flags_; - fix_message_info_dialog_id(message_info); bool is_content_read = (message->flags_ & MESSAGE_FLAG_HAS_UNREAD_CONTENT) == 0; if (is_message_auto_read(message_info.dialog_id, (message->flags_ & MESSAGE_FLAG_IS_OUT) != 0)) { is_content_read = true; @@ -12059,15 +12039,15 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( case telegram_api::messageService::ID: { auto message = move_tl_object_as(message_ptr); - message_info.dialog_id = DialogId(message->to_id_); + message_info.dialog_id = DialogId(message->peer_id_); if (message->flags_ & MESSAGE_FLAG_HAS_FROM_ID) { - message_info.sender_user_id = UserId(message->from_id_); + message_info.sender_dialog_id = DialogId(message->from_id_); } message_info.date = message->date_; message_info.flags = message->flags_; - fix_message_info_dialog_id(message_info); - MessageId reply_to_message_id = MessageId(ServerMessageId( - message->flags_ & MESSAGE_FLAG_IS_REPLY ? message->reply_to_msg_id_ : 0)); // TODO zero init in fetch + message_info.reply_header = std::move(message->reply_to_); + auto reply_to_message_id = MessageId( + ServerMessageId(message_info.reply_header == nullptr ? 0 : message_info.reply_header->reply_to_msg_id_)); message_info.content = get_action_message_content(td_, std::move(message->action_), message_info.dialog_id, reply_to_message_id); break; @@ -12076,6 +12056,10 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( UNREACHABLE(); break; } + if (message_info.sender_dialog_id.is_valid() && message_info.sender_dialog_id.get_type() == DialogType::User) { + message_info.sender_user_id = message_info.sender_dialog_id.get_user_id(); + message_info.sender_dialog_id = DialogId(); + } return message_info; } @@ -12098,6 +12082,7 @@ std::pair> MessagesManager::creat auto dialog_type = dialog_id.get_type(); UserId sender_user_id = message_info.sender_user_id; + DialogId sender_dialog_id = message_info.sender_dialog_id; if (!sender_user_id.is_valid()) { if (!is_broadcast_channel(dialog_id) && td_->auth_manager_->is_bot()) { sender_user_id = td_->contacts_manager_->get_service_notifications_user_id(); @@ -12106,6 +12091,16 @@ std::pair> MessagesManager::creat sender_user_id = UserId(); } } + if (sender_dialog_id.is_valid()) { + CHECK(!sender_user_id.is_valid()); + if (dialog_type == DialogType::User || dialog_type == DialogType::SecretChat) { + LOG(ERROR) << "Receive " << message_id << " sent by " << sender_dialog_id << " in " << dialog_id; + return {DialogId(), nullptr}; + } + } else if (sender_dialog_id != DialogId()) { + LOG(ERROR) << "Receive invalid " << sender_dialog_id; + sender_dialog_id = DialogId(); + } if (message_id.is_scheduled()) { is_channel_message = (dialog_type == DialogType::Channel); } @@ -12125,9 +12120,11 @@ std::pair> MessagesManager::creat UserId my_id = td_->contacts_manager_->get_my_id(); DialogId my_dialog_id = DialogId(my_id); - if (dialog_id == my_dialog_id) { - // dialog_id should be already fixed - CHECK(sender_user_id == my_id); + if (dialog_id == my_dialog_id && (sender_user_id != my_id || sender_dialog_id.is_valid())) { + LOG(ERROR) << "Receive " << sender_user_id << "/" << sender_dialog_id << " as a sender of " << message_id + << " instead of self"; + sender_user_id = my_id; + sender_dialog_id = DialogId(); } bool supposed_to_be_outgoing = sender_user_id == my_id && !(dialog_id == my_dialog_id && !message_id.is_scheduled()); @@ -12148,14 +12145,31 @@ std::pair> MessagesManager::creat } MessageId reply_to_message_id = message_info.reply_to_message_id; - CHECK(!reply_to_message_id.is_scheduled()); - if (!message_id.is_scheduled() && reply_to_message_id != MessageId() && - (!reply_to_message_id.is_valid() || reply_to_message_id >= message_id)) { - if (!reply_to_message_id.is_valid() || - reply_to_message_id.get() - message_id.get() <= MessageId(ServerMessageId(2000000000)).get()) { - LOG(ERROR) << "Receive reply to wrong " << reply_to_message_id << " in " << message_id; + DialogId reply_in_dialog_id; + if (message_info.reply_header != nullptr) { + reply_to_message_id = MessageId(ServerMessageId(message_info.reply_header->reply_to_msg_id_)); + auto reply_to_peer_id = std::move(message_info.reply_header->reply_to_peer_id_); + if (reply_to_peer_id != nullptr) { + reply_in_dialog_id = DialogId(reply_to_peer_id); + if (!reply_in_dialog_id.is_valid()) { + LOG(ERROR) << " Receive reply in invalid " << to_string(reply_to_peer_id); + reply_to_message_id = MessageId(); + } + } + } + CHECK(!reply_to_message_id.is_scheduled()); + if (reply_to_message_id != MessageId()) { + if (!reply_to_message_id.is_valid()) { + LOG(ERROR) << "Receive reply to " << reply_to_message_id << " for " << message_id << " in " << dialog_id; + reply_to_message_id = MessageId(); + } else { + if (!message_id.is_scheduled() && !reply_in_dialog_id.is_valid() && reply_to_message_id >= message_id) { + if (reply_to_message_id.get() - message_id.get() <= MessageId(ServerMessageId(2000000000)).get()) { + LOG(ERROR) << "Receive reply to wrong " << reply_to_message_id << " in " << message_id; + } + reply_to_message_id = MessageId(); + } } - reply_to_message_id = MessageId(); } UserId via_bot_user_id = message_info.via_bot_user_id; @@ -12206,11 +12220,12 @@ std::pair> MessagesManager::creat bool has_forward_info = message_info.forward_header != nullptr; - LOG(INFO) << "Receive " << message_id << " in " << dialog_id << " from " << sender_user_id; + LOG(INFO) << "Receive " << message_id << " in " << dialog_id << " from " << sender_user_id << "/" << sender_dialog_id; auto message = make_unique(); set_message_id(message, message_id); message->sender_user_id = sender_user_id; + message->sender_dialog_id = sender_dialog_id; message->date = date; message->ttl = ttl; message->edit_date = edit_date; @@ -12359,7 +12374,8 @@ FullMessageId MessagesManager::on_get_message(MessageInfo &&message_info, bool f if (!new_message->is_outgoing && dialog_id != get_my_dialog_id()) { // sent message is not from me - LOG(ERROR) << "Sent in " << dialog_id << " " << message_id << " is sent by " << new_message->sender_user_id; + LOG(ERROR) << "Sent in " << dialog_id << " " << message_id << " is sent by " << new_message->sender_user_id << "/" + << new_message->sender_dialog_id; return FullMessageId(); } @@ -20323,11 +20339,12 @@ tl_object_ptr MessagesManager::get_message_object(DialogId dial auto edit_date = m->hide_edit_date ? 0 : m->edit_date; return make_tl_object( m->message_id.get(), td_->contacts_manager_->get_user_id_object(m->sender_user_id, "sender_user_id"), - dialog_id.get(), std::move(sending_state), std::move(scheduling_state), is_outgoing, can_be_edited, - can_be_forwarded, can_delete_for_self, can_delete_for_all_users, can_get_statistics, can_get_replies, - m->is_channel_post, contains_unread_mention, date, edit_date, get_message_forward_info_object(m->forward_info), - get_message_interaction_info_object(dialog_id, m), reply_to_message_id, ttl, ttl_expires_in, via_bot_user_id, - m->author_signature, media_album_id, get_restriction_reason_description(m->restriction_reasons), + m->sender_dialog_id.get(), dialog_id.get(), std::move(sending_state), std::move(scheduling_state), is_outgoing, + can_be_edited, can_be_forwarded, can_delete_for_self, can_delete_for_all_users, can_get_statistics, + can_get_replies, m->is_channel_post, contains_unread_mention, date, edit_date, + get_message_forward_info_object(m->forward_info), get_message_interaction_info_object(dialog_id, m), + reply_to_message_id, ttl, ttl_expires_in, via_bot_user_id, m->author_signature, media_album_id, + get_restriction_reason_description(m->restriction_reasons), get_message_content_object(m->content.get(), td_, live_location_date, m->is_content_secret), get_reply_markup_object(m->reply_markup)); } @@ -20844,11 +20861,15 @@ bool MessagesManager::is_message_auto_read(DialogId dialog_id, bool is_outgoing) void MessagesManager::add_message_dependencies(Dependencies &dependencies, DialogId dialog_id, const Message *m) { dependencies.user_ids.insert(m->sender_user_id); + if (m->sender_dialog_id.is_valid() && dependencies.dialog_ids.insert(m->sender_dialog_id).second) { + add_dialog_dependencies(dependencies, m->sender_dialog_id); + } dependencies.user_ids.insert(m->via_bot_user_id); if (m->forward_info != nullptr) { dependencies.user_ids.insert(m->forward_info->sender_user_id); - if (m->forward_info->dialog_id.is_valid() && dependencies.dialog_ids.insert(m->forward_info->dialog_id).second) { - add_dialog_dependencies(dependencies, m->forward_info->dialog_id); + if (m->forward_info->sender_dialog_id.is_valid() && + dependencies.dialog_ids.insert(m->forward_info->sender_dialog_id).second) { + add_dialog_dependencies(dependencies, m->forward_info->sender_dialog_id); } if (m->forward_info->from_dialog_id.is_valid() && dependencies.dialog_ids.insert(m->forward_info->from_dialog_id).second) { @@ -23081,7 +23102,7 @@ bool MessagesManager::is_forward_info_sender_hidden(const MessageForwardInfo *fo return true; } DialogId hidden_sender_dialog_id(static_cast(G()->is_test_dc() ? -1000010460537ll : -1001228946795ll)); - return forward_info->dialog_id == hidden_sender_dialog_id && !forward_info->author_signature.empty() && + return forward_info->sender_dialog_id == hidden_sender_dialog_id && !forward_info->author_signature.empty() && !forward_info->message_id.is_valid(); } @@ -23097,24 +23118,17 @@ unique_ptr MessagesManager::get_message_for } auto flags = forward_header->flags_; - UserId sender_user_id; - ChannelId channel_id; + DialogId sender_dialog_id; MessageId message_id; string author_signature; DialogId from_dialog_id; MessageId from_message_id; string sender_name; if ((flags & telegram_api::messageFwdHeader::FROM_ID_MASK) != 0) { - sender_user_id = UserId(forward_header->from_id_); - if (!sender_user_id.is_valid()) { + sender_dialog_id = DialogId(forward_header->from_id_); + if (!sender_dialog_id.is_valid()) { LOG(ERROR) << "Receive invalid sender id in message forward header: " << oneline(to_string(forward_header)); - sender_user_id = UserId(); - } - } - if ((flags & telegram_api::messageFwdHeader::CHANNEL_ID_MASK) != 0) { - channel_id = ChannelId(forward_header->channel_id_); - if (!channel_id.is_valid()) { - LOG(ERROR) << "Receive invalid channel id in message forward header: " << oneline(to_string(forward_header)); + sender_dialog_id = DialogId(); } } constexpr int32 MESSAGE_FORWARD_HEADER_FLAG_HAS_MESSAGE_ID = telegram_api::messageFwdHeader::CHANNEL_POST_MASK; @@ -23143,8 +23157,12 @@ unique_ptr MessagesManager::get_message_for sender_name = std::move(forward_header->from_name_); } - DialogId dialog_id; - if (!channel_id.is_valid()) { + UserId sender_user_id; + if (sender_dialog_id.get_type() == DialogType::User) { + sender_user_id = sender_dialog_id.get_user_id(); + sender_dialog_id = DialogId(); + } + if (!sender_dialog_id.is_valid()) { if (sender_user_id.is_valid()) { if (message_id.is_valid()) { LOG(ERROR) << "Receive non-empty message identifier in message forward header: " @@ -23155,20 +23173,21 @@ unique_ptr MessagesManager::get_message_for LOG(ERROR) << "Receive wrong message forward header: " << oneline(to_string(forward_header)); return nullptr; } + } else if (sender_dialog_id.get_type() != DialogType::Channel) { + LOG(ERROR) << "Receive wrong message forward header with non-channel sender: " + << oneline(to_string(forward_header)); + return nullptr; } else { - LOG_IF(ERROR, td_->contacts_manager_->have_min_channel(channel_id)) << "Receive forward from min channel"; - dialog_id = DialogId(channel_id); - force_create_dialog(dialog_id, "message forward info", true); - if (sender_user_id.is_valid()) { - LOG(ERROR) << "Receive valid sender user id in message forward header: " << oneline(to_string(forward_header)); - sender_user_id = UserId(); - } + auto channel_id = sender_dialog_id.get_channel_id(); + LOG_IF(ERROR, td_->contacts_manager_->have_min_channel(channel_id)) << "Receive forward from min " << channel_id; + force_create_dialog(sender_dialog_id, "message forward info", true); + CHECK(!sender_user_id.is_valid()); } if (from_dialog_id.is_valid()) { force_create_dialog(from_dialog_id, "message forward from info", true); } - return td::make_unique(sender_user_id, forward_header->date_, dialog_id, message_id, + return td::make_unique(sender_user_id, forward_header->date_, sender_dialog_id, message_id, std::move(author_signature), std::move(sender_name), from_dialog_id, from_message_id, std::move(forward_header->psa_type_)); } @@ -23184,9 +23203,12 @@ td_api::object_ptr MessagesManager::get_message_forw return td_api::make_object( forward_info->sender_name.empty() ? forward_info->author_signature : forward_info->sender_name); } - if (forward_info->dialog_id.is_valid()) { + if (forward_info->message_id.is_valid()) { return td_api::make_object( - forward_info->dialog_id.get(), forward_info->message_id.get(), forward_info->author_signature); + forward_info->sender_dialog_id.get(), forward_info->message_id.get(), forward_info->author_signature); + } + if (forward_info->sender_dialog_id.is_valid()) { + return td_api::make_object(forward_info->sender_dialog_id.get()); } return td_api::make_object( td_->contacts_manager_->get_user_id_object(forward_info->sender_user_id, "messageForwardOriginUser")); @@ -23452,10 +23474,10 @@ Result> MessagesManager::forward_messages(DialogId to_dialog_i } else { LOG(ERROR) << "Don't know how to forward a channel post not from a channel"; } - } else if (forwarded_message->sender_user_id.is_valid()) { - forward_info = - make_unique(forwarded_message->sender_user_id, forwarded_message->date, DialogId(), - MessageId(), "", "", saved_from_dialog_id, saved_from_message_id, ""); + } else if (forwarded_message->sender_user_id.is_valid() || forwarded_message->sender_dialog_id.is_valid()) { + forward_info = make_unique(forwarded_message->sender_user_id, forwarded_message->date, + forwarded_message->sender_dialog_id, MessageId(), "", "", + saved_from_dialog_id, saved_from_message_id, ""); } else { LOG(ERROR) << "Don't know how to forward a non-channel post message without forward info and sender"; } @@ -24061,8 +24083,8 @@ NotificationGroupId MessagesManager::get_dialog_notification_group_id(DialogId d } Result MessagesManager::get_message_push_notification_info( - DialogId dialog_id, MessageId message_id, int64 random_id, UserId sender_user_id, int32 date, - bool is_from_scheduled, bool contains_mention, bool is_pinned, bool is_from_binlog) { + DialogId dialog_id, MessageId message_id, int64 random_id, UserId sender_user_id, DialogId sender_dialog_id, + int32 date, bool is_from_scheduled, bool contains_mention, bool is_pinned, bool is_from_binlog) { init(); if (!is_from_scheduled && dialog_id == get_my_dialog_id()) { @@ -24076,6 +24098,9 @@ Result MessagesManager::get_messag if (d == nullptr) { return Status::Error(406, "Ignore notification in unknown chat"); } + if (sender_dialog_id.is_valid() && !have_dialog_force(sender_dialog_id)) { + return Status::Error(406, "Ignore notification sent by unknown chat"); + } if (is_from_scheduled && dialog_id != get_my_dialog_id() && G()->shared_config().get_option_boolean("disable_sent_scheduled_message_notifications")) { @@ -24122,9 +24147,14 @@ Result MessagesManager::get_messag DialogId settings_dialog_id = dialog_id; Dialog *settings_dialog = d; - if (contains_mention && sender_user_id.is_valid()) { - settings_dialog_id = DialogId(sender_user_id); - settings_dialog = get_dialog_force(settings_dialog_id); + if (contains_mention) { + if (sender_user_id.is_valid()) { + settings_dialog_id = DialogId(sender_user_id); + settings_dialog = get_dialog_force(settings_dialog_id); + } else if (sender_dialog_id.is_valid()) { + settings_dialog_id = sender_dialog_id; + settings_dialog = get_dialog_force(settings_dialog_id); + } } bool have_settings; @@ -25017,10 +25047,15 @@ bool MessagesManager::add_new_message_notification(Dialog *d, Message *m, bool f DialogId settings_dialog_id = d->dialog_id; Dialog *settings_dialog = d; - if (m->contains_mention && !m->is_mention_notification_disabled && m->sender_user_id.is_valid()) { + if (m->contains_mention && !m->is_mention_notification_disabled) { // have a mention, so use notification settings from the dialog with the sender - settings_dialog_id = DialogId(m->sender_user_id); - settings_dialog = get_dialog_force(settings_dialog_id); + if (m->sender_user_id.is_valid()) { + settings_dialog_id = DialogId(m->sender_user_id); + settings_dialog = get_dialog_force(settings_dialog_id); + } else if (m->sender_dialog_id.is_valid()) { + settings_dialog_id = m->sender_dialog_id; + settings_dialog = get_dialog_force(settings_dialog_id); + } } bool have_settings; @@ -29470,8 +29505,8 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq } } if (!td_->auth_manager_->is_bot() && from_update && m->forward_info != nullptr && - m->forward_info->dialog_id.is_valid() && m->forward_info->message_id.is_valid()) { - update_forward_count(m->forward_info->dialog_id, m->forward_info->message_id); + m->forward_info->sender_dialog_id.is_valid() && m->forward_info->message_id.is_valid()) { + update_forward_count(m->forward_info->sender_dialog_id, m->forward_info->message_id); } return result_message; @@ -29994,25 +30029,38 @@ bool MessagesManager::update_message(Dialog *d, Message *old_message, unique_ptr if (old_message->author_signature != new_message->author_signature) { LOG(DEBUG) << "Author signature has changed for " << message_id << " in " << dialog_id << " sent by " - << old_message->sender_user_id << "/" << new_message->sender_user_id << " from " + << old_message->sender_user_id << "/" << new_message->sender_user_id << " or " + << old_message->sender_dialog_id << "/" << new_message->sender_dialog_id << " from " << old_message->author_signature << " to " << new_message->author_signature; old_message->author_signature = std::move(new_message->author_signature); need_send_update = true; } if (old_message->sender_user_id != new_message->sender_user_id) { - // there can be race for sent signed posts + // there can be race for sent signed posts or changed anonymous flag LOG_IF(ERROR, old_message->sender_user_id != UserId() && new_message->sender_user_id != UserId()) << message_id << " in " << dialog_id << " has changed sender from " << old_message->sender_user_id << " to " << new_message->sender_user_id << ", message content type is " << old_message->content->get_type() << '/' << new_message->content->get_type(); - LOG_IF(WARNING, new_message->sender_user_id.is_valid() || old_message->author_signature.empty()) + LOG_IF(WARNING, (new_message->sender_user_id.is_valid() || old_message->author_signature.empty()) && + !old_message->sender_dialog_id.is_valid() && !new_message->sender_dialog_id.is_valid()) << "Update message sender from " << old_message->sender_user_id << " to " << new_message->sender_user_id << " in " << dialog_id; LOG(DEBUG) << "Change message sender"; old_message->sender_user_id = new_message->sender_user_id; need_send_update = true; } + if (old_message->sender_dialog_id != new_message->sender_dialog_id) { + // there can be race for changed anonymous flag + LOG_IF(ERROR, old_message->sender_dialog_id != DialogId() && new_message->sender_dialog_id != DialogId()) + << message_id << " in " << dialog_id << " has changed sender from " << old_message->sender_dialog_id << " to " + << new_message->sender_dialog_id << ", message content type is " << old_message->content->get_type() << '/' + << new_message->content->get_type(); + + LOG(DEBUG) << "Change message sender"; + old_message->sender_dialog_id = new_message->sender_dialog_id; + need_send_update = true; + } if (old_message->forward_info == nullptr) { if (new_message->forward_info != nullptr) { if (!replace_legacy) { @@ -30042,10 +30090,11 @@ bool MessagesManager::update_message(Dialog *d, Message *old_message, unique_ptr need_send_update = true; } } else if (is_new_available) { - LOG(ERROR) << message_id << " in " << dialog_id << " sent by " << old_message->sender_user_id - << " has lost forward info " << *old_message->forward_info << ", really forwarded from " - << old_message->real_forward_from_dialog_id << ", message content type is " - << old_message->content->get_type() << '/' << new_message->content->get_type(); + LOG(ERROR) << message_id << " in " << dialog_id << " sent by " << old_message->sender_user_id << "/" + << old_message->sender_dialog_id << " has lost forward info " << *old_message->forward_info + << ", really forwarded from " << old_message->real_forward_from_dialog_id + << ", message content type is " << old_message->content->get_type() << '/' + << new_message->content->get_type(); old_message->forward_info = nullptr; need_send_update = true; } @@ -30233,8 +30282,8 @@ bool MessagesManager::update_message(Dialog *d, Message *old_message, unique_ptr } else { // if the message is not accessible anymore, then we don't need a warning if (need_message_changed_warning(old_message) && is_new_available) { - LOG(ERROR) << message_id << " in " << dialog_id << " sent by " << old_message->sender_user_id - << " has lost reply markup " << *old_message->reply_markup + LOG(ERROR) << message_id << " in " << dialog_id << " sent by " << old_message->sender_user_id << "/" + << old_message->sender_dialog_id << " has lost reply markup " << *old_message->reply_markup << ". Old message: " << to_string(get_message_object(dialog_id, old_message)) << ". New message: " << to_string(get_message_object(dialog_id, new_message.get())); } @@ -30810,7 +30859,7 @@ void MessagesManager::fix_new_dialog(Dialog *d, unique_ptr &&last_datab if (last_database_message != nullptr) { int32 dependent_dialog_count = 0; if (last_database_message->forward_info != nullptr) { - auto other_dialog_id = last_database_message->forward_info->dialog_id; + auto other_dialog_id = last_database_message->forward_info->sender_dialog_id; if (other_dialog_id.is_valid() && !have_dialog(other_dialog_id)) { LOG(INFO) << "Postpone adding of last message in " << dialog_id << " because of cyclic dependency with " << other_dialog_id; @@ -30824,6 +30873,13 @@ void MessagesManager::fix_new_dialog(Dialog *d, unique_ptr &&last_datab pending_add_dialog_last_database_message_dependent_dialogs_[other_dialog_id].push_back(dialog_id); dependent_dialog_count++; } + other_dialog_id = last_database_message->sender_dialog_id; + if (other_dialog_id.is_valid() && !have_dialog(other_dialog_id)) { + LOG(INFO) << "Postpone adding of last message in " << dialog_id << " because of cyclic dependency with " + << other_dialog_id; + pending_add_dialog_last_database_message_dependent_dialogs_[other_dialog_id].push_back(dialog_id); + dependent_dialog_count++; + } } if (dependent_dialog_count == 0) { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 041a6e20b..64fb40bf6 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -165,7 +165,6 @@ class MessagesManager : public Actor { static constexpr int32 MESSAGE_FLAG_HIDE_EDIT_DATE = 1 << 21; static constexpr int32 MESSAGE_FLAG_IS_RESTRICTED = 1 << 22; static constexpr int32 MESSAGE_FLAG_HAS_REPLY_INFO = 1 << 23; - static constexpr int32 MESSAGE_FLAG_HAS_RECENT_REPLIERS = 1 << 24; static constexpr int32 SEND_MESSAGE_FLAG_IS_REPLY = 1 << 0; static constexpr int32 SEND_MESSAGE_FLAG_DISABLE_WEB_PAGE_PREVIEW = 1 << 1; @@ -234,7 +233,8 @@ class MessagesManager : public Actor { void on_get_dialog_messages_search_result(DialogId dialog_id, const string &query, UserId sender_user_id, MessageId from_message_id, int32 offset, int32 limit, - MessageSearchFilter filter, int64 random_id, int32 total_count, + MessageSearchFilter filter, MessageId top_thread_message_id, + int64 random_id, int32 total_count, vector> &&messages); void on_failed_dialog_messages_search(DialogId dialog_id, int64 random_id); @@ -833,9 +833,9 @@ class MessagesManager : public Actor { }; Result get_message_push_notification_info(DialogId dialog_id, MessageId message_id, int64 random_id, UserId sender_user_id, - int32 date, bool is_from_scheduled, - bool contains_mention, bool is_pinned, - bool is_from_binlog); + DialogId sender_dialog_id, int32 date, + bool is_from_scheduled, bool contains_mention, + bool is_pinned, bool is_from_binlog); struct MessageNotificationGroup { DialogId dialog_id; @@ -905,11 +905,13 @@ class MessagesManager : public Actor { DialogId dialog_id; MessageId message_id; UserId sender_user_id; + DialogId sender_dialog_id; int32 date = 0; int32 ttl = 0; int64 random_id = 0; tl_object_ptr forward_header; MessageId reply_to_message_id; + tl_object_ptr reply_header; UserId via_bot_user_id; int32 view_count = 0; int32 forward_count = 0; @@ -927,7 +929,7 @@ class MessagesManager : public Actor { struct MessageForwardInfo { UserId sender_user_id; int32 date = 0; - DialogId dialog_id; + DialogId sender_dialog_id; MessageId message_id; string author_signature; string sender_name; @@ -937,12 +939,12 @@ class MessagesManager : public Actor { MessageForwardInfo() = default; - MessageForwardInfo(UserId sender_user_id, int32 date, DialogId dialog_id, MessageId message_id, + MessageForwardInfo(UserId sender_user_id, int32 date, DialogId sender_dialog_id, MessageId message_id, string author_signature, string sender_name, DialogId from_dialog_id, MessageId from_message_id, string psa_type) : sender_user_id(sender_user_id) , date(date) - , dialog_id(dialog_id) + , sender_dialog_id(sender_dialog_id) , message_id(message_id) , author_signature(std::move(author_signature)) , sender_name(std::move(sender_name)) @@ -952,7 +954,7 @@ class MessagesManager : public Actor { } bool operator==(const MessageForwardInfo &rhs) const { - return sender_user_id == rhs.sender_user_id && date == rhs.date && dialog_id == rhs.dialog_id && + return sender_user_id == rhs.sender_user_id && date == rhs.date && sender_dialog_id == rhs.sender_dialog_id && message_id == rhs.message_id && author_signature == rhs.author_signature && sender_name == rhs.sender_name && from_dialog_id == rhs.from_dialog_id && from_message_id == rhs.from_message_id && psa_type == rhs.psa_type; @@ -965,7 +967,7 @@ class MessagesManager : public Actor { friend StringBuilder &operator<<(StringBuilder &string_builder, const MessageForwardInfo &forward_info) { return string_builder << "MessageForwardInfo[sender " << forward_info.sender_user_id << "(" << forward_info.author_signature << "/" << forward_info.sender_name << "), psa_type " - << forward_info.psa_type << ", source " << forward_info.dialog_id << ", source " + << forward_info.psa_type << ", source " << forward_info.sender_dialog_id << ", source " << forward_info.message_id << ", from " << forward_info.from_dialog_id << ", from " << forward_info.from_message_id << " at " << forward_info.date << "]"; } @@ -977,6 +979,7 @@ class MessagesManager : public Actor { MessageId message_id; UserId sender_user_id; + DialogId sender_dialog_id; int32 date = 0; int32 edit_date = 0; int32 send_date = 0; @@ -1665,8 +1668,6 @@ class MessagesManager : public Actor { void finish_delete_secret_chat_history(DialogId dialog_id, MessageId last_message_id, Promise<> promise); - void fix_message_info_dialog_id(MessageInfo &message_info) const; - MessageInfo parse_telegram_api_message(tl_object_ptr message_ptr, bool is_scheduled, const char *source) const; diff --git a/td/telegram/NotificationManager.cpp b/td/telegram/NotificationManager.cpp index 903ae1699..c625dca6e 100644 --- a/td/telegram/NotificationManager.cpp +++ b/td/telegram/NotificationManager.cpp @@ -3129,7 +3129,20 @@ Status NotificationManager::process_push_notification_payload(string payload, bo TRY_RESULT(random_id, get_json_object_long_field(custom, "random_id")); UserId sender_user_id; - if (has_json_object_field(custom, "chat_from_id")) { + DialogId sender_dialog_id; + if (has_json_object_field(custom, "chat_from_broadcast_id")) { + TRY_RESULT(sender_channel_id_int, get_json_object_int_field(custom, "chat_from_broadcast_id")); + sender_dialog_id = DialogId(ChannelId(sender_channel_id_int)); + if (!sender_dialog_id.is_valid()) { + return Status::Error("Receive invalid chat_from_broadcast_id"); + } + } else if (has_json_object_field(custom, "chat_from_group_id")) { + TRY_RESULT(sender_channel_id_int, get_json_object_int_field(custom, "chat_from_group_id")); + sender_dialog_id = DialogId(ChannelId(sender_channel_id_int)); + if (!sender_dialog_id.is_valid()) { + return Status::Error("Receive invalid chat_from_group_id"); + } + } else if (has_json_object_field(custom, "chat_from_id")) { TRY_RESULT(sender_user_id_int, get_json_object_int_field(custom, "chat_from_id")); sender_user_id = UserId(sender_user_id_int); if (!sender_user_id.is_valid()) { @@ -3195,7 +3208,7 @@ Status NotificationManager::process_push_notification_payload(string payload, bo } if (dialog_id.get_type() == DialogType::User) { sender_name = std::move(loc_args[0]); - } else if (sender_user_id.is_valid() && begins_with(loc_key, "PINNED_")) { + } else if ((sender_user_id.is_valid() || sender_dialog_id.is_valid()) && begins_with(loc_key, "PINNED_")) { if (loc_args.size() < 2) { return Status::Error("Expected chat title as the last argument"); } @@ -3394,7 +3407,7 @@ Status NotificationManager::process_push_notification_payload(string payload, bo } else { bool is_from_scheduled = has_json_object_field(custom, "schedule"); bool is_silent = has_json_object_field(custom, "silent"); - add_message_push_notification(dialog_id, MessageId(server_message_id), random_id, sender_user_id, + add_message_push_notification(dialog_id, MessageId(server_message_id), random_id, sender_user_id, sender_dialog_id, std::move(sender_name), sent_date, is_from_scheduled, contains_mention, is_silent, is_silent, std::move(loc_key), std::move(arg), std::move(attached_photo), std::move(attached_document), NotificationId(), 0, std::move(promise)); @@ -3408,6 +3421,7 @@ class NotificationManager::AddMessagePushNotificationLogEvent { MessageId message_id_; int64 random_id_; UserId sender_user_id_; + DialogId sender_dialog_id_; string sender_name_; int32 date_; bool is_from_scheduled_; @@ -3428,6 +3442,7 @@ class NotificationManager::AddMessagePushNotificationLogEvent { bool has_arg = !arg_.empty(); bool has_photo = !photo_.is_empty(); bool has_document = !document_.empty(); + bool has_sender_dialog_id = sender_dialog_id_.is_valid(); BEGIN_STORE_FLAGS(); STORE_FLAG(contains_mention_); STORE_FLAG(is_silent_); @@ -3439,6 +3454,7 @@ class NotificationManager::AddMessagePushNotificationLogEvent { STORE_FLAG(has_photo); STORE_FLAG(has_document); STORE_FLAG(is_from_scheduled_); + STORE_FLAG(has_sender_dialog_id); END_STORE_FLAGS(); td::store(dialog_id_, storer); if (has_message_id) { @@ -3465,6 +3481,9 @@ class NotificationManager::AddMessagePushNotificationLogEvent { td::store(document_, storer); } td::store(notification_id_, storer); + if (has_sender_dialog_id) { + td::store(sender_dialog_id_, storer); + } } template @@ -3476,6 +3495,7 @@ class NotificationManager::AddMessagePushNotificationLogEvent { bool has_arg; bool has_photo; bool has_document; + bool has_sender_dialog_id; BEGIN_PARSE_FLAGS(); PARSE_FLAG(contains_mention_); PARSE_FLAG(is_silent_); @@ -3487,6 +3507,7 @@ class NotificationManager::AddMessagePushNotificationLogEvent { PARSE_FLAG(has_photo); PARSE_FLAG(has_document); PARSE_FLAG(is_from_scheduled_); + PARSE_FLAG(has_sender_dialog_id); END_PARSE_FLAGS(); td::parse(dialog_id_, parser); if (has_message_id) { @@ -3515,20 +3536,27 @@ class NotificationManager::AddMessagePushNotificationLogEvent { td::parse(document_, parser); } td::parse(notification_id_, parser); + if (has_sender_dialog_id) { + td::parse(sender_dialog_id_, parser); + } } }; -void NotificationManager::add_message_push_notification( - DialogId dialog_id, MessageId message_id, int64 random_id, UserId sender_user_id, string sender_name, int32 date, - bool is_from_scheduled, bool contains_mention, bool initial_is_silent, bool is_silent, string loc_key, string arg, - Photo photo, Document document, NotificationId notification_id, uint64 logevent_id, Promise promise) { +void NotificationManager::add_message_push_notification(DialogId dialog_id, MessageId message_id, int64 random_id, + UserId sender_user_id, DialogId sender_dialog_id, + string sender_name, int32 date, bool is_from_scheduled, + bool contains_mention, bool initial_is_silent, bool is_silent, + string loc_key, string arg, Photo photo, Document document, + NotificationId notification_id, uint64 logevent_id, + Promise promise) { auto is_pinned = begins_with(loc_key, "PINNED_"); auto r_info = td_->messages_manager_->get_message_push_notification_info( - dialog_id, message_id, random_id, sender_user_id, date, is_from_scheduled, contains_mention, is_pinned, - logevent_id != 0); + dialog_id, message_id, random_id, sender_user_id, sender_dialog_id, date, is_from_scheduled, contains_mention, + is_pinned, logevent_id != 0); if (r_info.is_error()) { VLOG(notifications) << "Don't need message push notification for " << message_id << "/" << random_id << " from " - << dialog_id << " sent by " << sender_user_id << " at " << date << ": " << r_info.error(); + << dialog_id << " sent by " << sender_user_id << "/" << sender_dialog_id << " at " << date + << ": " << r_info.error(); if (logevent_id != 0) { binlog_erase(G()->td_db()->get_binlog(), logevent_id); } @@ -3581,9 +3609,9 @@ void NotificationManager::add_message_push_notification( if (logevent_id == 0 && G()->parameters().use_message_db) { AddMessagePushNotificationLogEvent logevent{ - dialog_id, message_id, random_id, sender_user_id, sender_name, date, - is_from_scheduled, contains_mention, initial_is_silent, loc_key, arg, photo, - document, notification_id}; + dialog_id, message_id, random_id, sender_user_id, sender_dialog_id, sender_name, + date, is_from_scheduled, contains_mention, initial_is_silent, loc_key, arg, + photo, document, notification_id}; auto storer = LogEventStorerImpl(logevent); logevent_id = binlog_add(G()->td_db()->get_binlog(), LogEvent::HandlerType::AddMessagePushNotification, storer); } @@ -3596,8 +3624,8 @@ void NotificationManager::add_message_push_notification( if (logevent_id != 0) { VLOG(notifications) << "Register temporary " << notification_id << " with logevent " << logevent_id; temporary_notification_logevent_ids_[notification_id] = logevent_id; - temporary_notifications_[FullMessageId(dialog_id, message_id)] = {group_id, notification_id, sender_user_id, - sender_name, is_outgoing}; + temporary_notifications_[FullMessageId(dialog_id, message_id)] = {group_id, notification_id, sender_user_id, + sender_dialog_id, sender_name, is_outgoing}; temporary_notification_message_ids_[notification_id] = FullMessageId(dialog_id, message_id); } push_notification_promises_[notification_id].push_back(std::move(promise)); @@ -3605,15 +3633,15 @@ void NotificationManager::add_message_push_notification( auto group_type = info.group_type; auto settings_dialog_id = info.settings_dialog_id; VLOG(notifications) << "Add message push " << notification_id << " of type " << loc_key << " for " << message_id - << "/" << random_id << " in " << dialog_id << ", sent by " << sender_user_id << "/\"" - << sender_name << "\" at " << date << " with arg " << arg << ", photo " << photo - << " and document " << document << " to " << group_id << " of type " << group_type - << " with settings from " << settings_dialog_id; + << "/" << random_id << " in " << dialog_id << ", sent by " << sender_user_id << "/" + << sender_dialog_id << "/\"" << sender_name << "\" at " << date << " with arg " << arg + << ", photo " << photo << " and document " << document << " to " << group_id << " of type " + << group_type << " with settings from " << settings_dialog_id; add_notification( group_id, group_type, dialog_id, date, settings_dialog_id, initial_is_silent, is_silent, 0, notification_id, - create_new_push_message_notification(sender_user_id, sender_name, is_outgoing, message_id, std::move(loc_key), - std::move(arg), std::move(photo), std::move(document)), + create_new_push_message_notification(sender_user_id, sender_dialog_id, sender_name, is_outgoing, message_id, + std::move(loc_key), std::move(arg), std::move(photo), std::move(document)), "add_message_push_notification"); } @@ -3704,6 +3732,7 @@ void NotificationManager::edit_message_push_notification(DialogId dialog_id, Mes auto group_id = it->second.group_id; auto notification_id = it->second.notification_id; auto sender_user_id = it->second.sender_user_id; + auto sender_dialog_id = it->second.sender_dialog_id; auto sender_name = it->second.sender_name; auto is_outgoing = it->second.is_outgoing; CHECK(group_id.is_valid()); @@ -3730,10 +3759,10 @@ void NotificationManager::edit_message_push_notification(DialogId dialog_id, Mes push_notification_promises_[notification_id].push_back(std::move(promise)); - edit_notification( - group_id, notification_id, - create_new_push_message_notification(sender_user_id, std::move(sender_name), is_outgoing, message_id, - std::move(loc_key), std::move(arg), std::move(photo), std::move(document))); + edit_notification(group_id, notification_id, + create_new_push_message_notification(sender_user_id, sender_dialog_id, std::move(sender_name), + is_outgoing, message_id, std::move(loc_key), std::move(arg), + std::move(photo), std::move(document))); } Result NotificationManager::get_push_receiver_id(string payload) { @@ -4059,9 +4088,10 @@ void NotificationManager::on_binlog_events(vector &&events) { add_message_push_notification( log_event.dialog_id_, log_event.message_id_, log_event.random_id_, log_event.sender_user_id_, - log_event.sender_name_, log_event.date_, log_event.is_from_scheduled_, log_event.contains_mention_, - log_event.is_silent_, true, log_event.loc_key_, log_event.arg_, log_event.photo_, log_event.document_, - log_event.notification_id_, event.id_, PromiseCreator::lambda([](Result result) { + log_event.sender_dialog_id_, log_event.sender_name_, log_event.date_, log_event.is_from_scheduled_, + log_event.contains_mention_, log_event.is_silent_, true, log_event.loc_key_, log_event.arg_, + log_event.photo_, log_event.document_, log_event.notification_id_, event.id_, + PromiseCreator::lambda([](Result result) { if (result.is_error() && result.error().code() != 200 && result.error().code() != 406) { LOG(ERROR) << "Receive error " << result.error() << ", while processing message push notification"; } diff --git a/td/telegram/NotificationManager.h b/td/telegram/NotificationManager.h index 6bc268027..5748b7fd3 100644 --- a/td/telegram/NotificationManager.h +++ b/td/telegram/NotificationManager.h @@ -307,10 +307,10 @@ class NotificationManager : public Actor { Status process_push_notification_payload(string payload, bool was_encrypted, Promise &promise); void add_message_push_notification(DialogId dialog_id, MessageId message_id, int64 random_id, UserId sender_user_id, - string sender_name, int32 date, bool is_from_scheduled, bool contains_mention, - bool initial_is_silent, bool is_silent, string loc_key, string arg, Photo photo, - Document document, NotificationId notification_id, uint64 logevent_id, - Promise promise); + DialogId sender_dialog_id, string sender_name, int32 date, bool is_from_scheduled, + bool contains_mention, bool initial_is_silent, bool is_silent, string loc_key, + string arg, Photo photo, Document document, NotificationId notification_id, + uint64 logevent_id, Promise promise); void edit_message_push_notification(DialogId dialog_id, MessageId message_id, int32 edit_date, string loc_key, string arg, Photo photo, Document document, uint64 logevent_id, @@ -388,6 +388,7 @@ class NotificationManager : public Actor { NotificationGroupId group_id; NotificationId notification_id; UserId sender_user_id; + DialogId sender_dialog_id; string sender_name; bool is_outgoing; }; diff --git a/td/telegram/NotificationType.cpp b/td/telegram/NotificationType.cpp index f14ff7d02..06178cda0 100644 --- a/td/telegram/NotificationType.cpp +++ b/td/telegram/NotificationType.cpp @@ -321,16 +321,18 @@ class NotificationTypePushMessage : public NotificationType { auto sender_user_id = G()->td().get_actor_unsafe()->contacts_manager_->get_user_id_object( sender_user_id_, "get_notification_type_object"); return td_api::make_object( - message_id_.get(), sender_user_id, sender_name_, is_outgoing_, + message_id_.get(), sender_user_id, sender_dialog_id_.get(), sender_name_, is_outgoing_, get_push_message_content_object(key_, arg_, photo_, document_)); } StringBuilder &to_string_builder(StringBuilder &string_builder) const override { - return string_builder << "NewPushMessageNotification[" << sender_user_id_ << "/\"" << sender_name_ << "\", " - << message_id_ << ", " << key_ << ", " << arg_ << ", " << photo_ << ", " << document_ << ']'; + return string_builder << "NewPushMessageNotification[" << sender_user_id_ << "/" << sender_dialog_id_ << "/\"" + << sender_name_ << "\", " << message_id_ << ", " << key_ << ", " << arg_ << ", " << photo_ + << ", " << document_ << ']'; } UserId sender_user_id_; + DialogId sender_dialog_id_; MessageId message_id_; string sender_name_; string key_; @@ -340,9 +342,10 @@ class NotificationTypePushMessage : public NotificationType { bool is_outgoing_; public: - NotificationTypePushMessage(UserId sender_user_id, string sender_name, bool is_outgoing, MessageId message_id, - string key, string arg, Photo photo, Document document) - : sender_user_id_(std::move(sender_user_id)) + NotificationTypePushMessage(UserId sender_user_id, DialogId sender_dialog_id, string sender_name, bool is_outgoing, + MessageId message_id, string key, string arg, Photo photo, Document document) + : sender_user_id_(sender_user_id) + , sender_dialog_id_(sender_dialog_id) , message_id_(message_id) , sender_name_(std::move(sender_name)) , key_(std::move(key)) @@ -365,12 +368,13 @@ unique_ptr create_new_call_notification(CallId call_id) { return make_unique(call_id); } -unique_ptr create_new_push_message_notification(UserId sender_user_id, string sender_name, - bool is_outgoing, MessageId message_id, string key, - string arg, Photo photo, Document document) { - return td::make_unique(sender_user_id, std::move(sender_name), is_outgoing, message_id, - std::move(key), std::move(arg), std::move(photo), - std::move(document)); +unique_ptr create_new_push_message_notification(UserId sender_user_id, DialogId sender_dialog_id, + string sender_name, bool is_outgoing, + MessageId message_id, string key, string arg, + Photo photo, Document document) { + return td::make_unique(sender_user_id, sender_dialog_id, std::move(sender_name), + is_outgoing, message_id, std::move(key), std::move(arg), + std::move(photo), std::move(document)); } } // namespace td diff --git a/td/telegram/NotificationType.h b/td/telegram/NotificationType.h index 5b49eb339..84ed8b1f7 100644 --- a/td/telegram/NotificationType.h +++ b/td/telegram/NotificationType.h @@ -59,8 +59,9 @@ unique_ptr create_new_secret_chat_notification(); unique_ptr create_new_call_notification(CallId call_id); -unique_ptr create_new_push_message_notification(UserId sender_user_id, string sender_name, - bool is_outgoing, MessageId message_id, string key, - string arg, Photo photo, Document document); +unique_ptr create_new_push_message_notification(UserId sender_user_id, DialogId sender_dialog_id, + string sender_name, bool is_outgoing, + MessageId message_id, string key, string arg, + Photo photo, Document document); } // namespace td diff --git a/td/telegram/UpdatesManager.cpp b/td/telegram/UpdatesManager.cpp index 42dfc7c21..a59c56c5c 100644 --- a/td/telegram/UpdatesManager.cpp +++ b/td/telegram/UpdatesManager.cpp @@ -400,15 +400,9 @@ bool UpdatesManager::is_acceptable_message_forward_header( } auto flags = header->flags_; - if (flags & telegram_api::messageFwdHeader::CHANNEL_ID_MASK) { - ChannelId channel_id(header->channel_id_); - if (!is_acceptable_channel(channel_id)) { - return false; - } - } if (flags & telegram_api::messageFwdHeader::FROM_ID_MASK) { - UserId user_id(header->from_id_); - if (!is_acceptable_user(user_id)) { + DialogId dialog_id(header->from_id_); + if (!is_acceptable_dialog(dialog_id)) { return false; } } @@ -431,11 +425,11 @@ bool UpdatesManager::is_acceptable_message(const telegram_api::Message *message_ case telegram_api::message::ID: { auto message = static_cast(message_ptr); - if (!is_acceptable_dialog(DialogId(message->to_id_))) { + if (!is_acceptable_dialog(DialogId(message->peer_id_))) { return false; } if (message->flags_ & MessagesManager::MESSAGE_FLAG_HAS_FROM_ID) { - if (!is_acceptable_user(UserId(message->from_id_))) { + if (!is_acceptable_dialog(DialogId(message->from_id_))) { return false; } } @@ -522,11 +516,11 @@ bool UpdatesManager::is_acceptable_message(const telegram_api::Message *message_ case telegram_api::messageService::ID: { auto message = static_cast(message_ptr); - if (!is_acceptable_dialog(DialogId(message->to_id_))) { + if (!is_acceptable_dialog(DialogId(message->peer_id_))) { return false; } if (message->flags_ & MessagesManager::MESSAGE_FLAG_HAS_FROM_ID) { - if (!is_acceptable_user(UserId(message->from_id_))) { + if (!is_acceptable_dialog(DialogId(message->from_id_))) { return false; } } @@ -698,18 +692,20 @@ void UpdatesManager::on_get_updates(tl_object_ptr &&updat auto from_id = update->flags_ & MessagesManager::MESSAGE_FLAG_IS_OUT ? td_->contacts_manager_->get_my_id().get() : update->user_id_; + auto peer_id = update->flags_ & MessagesManager::MESSAGE_FLAG_IS_OUT ? update->user_id_ + : td_->contacts_manager_->get_my_id().get(); update->flags_ |= MessagesManager::MESSAGE_FLAG_HAS_FROM_ID; - on_pending_update( - make_tl_object( - make_tl_object( - update->flags_, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, - false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, update->id_, from_id, - make_tl_object(update->user_id_), std::move(update->fwd_from_), - update->via_bot_id_, update->reply_to_msg_id_, 0, update->date_, update->message_, nullptr, nullptr, - std::move(update->entities_), 0, 0, nullptr, 0, string(), 0, Auto()), - update->pts_, update->pts_count_), - 0, "telegram_api::updatesShortMessage"); + on_pending_update(make_tl_object( + make_tl_object( + update->flags_, false /*ignored*/, false /*ignored*/, false /*ignored*/, + false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, + false /*ignored*/, update->id_, make_tl_object(from_id), + make_tl_object(peer_id), std::move(update->fwd_from_), + update->via_bot_id_, std::move(update->reply_to_), update->date_, update->message_, + nullptr, nullptr, std::move(update->entities_), 0, 0, nullptr, 0, string(), 0, Auto()), + update->pts_, update->pts_count_), + 0, "telegram_api::updatesShortMessage"); break; } case telegram_api::updateShortChatMessage::ID: { @@ -724,16 +720,17 @@ void UpdatesManager::on_get_updates(tl_object_ptr &&updat } update->flags_ |= MessagesManager::MESSAGE_FLAG_HAS_FROM_ID; - on_pending_update(make_tl_object( - make_tl_object( - update->flags_, false /*ignored*/, false /*ignored*/, false /*ignored*/, - false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, - false /*ignored*/, update->id_, update->from_id_, - make_tl_object(update->chat_id_), std::move(update->fwd_from_), - update->via_bot_id_, update->reply_to_msg_id_, 0, update->date_, update->message_, - nullptr, nullptr, std::move(update->entities_), 0, 0, nullptr, 0, string(), 0, Auto()), - update->pts_, update->pts_count_), - 0, "telegram_api::updatesShortChatMessage"); + on_pending_update( + make_tl_object( + make_tl_object( + update->flags_, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, + false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, update->id_, + make_tl_object(update->from_id_), + make_tl_object(update->chat_id_), std::move(update->fwd_from_), + update->via_bot_id_, std::move(update->reply_to_), update->date_, update->message_, nullptr, nullptr, + std::move(update->entities_), 0, 0, nullptr, 0, string(), 0, Auto()), + update->pts_, update->pts_count_), + 0, "telegram_api::updatesShortChatMessage"); break; } case telegram_api::updateShort::ID: { From 4d47247fc135d63ec13b7521c74460bfda03e557 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 9 Sep 2020 02:32:07 +0300 Subject: [PATCH 4/4] Support chats as recent repliers. GitOrigin-RevId: 6da36600e99c655f4484f09fc787382481a3148b --- td/telegram/MessageReplyInfo.cpp | 8 ++------ td/telegram/MessageReplyInfo.h | 20 ++++++++++---------- td/telegram/MessagesManager.cpp | 15 +++++++++++---- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/td/telegram/MessageReplyInfo.cpp b/td/telegram/MessageReplyInfo.cpp index e4e77a85e..54ed838f7 100644 --- a/td/telegram/MessageReplyInfo.cpp +++ b/td/telegram/MessageReplyInfo.cpp @@ -6,8 +6,6 @@ // #include "td/telegram/MessageReplyInfo.h" -#include "td/telegram/DialogId.h" - #include "td/utils/logging.h" namespace td { @@ -27,9 +25,7 @@ MessageReplyInfo::MessageReplyInfo(tl_object_ptr & for (auto &peer : reply_info->recent_repliers_) { DialogId dialog_id(peer); if (dialog_id.is_valid()) { - if (dialog_id.get_type() == DialogType::User) { - recent_replier_user_ids.push_back(dialog_id.get_user_id()); - } + recent_replier_dialog_ids.push_back(dialog_id); } else { LOG(ERROR) << "Receive " << dialog_id << " as a recent replier"; } @@ -54,7 +50,7 @@ bool MessageReplyInfo::need_update_to(const MessageReplyInfo &other) const { } StringBuilder &operator<<(StringBuilder &string_builder, const MessageReplyInfo &reply_info) { - return string_builder << reply_info.reply_count << " replies by " << reply_info.recent_replier_user_ids; + return string_builder << reply_info.reply_count << " replies by " << reply_info.recent_replier_dialog_ids; } } // namespace td \ No newline at end of file diff --git a/td/telegram/MessageReplyInfo.h b/td/telegram/MessageReplyInfo.h index c7ae14dc8..bc4c1f90e 100644 --- a/td/telegram/MessageReplyInfo.h +++ b/td/telegram/MessageReplyInfo.h @@ -7,8 +7,8 @@ #pragma once #include "td/telegram/ChannelId.h" +#include "td/telegram/DialogId.h" #include "td/telegram/telegram_api.h" -#include "td/telegram/UserId.h" #include "td/utils/common.h" #include "td/utils/StringBuilder.h" @@ -19,7 +19,7 @@ namespace td { struct MessageReplyInfo { int32 reply_count = -1; int32 pts = -1; - vector recent_replier_user_ids; + vector recent_replier_dialog_ids; ChannelId channel_id; bool is_comment = false; @@ -36,17 +36,17 @@ struct MessageReplyInfo { template void store(StorerT &storer) const { CHECK(!is_empty()); - bool has_recent_replier_user_ids = !recent_replier_user_ids.empty(); + bool has_recent_replier_dialog_ids = !recent_replier_dialog_ids.empty(); bool has_channel_id = channel_id.is_valid(); BEGIN_STORE_FLAGS(); STORE_FLAG(is_comment); - STORE_FLAG(has_recent_replier_user_ids); + STORE_FLAG(has_recent_replier_dialog_ids); STORE_FLAG(has_channel_id); END_STORE_FLAGS(); td::store(reply_count, storer); td::store(pts, storer); - if (has_recent_replier_user_ids) { - td::store(recent_replier_user_ids, storer); + if (has_recent_replier_dialog_ids) { + td::store(recent_replier_dialog_ids, storer); } if (has_channel_id) { td::store(channel_id, storer); @@ -55,17 +55,17 @@ struct MessageReplyInfo { template void parse(ParserT &parser) { - bool has_recent_replier_user_ids = !recent_replier_user_ids.empty(); + bool has_recent_replier_dialog_ids = !recent_replier_dialog_ids.empty(); bool has_channel_id = channel_id.is_valid(); BEGIN_PARSE_FLAGS(); PARSE_FLAG(is_comment); - PARSE_FLAG(has_recent_replier_user_ids); + PARSE_FLAG(has_recent_replier_dialog_ids); PARSE_FLAG(has_channel_id); END_PARSE_FLAGS(); td::parse(reply_count, parser); td::parse(pts, parser); - if (has_recent_replier_user_ids) { - td::parse(recent_replier_user_ids, parser); + if (has_recent_replier_dialog_ids) { + td::parse(recent_replier_dialog_ids, parser); } if (has_channel_id) { td::parse(channel_id, parser); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 19cb1a1aa..8301e83ff 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -6132,10 +6132,15 @@ td_api::object_ptr MessagesManager::get_message_ return nullptr; } + vector recent_replier_user_ids; + for (auto recent_replier_dialog_id : m->reply_info.recent_replier_dialog_ids) { + if (dialog_id.get_type() == DialogType::User) { + recent_replier_user_ids.push_back(recent_replier_dialog_id.get_user_id()); + } + } return td_api::make_object( m->view_count, m->forward_count, m->reply_info.reply_count, - td_->contacts_manager_->get_user_ids_object(m->reply_info.recent_replier_user_ids, - "get_message_interaction_info_object")); + td_->contacts_manager_->get_user_ids_object(recent_replier_user_ids, "get_message_interaction_info_object")); } bool MessagesManager::update_message_interaction_info(DialogId dialog_id, Message *m, int32 view_count, @@ -20876,8 +20881,10 @@ void MessagesManager::add_message_dependencies(Dependencies &dependencies, Dialo add_dialog_dependencies(dependencies, m->forward_info->from_dialog_id); } } - for (auto recent_replier_user_id : m->reply_info.recent_replier_user_ids) { - dependencies.user_ids.insert(recent_replier_user_id); + for (auto recent_replier_dialog_id : m->reply_info.recent_replier_dialog_ids) { + if (dialog_id.get_type() == DialogType::User) { + dependencies.user_ids.insert(recent_replier_dialog_id.get_user_id()); + } } add_message_content_dependencies(dependencies, m->content.get()); }