From 5f3db95cbd902912f327ec5948b55aa16f3fc0d3 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 25 Dec 2024 13:04:07 +0400 Subject: [PATCH] Parse unique gift fields. --- Telegram/CMakeLists.txt | 1 + Telegram/SourceFiles/api/api_premium.cpp | 62 +++++++++++-- Telegram/SourceFiles/api/api_premium.h | 37 +------- Telegram/SourceFiles/boxes/star_gift_box.cpp | 92 +++++++++++-------- Telegram/SourceFiles/data/data_star_gift.h | 77 ++++++++++++++++ .../view/media/history_view_service_box.cpp | 2 +- .../peer_gifts/info_peer_gifts_common.cpp | 56 ++++++++--- .../info/peer_gifts/info_peer_gifts_common.h | 15 ++- .../peer_gifts/info_peer_gifts_widget.cpp | 5 +- .../info/peer_gifts/info_peer_gifts_widget.h | 4 +- .../settings/settings_credits_graphics.cpp | 4 +- .../settings/settings_credits_graphics.h | 7 +- 12 files changed, 249 insertions(+), 113 deletions(-) create mode 100644 Telegram/SourceFiles/data/data_star_gift.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 3ad4fa5a8..80287bd6a 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -628,6 +628,7 @@ PRIVATE data/data_shared_media.h data/data_sparse_ids.cpp data/data_sparse_ids.h + data/data_star_gift.h data/data_statistics.h data/data_stories.cpp data/data_stories.h diff --git a/Telegram/SourceFiles/api/api_premium.cpp b/Telegram/SourceFiles/api/api_premium.cpp index bb5e18a51..2e06915aa 100644 --- a/Telegram/SourceFiles/api/api_premium.cpp +++ b/Telegram/SourceFiles/api/api_premium.cpp @@ -601,7 +601,7 @@ auto PremiumGiftCodeOptions::requestStarGifts() _giftsHash = data.vhash().v; const auto &list = data.vgifts().v; const auto session = &_peer->session(); - auto gifts = std::vector(); + auto gifts = std::vector(); gifts.reserve(list.size()); for (const auto &gift : list) { if (auto parsed = FromTL(session, gift)) { @@ -620,7 +620,8 @@ auto PremiumGiftCodeOptions::requestStarGifts() }; } -const std::vector &PremiumGiftCodeOptions::starGifts() const { +auto PremiumGiftCodeOptions::starGifts() const +-> const std::vector & { return _gifts; } @@ -758,7 +759,7 @@ rpl::producer RandomHelloStickerValue( }) | rpl::take(1) | rpl::map(random)); } -std::optional FromTL( +std::optional FromTL( not_null session, const MTPstarGift &gift) { return gift.match([&](const MTPDstarGift &data) { @@ -767,13 +768,13 @@ std::optional FromTL( const auto remaining = data.vavailability_remains(); const auto total = data.vavailability_total(); if (!document->sticker()) { - return std::optional(); + return std::optional(); } - return std::optional(StarGift{ + return std::optional(Data::StarGift{ .id = uint64(data.vid().v), .stars = int64(data.vstars().v), .starsConverted = int64(data.vconvert_stars().v), - .document = document, + .stickerId = document->id, .limitedLeft = remaining.value_or_empty(), .limitedCount = total.value_or_empty(), .firstSaleDate = data.vfirst_sale_date().value_or_empty(), @@ -781,11 +782,54 @@ std::optional FromTL( .birthday = data.is_birthday(), }); }, [&](const MTPDstarGiftUnique &data) { - return std::optional(); + const auto total = data.vavailability_total().v; + auto result = Data::StarGift{ + .id = uint64(data.vid().v), + .unique = std::make_shared(Data::UniqueGift{ + .title = qs(data.vtitle()), + .number = data.vnum().v, + .ownerId = peerFromUser(UserId(data.vowner_id().v)), + }), + .limitedLeft = (total - data.vavailability_issued().v), + .limitedCount = total, + }; + const auto unique = result.unique.get(); + for (const auto &attribute : data.vattributes().v) { + attribute.match([&](const MTPDstarGiftAttributeModel &data) { + unique->model.name = qs(data.vname()); + unique->model.rarityPermille = data.vrarity_permille().v; + result.stickerId = data.vdocument_id().v; + }, [&](const MTPDstarGiftAttributePattern &data) { + unique->pattern.name = qs(data.vname()); + unique->pattern.rarityPermille = data.vrarity_permille().v; + unique->pattern.documentId = data.vdocument_id().v; + }, [&](const MTPDstarGiftAttributeBackdrop &data) { + unique->backdrop.name = qs(data.vname()); + unique->backdrop.rarityPermille = data.vrarity_permille().v; + unique->backdrop.centerColor = Ui::ColorFromSerialized( + data.vcenter_color()); + unique->backdrop.edgeColor = Ui::ColorFromSerialized( + data.vedge_color()); + unique->backdrop.patternColor = Ui::ColorFromSerialized( + data.vpattern_color()); + unique->backdrop.textColor = Ui::ColorFromSerialized( + data.vtext_color()); + }, [&](const MTPDstarGiftAttributeOriginalDetails &data) { + unique->originalDetails.date = data.vdate().v; + unique->originalDetails.senderId = peerFromUser( + UserId(data.vsender_id().value_or_empty())); + unique->originalDetails.recipientId = peerFromUser( + UserId(data.vrecipient_id().v)); + unique->originalDetails.message = data.vmessage() + ? Api::ParseTextWithEntities(session, *data.vmessage()) + : TextWithEntities(); + }); + } + return result.stickerId ? result : std::optional(); }); } -std::optional FromTL( +std::optional FromTL( not_null to, const MTPuserStarGift &gift) { const auto session = &to->session(); @@ -794,7 +838,7 @@ std::optional FromTL( if (!parsed) { return {}; } - return UserStarGift{ + return Data::UserStarGift{ .info = std::move(*parsed), .message = (data.vmessage() ? TextWithEntities{ diff --git a/Telegram/SourceFiles/api/api_premium.h b/Telegram/SourceFiles/api/api_premium.h index 23455ba18..252a32841 100644 --- a/Telegram/SourceFiles/api/api_premium.h +++ b/Telegram/SourceFiles/api/api_premium.h @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "data/data_premium_subscription_option.h" +#include "data/data_star_gift.h" #include "mtproto/sender.h" class History; @@ -73,34 +74,6 @@ struct GiftOptionData { int months = 0; }; -struct StarGift { - uint64 id = 0; - int64 stars = 0; - int64 starsConverted = 0; - not_null document; - int limitedLeft = 0; - int limitedCount = 0; - TimeId firstSaleDate = 0; - TimeId lastSaleDate = 0; - bool birthday = false; - - friend inline bool operator==( - const StarGift &, - const StarGift &) = default; -}; - -struct UserStarGift { - StarGift info; - TextWithEntities message; - int64 starsConverted = 0; - PeerId fromId = 0; - MsgId messageId = 0; - TimeId date = 0; - bool anonymous = false; - bool hidden = false; - bool mine = false; -}; - class Premium final { public: explicit Premium(not_null api); @@ -223,7 +196,7 @@ public: [[nodiscard]] bool giveawayGiftsPurchaseAvailable() const; [[nodiscard]] rpl::producer requestStarGifts(); - [[nodiscard]] const std::vector &starGifts() const; + [[nodiscard]] const std::vector &starGifts() const; private: struct Token final { @@ -253,7 +226,7 @@ private: base::flat_map _stores; int32 _giftsHash = 0; - std::vector _gifts; + std::vector _gifts; MTP::Sender _api; @@ -283,10 +256,10 @@ enum class RequirePremiumState { [[nodiscard]] rpl::producer RandomHelloStickerValue( not_null session); -[[nodiscard]] std::optional FromTL( +[[nodiscard]] std::optional FromTL( not_null session, const MTPstarGift &gift); -[[nodiscard]] std::optional FromTL( +[[nodiscard]] std::optional FromTL( not_null to, const MTPuserStarGift &gift); diff --git a/Telegram/SourceFiles/boxes/star_gift_box.cpp b/Telegram/SourceFiles/boxes/star_gift_box.cpp index 99092f81c..67c7d5f26 100644 --- a/Telegram/SourceFiles/boxes/star_gift_box.cpp +++ b/Telegram/SourceFiles/boxes/star_gift_box.cpp @@ -139,6 +139,7 @@ private: const std::unique_ptr _style; const std::unique_ptr _delegate; AdminLog::OwnedItem _item; + rpl::lifetime _itemLifetime; QPoint _position; }; @@ -160,7 +161,7 @@ private: return is(now) || is(now.addDays(1)) || is(now.addDays(-1)); } -[[nodiscard]] bool IsSoldOut(const Api::StarGift &info) { +[[nodiscard]] bool IsSoldOut(const Data::StarGift &info) { return info.limitedCount && !info.limitedLeft; } @@ -188,7 +189,9 @@ Context PreviewDelegate::elementContext() { auto GenerateGiftMedia( not_null parent, Element *replacing, - const GiftDetails &data) + const GiftDetails &data, + Fn requestResize, + not_null onLifetime) -> Fn)>)> { return [=](Fn)> push) { const auto &descriptor = data.descriptor; @@ -206,12 +209,20 @@ auto GenerateGiftMedia( links, context)); }; + + const auto resolved = onLifetime->make_state(nullptr); + GiftStickerValue( + &parent->history()->session(), + descriptor + ) | rpl::start_with_next([=](not_null document) { + *resolved = document; + requestResize(); + }, *onLifetime); + const auto sticker = [=] { using Tag = ChatHelpers::StickerLottieSize; - const auto session = &parent->history()->session(); - const auto sticker = LookupGiftSticker(session, descriptor); return StickerInBubblePart::Data{ - .sticker = sticker, + .sticker = *resolved, .size = st::chatIntroStickerSize, .cacheTag = Tag::ChatIntroHelloSticker, .singleTimePlayback = v::is(descriptor), @@ -296,9 +307,10 @@ void ShowSentToast( const auto &st = st::historyPremiumToast; const auto skip = st.padding.top(); const auto size = st.style.font->height * 2; - const auto document = LookupGiftSticker(&window->session(), descriptor); - const auto leftSkip = document - ? (skip + size + skip - st.padding.left()) + const auto stickerId = GiftStickerId(&window->session(), descriptor); + const auto stickerSize = skip + size + skip; + const auto leftSkip = stickerId + ? (stickerSize - st.padding.left()) : 0; auto text = v::match(descriptor, [&](const GiftTypePremium &gift) { return tr::lng_action_gift_premium_about( @@ -319,40 +331,31 @@ void ShowSentToast( .attach = RectPart::Top, .duration = kSentToastDuration, }).get(); - if (!strong || !document) { + if (!strong || !stickerId) { return; } const auto widget = strong->widget(); const auto preview = Ui::CreateChild(widget.get()); - preview->moveToLeft(skip, skip); - preview->resize(size, size); + preview->moveToLeft(0, 0); + preview->resize(stickerSize, stickerSize); preview->show(); - const auto bytes = document->createMediaView()->bytes(); - const auto filepath = document->filepath(); - const auto ratio = style::DevicePixelRatio(); - const auto player = preview->lifetime().make_state( - Lottie::ReadContent(bytes, filepath), - Lottie::FrameRequest{ QSize(size, size) * ratio }, - Lottie::Quality::Default); + const auto tag = Data::CustomEmojiManager::SizeTag::Isolated; + const auto manager = &window->session().data().customEmojiManager(); + const auto emoji = std::shared_ptr( + manager->create(stickerId, [=] { preview->update(); }, tag)); preview->paintRequest( ) | rpl::start_with_next([=] { - if (!player->ready()) { - return; - } - const auto image = player->frame(); - QPainter(preview).drawImage( - QRect(QPoint(), image.size() / ratio), - image); - if (player->frameIndex() + 1 != player->framesCount()) { - player->markFrameShown(); - } - }, preview->lifetime()); - - player->updates( - ) | rpl::start_with_next([=] { - preview->update(); + auto p = Painter(preview); + const auto frame = Data::FrameSizeFromTag(tag) + / style::DevicePixelRatio(); + const auto delta = (stickerSize - frame) / 2; + emoji->paint(p, { + .textColor = st::toastFg->c, + .now = crl::now(), + .position = QPoint(delta, delta), + }); }, preview->lifetime()); } @@ -362,6 +365,8 @@ PreviewWrap::~PreviewWrap() { void PreviewWrap::prepare(rpl::producer details) { std::move(details) | rpl::start_with_next([=](GiftDetails details) { + _itemLifetime.destroy(); + const auto &descriptor = details.descriptor; const auto cost = v::match(descriptor, [&](GiftTypePremium data) { return FillAmountAndCurrency(data.cost, data.currency, true); @@ -388,7 +393,12 @@ void PreviewWrap::prepare(rpl::producer details) { auto owned = AdminLog::OwnedItem(_delegate.get(), item); owned->overrideMedia(std::make_unique( owned.get(), - GenerateGiftMedia(owned.get(), _item.get(), details), + GenerateGiftMedia( + owned.get(), + _item.get(), + details, + [=] { item->history()->owner().requestItemResize(item); }, + &_itemLifetime), MediaGenericDescriptor{ .maxWidth = st::chatIntroWidth, .service = true, @@ -406,6 +416,13 @@ void PreviewWrap::prepare(rpl::producer details) { }) | rpl::start_with_next([=](int width) { resizeTo(width); }, lifetime()); + + _history->owner().itemResizeRequest( + ) | rpl::start_with_next([=](not_null item) { + if (_item && item == _item->data() && width() >= st::msgMinWidth) { + resizeTo(width()); + } + }, lifetime()); } void PreviewWrap::resizeTo(int width) { @@ -959,7 +976,7 @@ void SoldOutBox( .firstSaleDate = base::unixtime::parse(gift.info.firstSaleDate), .lastSaleDate = base::unixtime::parse(gift.info.lastSaleDate), .credits = StarsAmount(gift.info.stars), - .bareGiftStickerId = gift.info.document->id, + .bareGiftStickerId = gift.info.stickerId, .peerType = Data::CreditsHistoryEntry::PeerType::Peer, .limitedCount = gift.info.limitedCount, .limitedLeft = gift.info.limitedLeft, @@ -967,7 +984,6 @@ void SoldOutBox( .gift = true, }, Data::SubscriptionEntry()); - } void SendGiftBox( @@ -1009,10 +1025,6 @@ void SendGiftBox( .descriptor = descriptor, .randomId = base::RandomValue(), }; - const auto document = LookupGiftSticker(&window->session(), descriptor); - if ((state->media = document ? document->createMediaView() : nullptr)) { - state->media->checkStickerLarge(); - } const auto container = box->verticalLayout(); container->add(object_ptr( diff --git a/Telegram/SourceFiles/data/data_star_gift.h b/Telegram/SourceFiles/data/data_star_gift.h new file mode 100644 index 000000000..fe580ed28 --- /dev/null +++ b/Telegram/SourceFiles/data/data_star_gift.h @@ -0,0 +1,77 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +namespace Data { + +struct UniqueGiftAttribute { + QString name; + int rarityPermille = 0; +}; + +struct UniqueGiftModel : UniqueGiftAttribute { +}; + +struct UniqueGiftPattern : UniqueGiftAttribute { + DocumentId documentId = 0; +}; + +struct UniqueGiftBackdrop : UniqueGiftAttribute { + QColor centerColor; + QColor edgeColor; + QColor patternColor; + QColor textColor; +}; + +struct UniqueGiftOriginalDetails { + PeerId senderId = 0; + PeerId recipientId = 0; + TimeId date = 0; + TextWithEntities message; +}; + +struct UniqueGift { + QString title; + int number = 0; + PeerId ownerId = 0; + UniqueGiftModel model; + UniqueGiftPattern pattern; + UniqueGiftBackdrop backdrop; + UniqueGiftOriginalDetails originalDetails; +}; + +struct StarGift { + uint64 id = 0; + std::shared_ptr unique; + int64 stars = 0; + int64 starsConverted = 0; + DocumentId stickerId = 0; + int limitedLeft = 0; + int limitedCount = 0; + TimeId firstSaleDate = 0; + TimeId lastSaleDate = 0; + bool birthday = false; + + friend inline bool operator==( + const StarGift &, + const StarGift &) = default; +}; + +struct UserStarGift { + StarGift info; + TextWithEntities message; + int64 starsConverted = 0; + PeerId fromId = 0; + MsgId messageId = 0; + TimeId date = 0; + bool anonymous = false; + bool hidden = false; + bool mine = false; +}; + +} // namespace Data diff --git a/Telegram/SourceFiles/history/view/media/history_view_service_box.cpp b/Telegram/SourceFiles/history/view/media/history_view_service_box.cpp index 0e12ae006..07f89fead 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_service_box.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_service_box.cpp @@ -202,7 +202,7 @@ void ServiceBox::draw(Painter &p, const PaintContext &context) const { p.setPen(Qt::NoPen); const auto twidth = font->width(tag); const auto pos = QPoint(_innerSize.width() - twidth, font->height); - const auto add = style::ConvertScale(2); + const auto add = 0;// style::ConvertScale(2); p.save(); p.setClipRect( -add, diff --git a/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_common.cpp b/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_common.cpp index ebf27afcf..ade604d44 100644 --- a/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_common.cpp +++ b/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_common.cpp @@ -108,9 +108,11 @@ void GiftButton::setDescriptor(const GiftDescriptor &descriptor) { _stars.setColorOverride(Ui::Premium::CreditsIconGradientStops()); } }); - if (const auto document = _delegate->lookupSticker(descriptor)) { + _delegate->sticker( + descriptor + ) | rpl::start_with_next([=](not_null document) { setDocument(document); - } + }, lifetime()); const auto buttonw = _price.maxWidth(); const auto buttonh = st::semiboldFont->height; @@ -186,12 +188,6 @@ void GiftButton::resizeEvent(QResizeEvent *e) { } void GiftButton::paintEvent(QPaintEvent *e) { - if (!documentResolved()) { - if (const auto document = _delegate->lookupSticker(_descriptor)) { - setDocument(document); - } - } - auto p = QPainter(this); const auto hidden = v::is(_descriptor) && v::get(_descriptor).hidden;; @@ -447,24 +443,54 @@ QImage Delegate::background() { return _bg; } -DocumentData *Delegate::lookupSticker(const GiftDescriptor &descriptor) { - return LookupGiftSticker(&_window->session(), descriptor); +rpl::producer> Delegate::sticker( + const GiftDescriptor &descriptor) { + return GiftStickerValue(&_window->session(), descriptor); } not_null Delegate::hiddenMark() { return _hiddenMark.get(); } -DocumentData *LookupGiftSticker( +DocumentId GiftStickerId( not_null session, const GiftDescriptor &descriptor) { - auto &packs = session->giftBoxStickersPacks(); - packs.load(); return v::match(descriptor, [&](GiftTypePremium data) { - return packs.lookup(data.months); + auto &packs = session->giftBoxStickersPacks(); + packs.load(); + const auto document = packs.lookup(data.months); + return document ? document->id : DocumentId(); }, [&](GiftTypeStars data) { - return data.info.document.get(); + return data.info.stickerId; }); } +rpl::producer> GiftStickerValue( + not_null session, + const GiftDescriptor &descriptor) { + return v::match(descriptor, [&](GiftTypePremium data) { + const auto months = data.months; + auto &packs = session->giftBoxStickersPacks(); + packs.load(); + if (const auto result = packs.lookup(months)) { + return result->sticker() + ? (rpl::single(not_null(result)) | rpl::type_erased()) + : rpl::never>(); + } + return packs.updated( + ) | rpl::map([=] { + return session->giftBoxStickersPacks().lookup(data.months); + }) | rpl::filter([](DocumentData *document) { + return document && document->sticker(); + }) | rpl::take(1) | rpl::map([=](DocumentData *document) { + return not_null(document); + }) | rpl::type_erased(); + }, [&](GiftTypeStars data) { + return session->data().customEmojiManager().resolve( + data.info.stickerId + ) | rpl::map_error_to_done(); + }); + +} + } // namespace Info::PeerGifts diff --git a/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_common.h b/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_common.h index f8e094e1b..ca28214e4 100644 --- a/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_common.h +++ b/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_common.h @@ -7,7 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once -#include "api/api_premium.h" +#include "data/data_star_gift.h" #include "ui/abstract_button.h" #include "ui/effects/premium_stars_colored.h" #include "ui/text/text.h" @@ -44,7 +44,7 @@ struct GiftTypePremium { }; struct GiftTypeStars { - Api::StarGift info; + Data::StarGift info; PeerData *from = nullptr; bool userpic = false; bool hidden = false; @@ -70,7 +70,7 @@ public: [[nodiscard]] virtual QSize buttonSize() = 0; [[nodiscard]] virtual QMargins buttonExtend() = 0; [[nodiscard]] virtual QImage background() = 0; - [[nodiscard]] virtual DocumentData *lookupSticker( + [[nodiscard]] virtual rpl::producer> sticker( const GiftDescriptor &descriptor) = 0; [[nodiscard]] virtual not_null hiddenMark() = 0; }; @@ -120,7 +120,8 @@ public: QSize buttonSize() override; QMargins buttonExtend() override; QImage background() override; - DocumentData *lookupSticker(const GiftDescriptor &descriptor) override; + rpl::producer> sticker( + const GiftDescriptor &descriptor) override; not_null hiddenMark() override; private: @@ -131,7 +132,11 @@ private: }; -[[nodiscard]] DocumentData *LookupGiftSticker( +[[nodiscard]] DocumentId GiftStickerId( + not_null session, + const GiftDescriptor &descriptor); + +[[nodiscard]] rpl::producer> GiftStickerValue( not_null session, const GiftDescriptor &descriptor); diff --git a/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_widget.cpp b/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_widget.cpp index 722752f2d..b29e937fc 100644 --- a/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_widget.cpp +++ b/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_widget.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "info/peer_gifts/info_peer_gifts_widget.h" +#include "api/api_premium.h" #include "data/data_session.h" #include "data/data_user.h" #include "info/peer_gifts/info_peer_gifts_common.h" @@ -32,7 +33,7 @@ constexpr auto kPerPage = 50; [[nodiscard]] GiftDescriptor DescriptorForGift( not_null to, - const Api::UserStarGift &gift) { + const Data::UserStarGift &gift) { return GiftTypeStars{ .info = gift.info, .from = ((gift.anonymous || !gift.fromId) @@ -62,7 +63,7 @@ public: private: struct Entry { - Api::UserStarGift gift; + Data::UserStarGift gift; GiftDescriptor descriptor; }; struct View { diff --git a/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_widget.h b/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_widget.h index 3882fa5cb..45e83f859 100644 --- a/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_widget.h +++ b/Telegram/SourceFiles/info/peer_gifts/info_peer_gifts_widget.h @@ -7,7 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once -#include "api/api_premium.h" +#include "data/data_star_gift.h" #include "info/info_content_widget.h" class UserData; @@ -16,7 +16,7 @@ struct PeerListState; namespace Info::PeerGifts { struct ListState { - std::vector list; + std::vector list; QString offset; }; diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index a26dc1fcd..51a898b07 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -1574,7 +1574,7 @@ void CreditsPrizeBox( void UserStarGiftBox( not_null box, not_null controller, - const Api::UserStarGift &data) { + const Data::UserStarGift &data) { Settings::ReceiptCreditsBox( box, controller, @@ -1584,7 +1584,7 @@ void UserStarGiftBox( .credits = StarsAmount(data.info.stars), .bareMsgId = uint64(data.messageId.bare), .barePeerId = data.fromId.value, - .bareGiftStickerId = data.info.document->id, + .bareGiftStickerId = data.info.stickerId, .peerType = Data::CreditsHistoryEntry::PeerType::Peer, .limitedCount = data.info.limitedCount, .limitedLeft = data.info.limitedLeft, diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.h b/Telegram/SourceFiles/settings/settings_credits_graphics.h index 6fc03c4a5..a4df9f73b 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.h +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.h @@ -12,16 +12,13 @@ class object_ptr; class PeerData; -namespace Api { -struct UserStarGift; -} // namespace Api - namespace Data { struct Boost; struct CreditsHistoryEntry; struct SubscriptionEntry; struct GiftCode; struct CreditTopupOption; +struct UserStarGift; } // namespace Data namespace Main { @@ -103,7 +100,7 @@ void CreditsPrizeBox( void UserStarGiftBox( not_null box, not_null controller, - const Api::UserStarGift &data); + const Data::UserStarGift &data); void StarGiftViewBox( not_null box, not_null controller,