From de0eef8cc6b5d9d97d5472cb78ba218497431c79 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 19 Jul 2022 12:31:12 +0300 Subject: [PATCH] Update API scheme on layer 144. --- Telegram/Resources/tl/api.tl | 5 +- Telegram/SourceFiles/boxes/stickers_box.cpp | 58 ++--- .../chat_helpers/emoji_list_widget.cpp | 6 +- .../chat_helpers/stickers_list_widget.cpp | 79 ++----- .../data/stickers/data_stickers.cpp | 200 ++++++++---------- .../SourceFiles/data/stickers/data_stickers.h | 14 +- 6 files changed, 144 insertions(+), 218 deletions(-) diff --git a/Telegram/Resources/tl/api.tl b/Telegram/Resources/tl/api.tl index fba3d5a4d..aa50bb4ea 100644 --- a/Telegram/Resources/tl/api.tl +++ b/Telegram/Resources/tl/api.tl @@ -761,6 +761,7 @@ messages.stickerSetInstallResultArchive#35e410a8 sets:Vector stickerSetCovered#6410a5d2 set:StickerSet cover:Document = StickerSetCovered; stickerSetMultiCovered#3407e51b set:StickerSet covers:Vector = StickerSetCovered; +stickerSetFullCovered#1aed5ee5 set:StickerSet packs:Vector documents:Vector = StickerSetCovered; maskCoords#aed6dbb2 n:int x:double y:double zoom:double = MaskCoords; @@ -852,7 +853,7 @@ inputWebFileGeoPointLocation#9f2221c9 geo_point:InputGeoPoint access_hash:long w upload.webFile#21e753bc size:int mime_type:string file_type:storage.FileType mtime:int bytes:bytes = upload.WebFile; -payments.paymentForm#b0133b37 flags:# can_save_credentials:flags.2?true password_missing:flags.3?true form_id:long bot_id:long title:string description:string photo:flags.5?WebDocument invoice:Invoice provider_id:long url:string native_provider:flags.4?string native_params:flags.4?DataJSON saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?PaymentSavedCredentials users:Vector = payments.PaymentForm; +payments.paymentForm#4cc5563f flags:# can_save_credentials:flags.2?true password_missing:flags.3?true form_id:long bot_id:long title:string description:string photo:flags.5?WebDocument invoice:Invoice provider_id:long url:string native_provider:flags.4?string native_params:flags.4?DataJSON additional_methods:flags.6?Vector saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?PaymentSavedCredentials users:Vector = payments.PaymentForm; payments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector = payments.ValidatedRequestedInfo; @@ -1399,6 +1400,8 @@ inputStorePaymentGiftPremium#616f7fe8 user_id:InputUser currency:string amount:l premiumGiftOption#74c34319 flags:# months:int currency:string amount:long bot_url:string store_product:flags.0?string = PremiumGiftOption; +paymentFormMethod#88f8f21b url:string title:string = PaymentFormMethod; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; diff --git a/Telegram/SourceFiles/boxes/stickers_box.cpp b/Telegram/SourceFiles/boxes/stickers_box.cpp index 107bf7419..12f460ca3 100644 --- a/Telegram/SourceFiles/boxes/stickers_box.cpp +++ b/Telegram/SourceFiles/boxes/stickers_box.cpp @@ -456,15 +456,8 @@ void StickersBox::showAttachedStickers() { } } }; - for (const auto &stickerSet : _attachedSets.v) { - const auto setData = stickerSet.match([&](const auto &data) { - return data.vset().match([&](const MTPDstickerSet &data) { - return &data; - }); - }); - if (const auto set = stickers->feedSet(*setData)) { - add(set); - } + for (const auto &set : _attachedSets.v) { + add(stickers->feedSetCovered(set)); } for (const auto &setId : _emojiSets) { const auto i = stickers->sets().find(setId.id); @@ -503,41 +496,22 @@ void StickersBox::getArchivedDone( auto addedSet = false; auto changedSets = false; - for (const auto &stickerSet : stickers.vsets().v) { - const MTPDstickerSet *setData = nullptr; - switch (stickerSet.type()) { - case mtpc_stickerSetCovered: { - auto &d = stickerSet.c_stickerSetCovered(); - if (d.vset().type() == mtpc_stickerSet) { - setData = &d.vset().c_stickerSet(); + for (const auto &data : stickers.vsets().v) { + const auto set = session().data().stickers().feedSetCovered(data); + const auto index = archived.indexOf(set->id); + if (archived.isEmpty() || index != archived.size() - 1) { + changedSets = true; + if (index >= 0 && index < archived.size() - 1) { + archived.removeAt(index); } - } break; - case mtpc_stickerSetMultiCovered: { - auto &d = stickerSet.c_stickerSetMultiCovered(); - if (d.vset().type() == mtpc_stickerSet) { - setData = &d.vset().c_stickerSet(); - } - } break; + archived.push_back(set->id); } - if (!setData) continue; - - if (const auto set = session().data().stickers().feedSet(*setData)) { - const auto index = archived.indexOf(set->id); - if (archived.isEmpty() || index != archived.size() - 1) { - changedSets = true; - if (index >= 0 && index < archived.size() - 1) { - archived.removeAt(index); - } - archived.push_back(set->id); - } - if (_archived.widget()->appendSet(set)) { - addedSet = true; - if (set->stickers.isEmpty() - || (set->flags & SetFlag::NotLoaded)) { - session().api().scheduleStickerSetRequest( - set->id, - set->accessHash); - } + if (_archived.widget()->appendSet(set)) { + addedSet = true; + if (set->flags & SetFlag::NotLoaded) { + session().api().scheduleStickerSetRequest( + set->id, + set->accessHash); } } } diff --git a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp index 119d4f6a7..f9f7a5fe2 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp @@ -1422,9 +1422,11 @@ void EmojiListWidget::updateSelected() { auto info = sectionInfoByOffset(p.y()); auto section = info.section; if (p.y() >= info.top && p.y() < info.rowsTop) { - if (hasRemoveButton(section) && myrtlrect(removeButtonRect(section)).contains(p.x(), p.y())) { + if (hasRemoveButton(section) + && myrtlrect( + removeButtonRect(section)).contains(p.x(), p.y())) { newSelected = OverButton{ section }; - } else { + } else if (section >= kEmojiSectionCount) { newSelected = OverSet{ section }; } } else if (p.y() >= info.rowsTop && p.y() < info.rowsBottom) { diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp index 13b833014..8234d75c8 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp @@ -348,38 +348,17 @@ void StickersListWidget::preloadMoreOfficial() { const auto &list = data.vsets().v; _officialOffset += list.size(); for (int i = 0, l = list.size(); i != l; ++i) { - auto &data = list[i]; - const auto setData = data.match([&](const auto &data) { - return data.vset().match([](const MTPDstickerSet &data) { - return &data; - }); - }); - const auto covers = data.match([](const MTPDstickerSetCovered &) { - return StickersPack(); - }, [&](const MTPDstickerSetMultiCovered &data) { - auto result = StickersPack(); - for (const auto &cover : data.vcovers().v) { - const auto document = session().data().processDocument(cover); - if (document->sticker()) { - result.push_back(document); - } - } - return result; - }); - if (const auto set = session().data().stickers().feedSet(*setData)) { - if (!covers.empty()) { - set->covers = covers; - } - if (set->stickers.empty() && set->covers.empty()) { - continue; - } - const auto externalLayout = true; - appendSet( - _officialSets, - set->id, - externalLayout, - AppendSkip::Installed); + const auto set = session().data().stickers().feedSetCovered( + list[i]); + if (set->stickers.empty() && set->covers.empty()) { + continue; } + const auto externalLayout = true; + appendSet( + _officialSets, + set->id, + externalLayout, + AppendSkip::Installed); } }); resizeToWidth(width()); @@ -800,40 +779,12 @@ void StickersListWidget::searchResultsDone( std::vector()).first; } auto &d = result.c_messages_foundStickerSets(); - for (const auto &stickerSet : d.vsets().v) { - const MTPDstickerSet *setData = nullptr; - StickersPack covers; - switch (stickerSet.type()) { - case mtpc_stickerSetCovered: { - auto &d = stickerSet.c_stickerSetCovered(); - if (d.vset().type() == mtpc_stickerSet) { - setData = &d.vset().c_stickerSet(); - } - } break; - case mtpc_stickerSetMultiCovered: { - auto &d = stickerSet.c_stickerSetMultiCovered(); - if (d.vset().type() == mtpc_stickerSet) { - setData = &d.vset().c_stickerSet(); - } - for (const auto &cover : d.vcovers().v) { - const auto document = session().data().processDocument(cover); - if (document->sticker()) { - covers.push_back(document); - } - } - } break; - } - if (!setData) continue; - - if (const auto set = session().data().stickers().feedSet(*setData)) { - if (!covers.empty()) { - set->covers = covers; - } - if (set->stickers.empty() && set->covers.empty()) { - continue; - } - it->second.push_back(set->id); + for (const auto &data : d.vsets().v) { + const auto set = session().data().stickers().feedSetCovered(data); + if (set->stickers.empty() && set->covers.empty()) { + continue; } + it->second.push_back(set->id); } showSearchResults(); } diff --git a/Telegram/SourceFiles/data/stickers/data_stickers.cpp b/Telegram/SourceFiles/data/stickers/data_stickers.cpp index 35429b365..b47fbbbe5 100644 --- a/Telegram/SourceFiles/data/stickers/data_stickers.cpp +++ b/Telegram/SourceFiles/data/stickers/data_stickers.cpp @@ -351,36 +351,19 @@ void Stickers::applyArchivedResult( auto masksCount = 0; auto stickersCount = 0; - for (const auto &stickerSet : v) { - const MTPDstickerSet *setData = nullptr; - switch (stickerSet.type()) { - case mtpc_stickerSetCovered: { - auto &d = stickerSet.c_stickerSetCovered(); - if (d.vset().type() == mtpc_stickerSet) { - setData = &d.vset().c_stickerSet(); - } - } break; - case mtpc_stickerSetMultiCovered: { - auto &d = stickerSet.c_stickerSetMultiCovered(); - if (d.vset().type() == mtpc_stickerSet) { - setData = &d.vset().c_stickerSet(); - } - } break; + for (const auto &data : v) { + const auto set = feedSetCovered(data); + if (set->flags & SetFlag::NotLoaded) { + setsToRequest.insert(set->id, set->accessHash); } - if (setData) { - auto set = feedSet(*setData); - if (set->stickers.isEmpty()) { - setsToRequest.insert(set->id, set->accessHash); - } - const auto masks = !!(set->flags & SetFlag::Masks); - (masks ? masksCount : stickersCount)++; - auto &order = masks ? maskSetsOrderRef() : setsOrderRef(); - const auto index = order.indexOf(set->id); - if (index >= 0) { - order.removeAt(index); - } - archived.push_back(set->id); + const auto masks = !!(set->flags & SetFlag::Masks); + (masks ? masksCount : stickersCount)++; + auto &order = masks ? maskSetsOrderRef() : setsOrderRef(); + const auto index = order.indexOf(set->id); + if (index >= 0) { + order.removeAt(index); } + archived.push_back(set->id); } if (!setsToRequest.isEmpty()) { for (auto i = setsToRequest.cbegin(), e = setsToRequest.cend(); i != e; ++i) { @@ -686,7 +669,7 @@ void Stickers::emojiReceived( } void Stickers::somethingReceived( - const QVector &data, + const QVector &list, uint64 hash, StickersType type) { auto &setsOrder = (type == StickersType::Emoji) @@ -711,11 +694,8 @@ void Stickers::somethingReceived( set->installDate = 0; } } - for (const auto &setData : data) { - if (setData.type() != mtpc_stickerSet) { - continue; - } - const auto set = feedSet(setData.c_stickerSet()); + for (const auto &info : list) { + const auto set = feedSet(info); if (!(set->flags & SetFlag::Archived) || (set->flags & SetFlag::Official)) { setsOrder.push_back(set->id); @@ -1279,8 +1259,9 @@ std::optional>> Stickers::getEmojiListFromSet( return std::nullopt; } -StickersSet *Stickers::feedSet(const MTPDstickerSet &data) { +not_null Stickers::feedSet(const MTPStickerSet &info) { auto &sets = setsRef(); + const auto &data = info.data(); auto it = sets.find(data.vid().v); auto title = getSetTitle(data); auto oldFlags = StickersSetFlags(0); @@ -1356,31 +1337,50 @@ StickersSet *Stickers::feedSet(const MTPDstickerSet &data) { return it->second.get(); } -StickersSet *Stickers::feedSetFull(const MTPDmessages_stickerSet &d) { - Expects(d.vset().type() == mtpc_stickerSet); +not_null Stickers::feedSetFull( + const MTPDmessages_stickerSet &data) { + const auto set = feedSet(data.vset()); + feedSetStickers(set, data.vdocuments().v, data.vpacks().v); + return set; +} - const auto &s = d.vset().c_stickerSet(); +not_null Stickers::feedSetCovered( + const MTPStickerSetCovered &data) { + const auto set = data.match([&](const auto &data) { + return feedSet(data.vset()); + }); + data.match([](const MTPDstickerSetCovered &data) { + }, [&](const MTPDstickerSetMultiCovered &data) { + feedSetCovers(set, data.vcovers().v); + }, [&](const MTPDstickerSetFullCovered &data) { + feedSetStickers(set, data.vdocuments().v, data.vpacks().v); + }); + return set; +} + +void Stickers::feedSetStickers( + not_null set, + const QVector &documents, + const QVector &packs) { + set->flags &= ~SetFlag::NotLoaded; auto &sets = setsRef(); const auto wasArchived = [&] { - auto it = sets.find(s.vid().v); + const auto it = sets.find(set->id); return (it != sets.end()) && (it->second->flags & SetFlag::Archived); }(); - auto set = feedSet(s); - - set->flags &= ~SetFlag::NotLoaded; - - const auto &d_docs = d.vdocuments().v; auto customIt = sets.find(Stickers::CustomSetId); const auto inputSet = set->identifier(); auto pack = StickersPack(); - pack.reserve(d_docs.size()); - for (const auto &item : d_docs) { + pack.reserve(documents.size()); + for (const auto &item : documents) { const auto document = owner().processDocument(item); - if (!document->sticker()) continue; + if (!document->sticker()) { + continue; + } pack.push_back(document); if (!document->sticker()->set.id) { @@ -1402,7 +1402,8 @@ StickersSet *Stickers::feedSetFull(const MTPDmessages_stickerSet &d) { auto writeRecent = false; auto &recent = getRecentPack(); for (auto i = recent.begin(); i != recent.cend();) { - if (set->stickers.indexOf(i->first) >= 0 && pack.indexOf(i->first) < 0) { + if (set->stickers.indexOf(i->first) >= 0 + && pack.indexOf(i->first) < 0) { i = recent.erase(i); writeRecent = true; } else { @@ -1412,43 +1413,24 @@ StickersSet *Stickers::feedSetFull(const MTPDmessages_stickerSet &d) { const auto isEmoji = !!(set->flags & SetFlag::Emoji); const auto isMasks = !!(set->flags & SetFlag::Masks); - if (pack.isEmpty()) { - const auto removeIndex = (isEmoji - ? emojiSetsOrder() - : isMasks - ? maskSetsOrder() - : setsOrder()).indexOf(set->id); - if (removeIndex >= 0) { - (isEmoji - ? emojiSetsOrderRef() - : isMasks - ? maskSetsOrderRef() - : setsOrderRef()).removeAt(removeIndex); - } - sets.remove(set->id); - set = nullptr; - } else { - set->stickers = pack; - set->emoji.clear(); - auto &v = d.vpacks().v; - for (auto i = 0, l = int(v.size()); i != l; ++i) { - if (v[i].type() != mtpc_stickerPack) continue; + set->stickers = pack; + set->emoji.clear(); + for (auto i = 0, l = int(packs.size()); i != l; ++i) { + const auto &pack = packs[i].data(); + if (auto emoji = Ui::Emoji::Find(qs(pack.vemoticon()))) { + emoji = emoji->original(); + auto &stickers = pack.vdocuments().v; - auto &pack = v[i].c_stickerPack(); - if (auto emoji = Ui::Emoji::Find(qs(pack.vemoticon()))) { - emoji = emoji->original(); - auto &stickers = pack.vdocuments().v; - - StickersPack p; - p.reserve(stickers.size()); - for (auto j = 0, c = int(stickers.size()); j != c; ++j) { - auto doc = owner().document(stickers[j].v); - if (!doc || !doc->sticker()) continue; - - p.push_back(doc); + auto p = StickersPack(); + p.reserve(stickers.size()); + for (auto j = 0, c = int(stickers.size()); j != c; ++j) { + const auto document = owner().document(stickers[j].v); + if (!document->sticker()) { + continue; } - set->emoji.insert(emoji, p); + p.push_back(document); } + set->emoji.insert(emoji, p); } } @@ -1456,34 +1438,40 @@ StickersSet *Stickers::feedSetFull(const MTPDmessages_stickerSet &d) { session().saveSettings(); } - if (set) { - const auto isArchived = !!(set->flags & SetFlag::Archived); - if ((set->flags & SetFlag::Installed) && !isArchived) { - if (isEmoji) { - session().local().writeInstalledCustomEmoji(); - } else if (isMasks) { - session().local().writeInstalledMasks(); - } else { - session().local().writeInstalledStickers(); - } - } - if (set->flags & SetFlag::Featured) { - session().local().writeFeaturedStickers(); - } - if (wasArchived != isArchived) { - if (isEmoji) { - - } else if (isMasks) { - session().local().writeArchivedMasks(); - } else { - session().local().writeArchivedStickers(); - } + const auto isArchived = !!(set->flags & SetFlag::Archived); + if ((set->flags & SetFlag::Installed) && !isArchived) { + if (isEmoji) { + session().local().writeInstalledCustomEmoji(); + } else if (isMasks) { + session().local().writeInstalledMasks(); + } else { + session().local().writeInstalledStickers(); + } + } + if (set->flags & SetFlag::Featured) { + session().local().writeFeaturedStickers(); + } + if (wasArchived != isArchived) { + if (isEmoji) { + } else if (isMasks) { + session().local().writeArchivedMasks(); + } else { + session().local().writeArchivedStickers(); } } - notifyUpdated(); +} - return set; +void Stickers::feedSetCovers( + not_null set, + const QVector &documents) { + set->covers = StickersPack(); + for (const auto &cover : documents) { + const auto document = session().data().processDocument(cover); + if (document->sticker()) { + set->covers.push_back(document); + } + } } void Stickers::newSetReceived(const MTPDmessages_stickerSet &set) { diff --git a/Telegram/SourceFiles/data/stickers/data_stickers.h b/Telegram/SourceFiles/data/stickers/data_stickers.h index 76f18713b..ac502aa32 100644 --- a/Telegram/SourceFiles/data/stickers/data_stickers.h +++ b/Telegram/SourceFiles/data/stickers/data_stickers.h @@ -228,8 +228,16 @@ public: std::optional>> getEmojiListFromSet( not_null document); - StickersSet *feedSet(const MTPDstickerSet &data); - StickersSet *feedSetFull(const MTPDmessages_stickerSet &d); + not_null feedSet(const MTPStickerSet &data); + not_null feedSetFull(const MTPDmessages_stickerSet &data); + not_null feedSetCovered(const MTPStickerSetCovered &data); + void feedSetStickers( + not_null set, + const QVector &documents, + const QVector &packs); + void feedSetCovers( + not_null set, + const QVector &documents); void newSetReceived(const MTPDmessages_stickerSet &set); QString getSetTitle(const MTPDstickerSet &s); @@ -266,7 +274,7 @@ private: const std::vector &&dates, const QVector &packs); void somethingReceived( - const QVector &data, + const QVector &list, uint64 hash, StickersType type);