From b52b133f303b272e35946cd9e14945819957205a Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 7 Oct 2021 18:39:23 +0400 Subject: [PATCH 001/349] Process all message types from TDLib. --- .../SourceFiles/api/api_text_entities.cpp | 10 ++ Telegram/SourceFiles/api/api_text_entities.h | 4 + Telegram/SourceFiles/apiwrap.cpp | 1 + Telegram/SourceFiles/data/data_location.cpp | 8 ++ Telegram/SourceFiles/data/data_location.h | 6 + .../SourceFiles/data/data_media_types.cpp | 41 ++++++ Telegram/SourceFiles/data/data_media_types.h | 13 ++ Telegram/SourceFiles/data/data_peer_id.cpp | 10 +- Telegram/SourceFiles/data/data_peer_id.h | 3 + Telegram/SourceFiles/history/history_item.cpp | 6 + Telegram/SourceFiles/history/history_item.h | 2 + .../history/history_item_reply_markup.cpp | 131 ++++++++++++++++++ .../history/history_item_reply_markup.h | 32 +++++ 13 files changed, 266 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/api/api_text_entities.cpp b/Telegram/SourceFiles/api/api_text_entities.cpp index 84f7fef7daee13..f78c42b8e8fc1c 100644 --- a/Telegram/SourceFiles/api/api_text_entities.cpp +++ b/Telegram/SourceFiles/api/api_text_entities.cpp @@ -409,4 +409,14 @@ EntitiesInText EntitiesFromTL( return result; } +TextWithEntities FormattedTextFromTL( + Main::Session *session, + const TLformattedText &text) { + const auto &formatted = text.data(); + return TextWithEntities{ + formatted.vtext().v, + Api::EntitiesFromTL(session, formatted.ventities().v) + }; +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_text_entities.h b/Telegram/SourceFiles/api/api_text_entities.h index ca69a55a3ccd4e..80c7b96820416a 100644 --- a/Telegram/SourceFiles/api/api_text_entities.h +++ b/Telegram/SourceFiles/api/api_text_entities.h @@ -34,4 +34,8 @@ enum class ConvertOption { Main::Session *session, const QVector &entities); +[[nodiscard]] TextWithEntities FormattedTextFromTL( + Main::Session *session, + const Tdb::TLformattedText &text); + } // namespace Api diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index af8a8637d9542a..8a4bc33f9064c3 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -993,6 +993,7 @@ void ApiWrap::requestMoreDialogs(Data::Folder *folder) { } state->firstRequested = true; state->requestId = 0; + state->listReceived = true; }).send(); if (!folder) { diff --git a/Telegram/SourceFiles/data/data_location.cpp b/Telegram/SourceFiles/data/data_location.cpp index 457bb641136a9d..4635481d18e196 100644 --- a/Telegram/SourceFiles/data/data_location.cpp +++ b/Telegram/SourceFiles/data/data_location.cpp @@ -9,10 +9,13 @@ For license and copyright information please follow this link: #include "ui/image/image.h" #include "data/data_file_origin.h" +#include "tdb/tdb_tl_scheme.h" namespace Data { namespace { +using namespace Tdb; + [[nodiscard]] QString AsString(float64 value) { constexpr auto kPrecision = 6; return QString::number(value, 'f', kPrecision); @@ -31,6 +34,11 @@ LocationPoint::LocationPoint(float64 lat, float64 lon, IgnoreAccessHash) , _lon(lon) { } +LocationPoint::LocationPoint(const TLlocation &point) +: _lat(point.data().vlatitude().v) +, _lon(point.data().vlongitude().v) { +} + QString LocationPoint::latAsString() const { return AsString(_lat); } diff --git a/Telegram/SourceFiles/data/data_location.h b/Telegram/SourceFiles/data/data_location.h index 114d21c08edb98..ab688e663f642c 100644 --- a/Telegram/SourceFiles/data/data_location.h +++ b/Telegram/SourceFiles/data/data_location.h @@ -7,6 +7,10 @@ For license and copyright information please follow this link: */ #pragma once +namespace Tdb { +class TLlocation; +} // namespace Tdb + namespace Data { struct FileOrigin; @@ -21,6 +25,8 @@ class LocationPoint { }; LocationPoint(float64 lat, float64 lon, IgnoreAccessHash); + explicit LocationPoint(const Tdb::TLlocation &point); + [[nodiscard]] QString latAsString() const; [[nodiscard]] QString lonAsString() const; [[nodiscard]] MTPGeoPoint toMTP() const; diff --git a/Telegram/SourceFiles/data/data_media_types.cpp b/Telegram/SourceFiles/data/data_media_types.cpp index 81dc056e912e1c..422555cfe156d5 100644 --- a/Telegram/SourceFiles/data/data_media_types.cpp +++ b/Telegram/SourceFiles/data/data_media_types.cpp @@ -76,6 +76,8 @@ For license and copyright information please follow this link: #include "styles/style_chat.h" #include "styles/style_dialogs.h" +#include "tdb/tdb_tl_scheme.h" + namespace Data { namespace { @@ -83,6 +85,8 @@ constexpr auto kFastRevokeRestriction = 24 * 60 * TimeId(60); constexpr auto kMaxPreviewImages = 3; constexpr auto kLoadingStoryPhotoId = PhotoId(0x7FFF'DEAD'FFFF'FFFFULL); +using namespace Tdb; + using ItemPreview = HistoryView::ItemPreview; using ItemPreviewImage = HistoryView::ItemPreviewImage; @@ -405,6 +409,7 @@ TextForMimeData WithCaptionClipboardText( } // namespace +#if 0 // mtp Invoice ComputeInvoiceData( not_null item, const MTPDmessageMediaInvoice &data) { @@ -518,6 +523,42 @@ GiveawayResults ComputeGiveawayResultsData( } return result; } +#endif + +Invoice ComputeInvoiceData( + not_null item, + const TLDmessageInvoice &data) { + return { + .receiptMsgId = data.vreceipt_message_id().v, + .amount = uint64(data.vtotal_amount().v), + .currency = data.vcurrency().v, + .title = TextUtilities::SingleLine(data.vtitle().v), + .description = data.vdescription().v, + .photo = nullptr/*(data.vphoto() + ? item->history()->owner().processPhoto(*data.vphoto()) + : nullptr)*/, + .isTest = data.vis_test().v, + }; +} + +Call ComputeCallData(const TLDmessageCall &call) { + auto result = Call(); + result.finishReason = call.vdiscard_reason().match([]( + const TLDcallDiscardReasonDeclined &) { + return CallFinishReason::Busy; + }, [](const TLDcallDiscardReasonDisconnected &) { + return CallFinishReason::Disconnected; + }, [](const TLDcallDiscardReasonHungUp &) { + return CallFinishReason::Hangup; + }, [](const TLDcallDiscardReasonMissed &) { + return CallFinishReason::Missed; + }, [](const TLDcallDiscardReasonEmpty &) { + return CallFinishReason::Hangup; + }); + result.duration = call.vduration().v; + result.video = call.vis_video().v; + return result; +} bool HasExtendedMedia(const Invoice &invoice) { return !invoice.extendedMedia.empty(); diff --git a/Telegram/SourceFiles/data/data_media_types.h b/Telegram/SourceFiles/data/data_media_types.h index e1213e39a3873a..97ce6a13b78d89 100644 --- a/Telegram/SourceFiles/data/data_media_types.h +++ b/Telegram/SourceFiles/data/data_media_types.h @@ -11,6 +11,11 @@ For license and copyright information please follow this link: #include "data/data_location.h" #include "data/data_wall_paper.h" +namespace Tdb { +class TLDmessageInvoice; +class TLDmessageCall; +} // namespace Tdb + class Image; class History; class HistoryItem; @@ -760,6 +765,7 @@ class MediaGiveawayResults final : public Media { }; +#if 0 // mtp [[nodiscard]] Invoice ComputeInvoiceData( not_null item, const MTPDmessageMediaInvoice &data); @@ -772,6 +778,13 @@ class MediaGiveawayResults final : public Media { [[nodiscard]] GiveawayStart ComputeGiveawayStartData( not_null item, const MTPDmessageMediaGiveaway &data); +#endif + +[[nodiscard]] Invoice ComputeInvoiceData( + not_null item, + const Tdb::TLDmessageInvoice &data); + +[[nodiscard]] Call ComputeCallData(const Tdb::TLDmessageCall &call); [[nodiscard]] GiveawayResults ComputeGiveawayResultsData( not_null item, diff --git a/Telegram/SourceFiles/data/data_peer_id.cpp b/Telegram/SourceFiles/data/data_peer_id.cpp index 74cfcb2e44b402..fc3eccc53cb291 100644 --- a/Telegram/SourceFiles/data/data_peer_id.cpp +++ b/Telegram/SourceFiles/data/data_peer_id.cpp @@ -7,7 +7,7 @@ For license and copyright information please follow this link: */ #include "data/data_peer_id.h" -#include "tdb/details/tdb_tl_core.h" +#include "tdb/tdb_tl_scheme.h" PeerId peerFromTdbChat(Tdb::TLint53 id) noexcept { //constexpr int64 MIN_SECRET_ID = -2002147483648ll; // From TDLib. @@ -45,6 +45,14 @@ Tdb::TLint53 peerToTdbChat(PeerId id) noexcept { return Tdb::tl_int53(0); } +PeerId peerFromSender(const Tdb::TLmessageSender &sender) noexcept { + return sender.match([&](const Tdb::TLDmessageSenderUser &data) { + return peerFromUser(data.vuser_id()); + }, [&](const Tdb::TLDmessageSenderChat &data) { + return peerFromTdbChat(data.vchat_id()); + }); +} + PeerId peerFromMTP(const MTPPeer &peer) { return peer.match([](const MTPDpeerUser &data) { return peerFromUser(data.vuser_id()); diff --git a/Telegram/SourceFiles/data/data_peer_id.h b/Telegram/SourceFiles/data/data_peer_id.h index 9f1d8d8af3f263..9f28c35f7972b6 100644 --- a/Telegram/SourceFiles/data/data_peer_id.h +++ b/Telegram/SourceFiles/data/data_peer_id.h @@ -15,6 +15,7 @@ class int64_type; namespace Tdb { using TLint53 = tl::int64_type; +class TLmessageSender; } // namespace Tdb struct PeerIdZeroHelper { @@ -224,6 +225,8 @@ bool operator>=(PeerIdZero, PeerId) = delete; } [[nodiscard]] PeerId peerFromTdbChat(Tdb::TLint53 id) noexcept; +[[nodiscard]] PeerId peerFromSender( + const Tdb::TLmessageSender &sender) noexcept; [[nodiscard]] inline constexpr UserId peerToUser(PeerId id) noexcept { return id.to(); diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index de78c1ce658dab..a92eaa4b81d755 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -3170,6 +3170,12 @@ bool HistoryItem::hasUnpaidContent() const { return false; } +void HistoryItem::applyTTL(const TLDmessage &data) { + if (const auto period = data.vttl().v) { + applyTTL(data.vdate().v + period); + } +} + void HistoryItem::sendFailed() { Expects(_flags & MessageFlag::BeingSent); Expects(!(_flags & MessageFlag::SendingFailed)); diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 34cca5dc37bfdf..5b8fc5a2a9de4c 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -670,6 +670,8 @@ class HistoryItem final : public RuntimeComposer { void flagSensitiveContent(); [[nodiscard]] PeerData *computeDisplayFrom() const; + void applyTTL(const Tdb::TLDmessage &data); + const not_null _history; const not_null _from; mutable PeerData *_displayFrom = nullptr; diff --git a/Telegram/SourceFiles/history/history_item_reply_markup.cpp b/Telegram/SourceFiles/history/history_item_reply_markup.cpp index 5cd532ad5e8f98..5c0baebc130d4f 100644 --- a/Telegram/SourceFiles/history/history_item_reply_markup.cpp +++ b/Telegram/SourceFiles/history/history_item_reply_markup.cpp @@ -14,6 +14,8 @@ For license and copyright information please follow this link: namespace { +using namespace Tdb; + [[nodiscard]] InlineBots::PeerTypes PeerTypesFromMTP( const MTPvector &types) { using namespace InlineBots; @@ -231,6 +233,90 @@ void HistoryMessageMarkupData::fillRows( } } +template +void HistoryMessageMarkupData::fillRows( + const QVector> &list) { + rows.clear(); + if (list.isEmpty()) { + return; + } + + rows.reserve(list.size()); + for (const auto &buttons : list) { + auto row = std::vector