/* 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 #include "base/timer.h" #include "data/data_star_gift.h" namespace Main { class Session; } // namespace Main namespace Data { struct GiftAuctionBidLevel { int64 amount = 0; int position = 0; TimeId date = 0; }; struct StarGiftAuctionMyState { PeerData *to = nullptr; int64 minBidAmount = 0; int64 bid = 0; TimeId date = 0; int gotCount = 0; bool returned = false; }; struct GiftAuctionRound { int number = 0; TimeId duration = 0; int extendTop = 0; TimeId extendDuration = 0; }; struct GiftAuctionState { std::optional gift; StarGiftAuctionMyState my; std::vector bidLevels; std::vector> topBidders; std::vector roundParameters; crl::time subscribedTill = 0; int64 minBidAmount = 0; int64 averagePrice = 0; TimeId startDate = 0; TimeId endDate = 0; TimeId nextRoundAt = 0; int currentRound = 0; int totalRounds = 0; int giftsLeft = 0; int version = 0; [[nodiscard]] bool finished() const { return (averagePrice != 0); } }; struct GiftAcquired { not_null to; TextWithEntities message; TimeId date = 0; int64 bidAmount = 0; int round = 0; int number = 0; int position = 0; bool nameHidden = false; }; struct ActiveAuctions { std::vector> list; }; class GiftAuctions final { public: explicit GiftAuctions(not_null session); ~GiftAuctions(); [[nodiscard]] rpl::producer state(const QString &slug); void apply(const MTPDupdateStarGiftAuctionState &data); void apply(const MTPDupdateStarGiftAuctionUserState &data); void requestAcquired( uint64 giftId, Fn)> done); [[nodiscard]] std::optional attributes( uint64 giftId) const; void requestAttributes(uint64 giftId, Fn ready); [[nodiscard]] rpl::producer active() const; [[nodiscard]] rpl::producer hasActiveChanges() const; [[nodiscard]] bool hasActive() const; private: struct Entry { GiftAuctionState state; rpl::event_stream<> changes; bool requested = false; }; struct MyStateKey { int bid = 0; int position = 0; int version = 0; explicit operator bool() const { return bid != 0; } friend inline bool operator==(MyStateKey, MyStateKey) = default; }; struct Attributes { Data::UniqueGiftAttributes lists; std::vector> waiters; }; void request(const QString &slug); Entry *find(uint64 giftId) const; void apply( not_null entry, const MTPStarGiftAuctionState &state); void apply( not_null entry, const MTPStarGiftAuctionState &state); void apply( not_null entry, const MTPStarGiftAuctionUserState &state); void apply( not_null entry, const MTPStarGiftAuctionUserState &state); void checkSubscriptions(); [[nodiscard]] MyStateKey myStateKey(const GiftAuctionState &state) const; [[nodiscard]] ActiveAuctions collectActive() const; [[nodiscard]] uint64 countActiveHash() const; void requestActive(); const not_null _session; base::Timer _timer; base::flat_map> _map; base::flat_map _attributes; rpl::event_stream<> _activeChanged; mtpRequestId _activeRequestId = 0; rpl::lifetime _lifetime; }; [[nodiscard]] int MyAuctionPosition(const GiftAuctionState &state); } // namespace Data