Allow limit == -offset in getChatHistory.
GitOrigin-RevId: 8a050a75c0428304bb61c36a2c284b6309c6a8ea
This commit is contained in:
parent
86bc53bb0e
commit
81c0afafa3
@ -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
|
//-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
|
//@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
|
//@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
|
//@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 than -offset. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached
|
//@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
|
//@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;
|
getChatHistory chat_id:int53 from_message_id:int53 offset:int32 limit:int32 only_local:Bool = Messages;
|
||||||
|
|
||||||
|
@ -14080,14 +14080,25 @@ tl_object_ptr<td_api::messages> MessagesManager::get_dialog_history(DialogId dia
|
|||||||
if (limit > MAX_GET_HISTORY) {
|
if (limit > MAX_GET_HISTORY) {
|
||||||
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) {
|
if (offset > 0) {
|
||||||
promise.set_error(Status::Error(5, "Parameter offset must be non-positive"));
|
promise.set_error(Status::Error(5, "Parameter offset must be non-positive"));
|
||||||
return nullptr;
|
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()) {
|
if (from_message_id == MessageId() || from_message_id.get() > MessageId::max().get()) {
|
||||||
from_message_id = MessageId::max();
|
from_message_id = MessageId::max();
|
||||||
@ -14184,7 +14195,7 @@ tl_object_ptr<td_api::messages> MessagesManager::get_dialog_history(DialogId dia
|
|||||||
<< ", offset = " << offset << ", limit = " << limit << ", from_the_end = " << from_the_end;
|
<< ", offset = " << offset << ", limit = " << limit << ", from_the_end = " << from_the_end;
|
||||||
vector<tl_object_ptr<td_api::message>> messages;
|
vector<tl_object_ptr<td_api::message>> messages;
|
||||||
if (*p != nullptr && offset == 0) {
|
if (*p != nullptr && offset == 0) {
|
||||||
while (*p != nullptr && limit-- > 0) {
|
while (*p != nullptr && messages.size() < static_cast<size_t>(limit)) {
|
||||||
messages.push_back(get_message_object(dialog_id, *p));
|
messages.push_back(get_message_object(dialog_id, *p));
|
||||||
from_message_id = (*p)->message_id;
|
from_message_id = (*p)->message_id;
|
||||||
--p;
|
--p;
|
||||||
@ -14196,16 +14207,22 @@ tl_object_ptr<td_api::messages> MessagesManager::get_dialog_history(DialogId dia
|
|||||||
CHECK(offset == 0);
|
CHECK(offset == 0);
|
||||||
preload_newer_messages(d, MessageId(messages[0]->id_));
|
preload_newer_messages(d, MessageId(messages[0]->id_));
|
||||||
preload_older_messages(d, MessageId(messages.back()->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<size_t>(limit) && left_tries != 0) {
|
||||||
// there can be more messages on the server, need to load them
|
// there can be more messages on the server, need to load them
|
||||||
if (from_the_end) {
|
if (from_the_end) {
|
||||||
from_message_id = MessageId();
|
from_message_id = MessageId();
|
||||||
}
|
}
|
||||||
send_closure_later(actor_id(this), &MessagesManager::load_messages, d->dialog_id, from_message_id, offset, limit,
|
send_closure_later(actor_id(this), &MessagesManager::load_messages, d->dialog_id, from_message_id, offset,
|
||||||
left_tries, only_local, std::move(promise));
|
limit - static_cast<int32>(messages.size()), left_tries, only_local, std::move(promise));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG(INFO) << "Have " << messages.size() << " messages out of requested "
|
||||||
|
<< (is_limit_increased ? "increased " : "exact ") << limit;
|
||||||
|
if (is_limit_increased && static_cast<size_t>(limit) == messages.size()) {
|
||||||
|
messages.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
LOG(INFO) << "Return " << messages.size() << " messages in result to getChatHistory";
|
LOG(INFO) << "Return " << messages.size() << " messages in result to getChatHistory";
|
||||||
promise.set_value(Unit()); // can send some messages
|
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
|
return get_messages_object(-1, std::move(messages)); // TODO return real total_count of messages in the dialog
|
||||||
|
Reference in New Issue
Block a user