Update API scheme on layer 144.

This commit is contained in:
John Preston 2022-07-19 12:31:12 +03:00
parent 04d4fdbf9b
commit de0eef8cc6
6 changed files with 144 additions and 218 deletions

View file

@ -761,6 +761,7 @@ messages.stickerSetInstallResultArchive#35e410a8 sets:Vector<StickerSetCovered>
stickerSetCovered#6410a5d2 set:StickerSet cover:Document = StickerSetCovered;
stickerSetMultiCovered#3407e51b set:StickerSet covers:Vector<Document> = StickerSetCovered;
stickerSetFullCovered#1aed5ee5 set:StickerSet packs:Vector<StickerPack> documents:Vector<Document> = 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<User> = 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<PaymentFormMethod> saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?PaymentSavedCredentials users:Vector<User> = payments.PaymentForm;
payments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector<ShippingOption> = 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;

View file

@ -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);
}
}
}

View file

@ -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) {

View file

@ -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<uint64>()).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();
}

View file

@ -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<MTPStickerSet> &data,
const QVector<MTPStickerSet> &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<std::vector<not_null<EmojiPtr>>> Stickers::getEmojiListFromSet(
return std::nullopt;
}
StickersSet *Stickers::feedSet(const MTPDstickerSet &data) {
not_null<StickersSet*> 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<StickersSet*> 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<StickersSet*> 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<StickersSet*> set,
const QVector<MTPDocument> &documents,
const QVector<MTPStickerPack> &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<StickersSet*> set,
const QVector<MTPDocument> &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) {

View file

@ -228,8 +228,16 @@ public:
std::optional<std::vector<not_null<EmojiPtr>>> getEmojiListFromSet(
not_null<DocumentData*> document);
StickersSet *feedSet(const MTPDstickerSet &data);
StickersSet *feedSetFull(const MTPDmessages_stickerSet &d);
not_null<StickersSet*> feedSet(const MTPStickerSet &data);
not_null<StickersSet*> feedSetFull(const MTPDmessages_stickerSet &data);
not_null<StickersSet*> feedSetCovered(const MTPStickerSetCovered &data);
void feedSetStickers(
not_null<StickersSet*> set,
const QVector<MTPDocument> &documents,
const QVector<MTPStickerPack> &packs);
void feedSetCovers(
not_null<StickersSet*> set,
const QVector<MTPDocument> &documents);
void newSetReceived(const MTPDmessages_stickerSet &set);
QString getSetTitle(const MTPDstickerSet &s);
@ -266,7 +274,7 @@ private:
const std::vector<TimeId> &&dates,
const QVector<MTPStickerPack> &packs);
void somethingReceived(
const QVector<MTPStickerSet> &data,
const QVector<MTPStickerSet> &list,
uint64 hash,
StickersType type);