/* 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 Main { class Session; } // namespace Main namespace Ui { struct ColorCollectible; } // namespace Ui namespace Data { struct UniqueGiftAttribute { QString name; int rarityPermille = 0; friend inline bool operator==( const UniqueGiftAttribute &, const UniqueGiftAttribute &) = default; }; struct UniqueGiftModel : UniqueGiftAttribute { not_null document; friend inline bool operator==( const UniqueGiftModel &, const UniqueGiftModel &) = default; }; struct UniqueGiftPattern : UniqueGiftAttribute { not_null document; friend inline bool operator==( const UniqueGiftPattern &, const UniqueGiftPattern &) = default; }; struct UniqueGiftBackdrop : UniqueGiftAttribute { QColor centerColor; QColor edgeColor; QColor patternColor; QColor textColor; int id = 0; friend inline bool operator==( const UniqueGiftBackdrop &, const UniqueGiftBackdrop &) = default; }; struct UniqueGiftAttributes { std::vector models; std::vector backdrops; std::vector patterns; }; struct UniqueGiftOriginalDetails { PeerId senderId = 0; PeerId recipientId = 0; TimeId date = 0; TextWithEntities message; }; struct UniqueGiftValue { QString currency; int64 valuePrice = 0; int64 valuePriceUsd = 0; CreditsAmount initialPriceStars; int64 initialSalePrice = 0; TimeId initialSaleDate = 0; int64 lastSalePrice = 0; TimeId lastSaleDate = 0; int64 averagePrice = 0; int64 minimumPrice = 0; int forSaleOnTelegram = 0; int forSaleOnFragment = 0; QString fragmentUrl; bool lastSaleFragment = false; }; struct UniqueGift { CollectibleId id = 0; uint64 initialGiftId = 0; QString slug; QString title; QString giftAddress; QString ownerAddress; QString ownerName; PeerId ownerId = 0; PeerId hostId = 0; PeerData *releasedBy = nullptr; PeerData *themeUser = nullptr; int64 nanoTonForResale = -1; int starsForResale = -1; int starsForTransfer = -1; int starsMinOffer = -1; int number = 0; bool onlyAcceptTon = false; bool canBeTheme = false; TimeId exportAt = 0; TimeId canTransferAt = 0; TimeId canResellAt = 0; UniqueGiftModel model; UniqueGiftPattern pattern; UniqueGiftBackdrop backdrop; UniqueGiftOriginalDetails originalDetails; std::shared_ptr value; std::shared_ptr peerColor; }; [[nodiscard]] QString UniqueGiftName(const UniqueGift &gift); [[nodiscard]] QString UniqueGiftName(const QString &title, int number); [[nodiscard]] CreditsAmount UniqueGiftResaleStars(const UniqueGift &gift); [[nodiscard]] CreditsAmount UniqueGiftResaleTon(const UniqueGift &gift); [[nodiscard]] CreditsAmount UniqueGiftResaleAsked(const UniqueGift &gift); [[nodiscard]] TextWithEntities FormatGiftResaleStars(const UniqueGift &gift); [[nodiscard]] TextWithEntities FormatGiftResaleTon(const UniqueGift &gift); [[nodiscard]] TextWithEntities FormatGiftResaleAsked(const UniqueGift &gift); struct StarGiftBackground { QColor center; QColor edge; QColor text; [[nodiscard]] UniqueGiftBackdrop backdrop() const { return { .centerColor = center, .edgeColor = edge, .patternColor = edge, .textColor = text, }; } }; struct StarGift { uint64 id = 0; std::shared_ptr unique; std::shared_ptr background; int64 stars = 0; int64 starsConverted = 0; int64 starsToUpgrade = 0; int64 starsResellMin = 0; not_null document; PeerData *releasedBy = nullptr; QString resellTitle; int resellCount = 0; QString auctionSlug; int auctionGiftsPerRound = 0; TimeId auctionStartDate = 0; int limitedLeft = 0; int limitedCount = 0; int perUserTotal = 0; int perUserRemains = 0; int upgradeVariants = 0; TimeId firstSaleDate = 0; TimeId lastSaleDate = 0; TimeId lockedUntilDate = 0; bool resellTonOnly : 1 = false; bool requirePremium : 1 = false; bool peerColorAvailable : 1 = false; bool upgradable : 1 = false; bool birthday : 1 = false; bool soldOut : 1 = false; [[nodiscard]] bool auction() const { return !auctionSlug.isEmpty(); } friend inline bool operator==( const StarGift &, const StarGift &) = default; }; class SavedStarGiftId { public: [[nodiscard]] static SavedStarGiftId User(MsgId messageId) { auto result = SavedStarGiftId(); result.entityId = uint64(messageId.bare); return result; } [[nodiscard]] static SavedStarGiftId Chat( not_null peer, uint64 savedId) { auto result = SavedStarGiftId(); result.peer = peer; result.entityId = savedId; return result; } [[nodiscard]] bool isUser() const { return !peer; } [[nodiscard]] bool isChat() const { return peer != nullptr; } [[nodiscard]] MsgId userMessageId() const { return peer ? MsgId(0) : MsgId(entityId); } [[nodiscard]] PeerData *chat() const { return peer; } [[nodiscard]] uint64 chatSavedId() const { return peer ? entityId : 0; } explicit operator bool() const { return entityId != 0; } friend inline bool operator==( const SavedStarGiftId &, const SavedStarGiftId &) = default; friend inline auto operator<=>( const SavedStarGiftId &, const SavedStarGiftId &) = default; private: PeerData *peer = nullptr; uint64 entityId = 0; }; struct SavedStarGift { StarGift info; SavedStarGiftId manageId; std::vector collectionIds; TextWithEntities message; int64 starsConverted = 0; int64 starsUpgradedBySender = 0; int64 starsForDetailsRemove = 0; QString giftPrepayUpgradeHash; PeerId fromId = 0; TimeId date = 0; int giftNum = 0; bool upgradeSeparate = false; bool upgradable = false; bool anonymous = false; bool pinned = false; bool hidden = false; bool mine = false; }; struct GiftUpgradeSpinner { enum class State { Initial, // Didn't start the upgrade. Preparing, // Upgraded, requested Cover to prepare the spinners. Loading, // Cover started preparing the spinners. Prepared, // Cover prepared the spinners, waiting for nextToUpgrade. Started, // Started spinning animations. FinishBackdrop, // Ready to animate to target backdrop. FinishedBackdrop, // Backdrop finishes spinning. FinishPattern, // Ready to animate to target pattern. FinishedPattern, // Pattern finishes spinning. FinishModel, // Ready to animate to target model. FinishedModel, // All spinners finish animating or user pressed Skip. Finished, // Animations finished, show fireworks. Timeout, // Waited for Prepared for too long, skipping animations. }; Data::UniqueGiftAttributes attributes; std::shared_ptr target; rpl::variable state; }; struct GiftUpgradeResult { StarGift info; SavedStarGiftId manageId; TimeId date = 0; int starsForDetailsRemove = 0; bool saved = false; }; struct GiftCollection { int id = 0; int count = 0; QString title; DocumentData *icon = nullptr; uint64 hash = 0; }; struct UniqueGiftModelCount { UniqueGiftModel model; int count = 0; }; struct UniqueGiftBackdropCount { UniqueGiftBackdrop backdrop; int count = 0; }; struct UniqueGiftPatternCount { UniqueGiftPattern pattern; int count = 0; }; enum class ResaleGiftsSort { Date, Price, Number, }; enum class GiftAttributeIdType { Model, Pattern, Backdrop, }; struct GiftAttributeId { uint64 value = 0; GiftAttributeIdType type = GiftAttributeIdType::Model; friend inline auto operator<=>( GiftAttributeId, GiftAttributeId) = default; friend inline bool operator==( GiftAttributeId, GiftAttributeId) = default; }; [[nodiscard]] GiftAttributeId IdFor(const UniqueGiftBackdrop &value); [[nodiscard]] GiftAttributeId IdFor(const UniqueGiftModel &value); [[nodiscard]] GiftAttributeId IdFor(const UniqueGiftPattern &value); struct MyGiftsDescriptor { std::vector list; QString offset; }; enum class MyUniqueType { OwnedAndHosted, OnlyOwned, }; [[nodiscard]] rpl::producer MyUniqueGiftsSlice( not_null session, MyUniqueType type, QString offset = QString()); struct ResaleGiftsDescriptor { uint64 giftId = 0; QString title; QString offset; std::vector list; std::vector models; std::vector backdrops; std::vector patterns; uint64 attributesHash = 0; int count = 0; ResaleGiftsSort sort = ResaleGiftsSort::Date; }; struct ResaleGiftsFilter { uint64 attributesHash = 0; base::flat_set attributes; ResaleGiftsSort sort = ResaleGiftsSort::Price; friend inline bool operator==( const ResaleGiftsFilter &, const ResaleGiftsFilter &) = default; }; [[nodiscard]] rpl::producer ResaleGiftsSlice( not_null session, uint64 giftId, ResaleGiftsFilter filter = {}, QString offset = QString()); } // namespace Data