From 81c0afafa35a4010b3eeb2c1367ea3719fd0750e Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 24 Sep 2018 04:25:24 +0300 Subject: [PATCH] Allow limit == -offset in getChatHistory. GitOrigin-RevId: 8a050a75c0428304bb61c36a2c284b6309c6a8ea --- td/generate/scheme/td_api.tl | 4 ++-- td/telegram/MessagesManager.cpp | 33 +++++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 0505c0b5..76e69cbb 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -2505,8 +2505,8 @@ getGroupsInCommon user_id:int32 offset_chat_id:int53 limit:int32 = Chats; //-For optimal performance the number of returned messages is chosen by the library. This is an offline request if only_local is true //@chat_id Chat identifier //@from_message_id Identifier of the message starting from which history must be fetched; use 0 to get results from the last message -//@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 +//@offset Specify 0 to get results from exactly the from_message_id or a negative offset up to 99 to get additionally 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 or equal to -offset. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached //@only_local If true, returns only messages that are available locally without sending network requests getChatHistory chat_id:int53 from_message_id:int53 offset:int32 limit:int32 only_local:Bool = Messages; diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index c24763a4..15e0bd76 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -14080,14 +14080,25 @@ tl_object_ptr MessagesManager::get_dialog_history(DialogId dia if (limit > MAX_GET_HISTORY) { limit = MAX_GET_HISTORY; } - if (limit <= -offset) { - promise.set_error(Status::Error(5, "Parameter limit must be greater than -offset")); - return nullptr; - } if (offset > 0) { promise.set_error(Status::Error(5, "Parameter offset must be non-positive")); return nullptr; } + if (offset <= -MAX_GET_HISTORY) { + promise.set_error(Status::Error(5, "Parameter offset must be greater than -100")); + return nullptr; + } + if (offset < -limit) { + promise.set_error(Status::Error(5, "Parameter offset must not be less than -limit")); + return nullptr; + } + bool is_limit_increased = false; + if (limit == -offset) { + limit++; + is_limit_increased = true; + } + CHECK(0 < limit && limit <= MAX_GET_HISTORY); + CHECK(-limit < offset && offset <= 0); if (from_message_id == MessageId() || from_message_id.get() > MessageId::max().get()) { from_message_id = MessageId::max(); @@ -14184,7 +14195,7 @@ tl_object_ptr MessagesManager::get_dialog_history(DialogId dia << ", offset = " << offset << ", limit = " << limit << ", from_the_end = " << from_the_end; vector> messages; if (*p != nullptr && offset == 0) { - while (*p != nullptr && limit-- > 0) { + while (*p != nullptr && messages.size() < static_cast(limit)) { messages.push_back(get_message_object(dialog_id, *p)); from_message_id = (*p)->message_id; --p; @@ -14196,16 +14207,22 @@ tl_object_ptr MessagesManager::get_dialog_history(DialogId dia CHECK(offset == 0); preload_newer_messages(d, MessageId(messages[0]->id_)); preload_older_messages(d, MessageId(messages.back()->id_)); - } else if (limit > 0 && (/*d->first_remote_message_id != -1 && */ left_tries != 0)) { + } else if (messages.size() < static_cast(limit) && left_tries != 0) { // there can be more messages on the server, need to load them if (from_the_end) { from_message_id = MessageId(); } - send_closure_later(actor_id(this), &MessagesManager::load_messages, d->dialog_id, from_message_id, offset, limit, - left_tries, only_local, std::move(promise)); + send_closure_later(actor_id(this), &MessagesManager::load_messages, d->dialog_id, from_message_id, offset, + limit - static_cast(messages.size()), left_tries, only_local, std::move(promise)); return nullptr; } + LOG(INFO) << "Have " << messages.size() << " messages out of requested " + << (is_limit_increased ? "increased " : "exact ") << limit; + if (is_limit_increased && static_cast(limit) == messages.size()) { + messages.pop_back(); + } + LOG(INFO) << "Return " << messages.size() << " messages in result to getChatHistory"; promise.set_value(Unit()); // can send some messages return get_messages_object(-1, std::move(messages)); // TODO return real total_count of messages in the dialog