Fix processing of empty messages.

This commit is contained in:
levlam 2021-11-02 18:30:11 +03:00
parent 9d467d1ea5
commit babb66d3e0

View File

@ -464,14 +464,16 @@ class GetMessagesQuery final : public Td::ResultHandler {
class GetChannelMessagesQuery final : public Td::ResultHandler { class GetChannelMessagesQuery final : public Td::ResultHandler {
Promise<Unit> promise_; Promise<Unit> promise_;
ChannelId channel_id_; ChannelId channel_id_;
MessageId last_new_message_id_;
public: public:
explicit GetChannelMessagesQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) { explicit GetChannelMessagesQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
} }
void send(ChannelId channel_id, tl_object_ptr<telegram_api::InputChannel> &&input_channel, void send(ChannelId channel_id, tl_object_ptr<telegram_api::InputChannel> &&input_channel,
vector<tl_object_ptr<telegram_api::InputMessage>> &&message_ids) { vector<tl_object_ptr<telegram_api::InputMessage>> &&message_ids, MessageId last_new_message_id) {
channel_id_ = channel_id; channel_id_ = channel_id;
last_new_message_id_ = last_new_message_id;
CHECK(input_channel != nullptr); CHECK(input_channel != nullptr);
send_query(G()->net_query_creator().create( send_query(G()->net_query_creator().create(
telegram_api::channels_getMessages(std::move(input_channel), std::move(message_ids)))); telegram_api::channels_getMessages(std::move(input_channel), std::move(message_ids))));
@ -485,12 +487,14 @@ class GetChannelMessagesQuery final : public Td::ResultHandler {
auto info = td->messages_manager_->get_messages_info(result_ptr.move_as_ok(), "GetChannelMessagesQuery"); auto info = td->messages_manager_->get_messages_info(result_ptr.move_as_ok(), "GetChannelMessagesQuery");
LOG_IF(ERROR, !info.is_channel_messages) << "Receive ordinary messages in GetChannelMessagesQuery"; LOG_IF(ERROR, !info.is_channel_messages) << "Receive ordinary messages in GetChannelMessagesQuery";
if (!td->auth_manager_->is_bot()) { // bots can receive messageEmpty because of their privacy mode // messages with invalid big identifiers can be received as messageEmpty
// bots can receive messageEmpty because of their privacy mode
if (last_new_message_id_.is_valid() && !td->auth_manager_->is_bot()) {
vector<MessageId> empty_message_ids; vector<MessageId> empty_message_ids;
for (auto &message : info.messages) { for (auto &message : info.messages) {
if (message->get_id() == telegram_api::messageEmpty::ID) { if (message->get_id() == telegram_api::messageEmpty::ID) {
auto message_id = MessagesManager::get_message_id(message, false); auto message_id = MessagesManager::get_message_id(message, false);
if (message_id.is_valid()) { if (message_id.is_valid() && message_id <= last_new_message_id_) {
empty_message_ids.push_back(message_id); empty_message_ids.push_back(message_id);
} }
} }
@ -17856,8 +17860,10 @@ void MessagesManager::get_messages_from_server(vector<FullMessageId> &&message_i
mpas.get_promise().set_error(Status::Error(400, "Can't access the chat")); mpas.get_promise().set_error(Status::Error(400, "Can't access the chat"));
continue; continue;
} }
const auto *d = get_dialog_force(DialogId(it.first));
td_->create_handler<GetChannelMessagesQuery>(mpas.get_promise()) td_->create_handler<GetChannelMessagesQuery>(mpas.get_promise())
->send(it.first, std::move(input_channel), std::move(it.second)); ->send(it.first, std::move(input_channel), std::move(it.second),
d == nullptr ? MessageId() : d->last_new_message_id);
} }
lock.set_value(Unit()); lock.set_value(Unit());
} }