From 6cfbccd955d959029b3d0dbe96ee502dc67e4eb4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 23 Dec 2024 16:09:37 +0400 Subject: [PATCH] Handle report_delivery_until_date. --- Telegram/SourceFiles/data/data_histories.cpp | 53 +++++++++++++++++++ Telegram/SourceFiles/data/data_histories.h | 7 +++ Telegram/SourceFiles/history/history_item.cpp | 7 +++ 3 files changed, 67 insertions(+) diff --git a/Telegram/SourceFiles/data/data_histories.cpp b/Telegram/SourceFiles/data/data_histories.cpp index f68eed90e9..e9b0b02575 100644 --- a/Telegram/SourceFiles/data/data_histories.cpp +++ b/Telegram/SourceFiles/data/data_histories.cpp @@ -32,6 +32,7 @@ namespace Data { namespace { constexpr auto kReadRequestTimeout = 3 * crl::time(1000); +constexpr auto kReportDeliveriesPerRequest = 50; } // namespace @@ -566,6 +567,58 @@ void Histories::sendPendingReadInbox(not_null history) { } } +void Histories::reportDelivery(not_null item) { + auto &set = _pendingDeliveryReport[item->history()->peer]; + if (!set.emplace(item->id).second) { + return; + } + crl::on_main(&session(), [=] { + reportPendingDeliveries(); + }); +} + +void Histories::reportPendingDeliveries() { + auto &pending = _pendingDeliveryReport; + for (auto i = begin(pending); i != end(pending);) { + auto &[peer, ids] = *i; + auto list = QVector(); + if (_deliveryReportSent.contains(peer)) { + ++i; + continue; + } else if (ids.size() > kReportDeliveriesPerRequest) { + const auto count = kReportDeliveriesPerRequest; + list.reserve(count); + for (auto j = begin(ids), till = j + count; j != till; ++j) { + list.push_back(MTP_int(*j)); + } + ids.erase(begin(ids), begin(ids) + count); + } else if (!ids.empty()) { + list.reserve(ids.size()); + for (const auto &id : ids) { + list.push_back(MTP_int(id)); + } + ids.clear(); + } + if (ids.empty()) { + i = pending.erase(i); + } else { + ++i; + } + _deliveryReportSent.emplace(peer); + const auto finish = [=] { + _deliveryReportSent.remove(peer); + if (_pendingDeliveryReport.contains(peer)) { + reportPendingDeliveries(); + } + }; + session().api().request(MTPmessages_ReportMessagesDelivery( + MTP_flags(0), + peer->input, + MTP_vector(std::move(list)) + )).done(finish).fail(finish).send(); + } +} + void Histories::sendReadRequests() { DEBUG_LOG(("Reading: send requests with count %1.").arg(_states.size())); if (_states.empty()) { diff --git a/Telegram/SourceFiles/data/data_histories.h b/Telegram/SourceFiles/data/data_histories.h index dd2900a41c..eb8645c5a6 100644 --- a/Telegram/SourceFiles/data/data_histories.h +++ b/Telegram/SourceFiles/data/data_histories.h @@ -63,6 +63,7 @@ public: void readInboxOnNewMessage(not_null item); void readClientSideMessage(not_null item); void sendPendingReadInbox(not_null history); + void reportDelivery(not_null item); void requestDialogEntry(not_null folder); void requestDialogEntry( @@ -201,6 +202,7 @@ private: void postponeRequestDialogEntries(); void sendDialogRequests(); + void reportPendingDeliveries(); [[nodiscard]] bool isCreatingTopic( not_null history, @@ -236,6 +238,11 @@ private: base::flat_map _createdTopicIds; base::flat_set _creatingTopicRequests; + base::flat_map< + not_null, + base::flat_set> _pendingDeliveryReport; + base::flat_set> _deliveryReportSent; + }; } // namespace Data diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 69be637cef..816f69e64a 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -59,6 +59,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_channel.h" #include "data/data_chat.h" #include "data/data_game.h" +#include "data/data_histories.h" #include "data/data_history_messages.h" #include "data/data_user.h" #include "data/data_group_call.h" // Data::GroupCall::id(). @@ -449,6 +450,12 @@ HistoryItem::HistoryItem( Get()->data = check; } } + + if (const auto until = data.vreport_delivery_until_date()) { + if (base::unixtime::now() < TimeId(until->v)) { + history->owner().histories().reportDelivery(this); + } + } } HistoryItem::HistoryItem(