api_premium.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "data/data_premium_subscription_option.h"
  9. #include "data/data_star_gift.h"
  10. #include "mtproto/sender.h"
  11. class History;
  12. class ApiWrap;
  13. namespace Main {
  14. class Session;
  15. } // namespace Main
  16. namespace Payments {
  17. struct InvoicePremiumGiftCode;
  18. } // namespace Payments
  19. namespace Api {
  20. struct GiftCode {
  21. PeerId from = 0;
  22. PeerId to = 0;
  23. MsgId giveawayId = 0;
  24. TimeId date = 0;
  25. TimeId used = 0; // 0 if not used.
  26. int months = 0;
  27. bool giveaway = false;
  28. explicit operator bool() const {
  29. return months != 0;
  30. }
  31. friend inline bool operator==(
  32. const GiftCode&,
  33. const GiftCode&) = default;
  34. };
  35. enum class GiveawayState {
  36. Invalid,
  37. Running,
  38. Preparing,
  39. Finished,
  40. Refunded,
  41. };
  42. struct GiveawayInfo {
  43. QString giftCode;
  44. QString disallowedCountry;
  45. ChannelId adminChannelId = 0;
  46. GiveawayState state = GiveawayState::Invalid;
  47. TimeId tooEarlyDate = 0;
  48. TimeId finishDate = 0;
  49. TimeId startDate = 0;
  50. uint64 credits = 0;
  51. int winnersCount = 0;
  52. int activatedCount = 0;
  53. bool participating = false;
  54. explicit operator bool() const {
  55. return state != GiveawayState::Invalid;
  56. }
  57. };
  58. struct GiftOptionData {
  59. int64 cost = 0;
  60. QString currency;
  61. int months = 0;
  62. };
  63. class Premium final {
  64. public:
  65. explicit Premium(not_null<ApiWrap*> api);
  66. void reload();
  67. [[nodiscard]] rpl::producer<TextWithEntities> statusTextValue() const;
  68. [[nodiscard]] auto videos() const
  69. -> const base::flat_map<QString, not_null<DocumentData*>> &;
  70. [[nodiscard]] rpl::producer<> videosUpdated() const;
  71. [[nodiscard]] auto stickers() const
  72. -> const std::vector<not_null<DocumentData*>> &;
  73. [[nodiscard]] rpl::producer<> stickersUpdated() const;
  74. [[nodiscard]] auto cloudSet() const
  75. -> const std::vector<not_null<DocumentData*>> &;
  76. [[nodiscard]] rpl::producer<> cloudSetUpdated() const;
  77. [[nodiscard]] auto helloStickers() const
  78. -> const std::vector<not_null<DocumentData*>> &;
  79. [[nodiscard]] rpl::producer<> helloStickersUpdated() const;
  80. [[nodiscard]] int64 monthlyAmount() const;
  81. [[nodiscard]] QString monthlyCurrency() const;
  82. void checkGiftCode(
  83. const QString &slug,
  84. Fn<void(GiftCode)> done);
  85. GiftCode updateGiftCode(const QString &slug, const GiftCode &code);
  86. [[nodiscard]] rpl::producer<GiftCode> giftCodeValue(
  87. const QString &slug) const;
  88. void applyGiftCode(const QString &slug, Fn<void(QString)> done);
  89. void resolveGiveawayInfo(
  90. not_null<PeerData*> peer,
  91. MsgId messageId,
  92. Fn<void(GiveawayInfo)> done);
  93. [[nodiscard]] auto subscriptionOptions() const
  94. -> const Data::PremiumSubscriptionOptions &;
  95. [[nodiscard]] auto someMessageMoneyRestrictionsResolved() const
  96. -> rpl::producer<>;
  97. void resolveMessageMoneyRestrictions(not_null<UserData*> user);
  98. private:
  99. void reloadPromo();
  100. void reloadStickers();
  101. void reloadCloudSet();
  102. void reloadHelloStickers();
  103. void requestPremiumRequiredSlice();
  104. const not_null<Main::Session*> _session;
  105. MTP::Sender _api;
  106. mtpRequestId _promoRequestId = 0;
  107. std::optional<TextWithEntities> _statusText;
  108. rpl::event_stream<TextWithEntities> _statusTextUpdates;
  109. base::flat_map<QString, not_null<DocumentData*>> _videos;
  110. rpl::event_stream<> _videosUpdated;
  111. mtpRequestId _stickersRequestId = 0;
  112. uint64 _stickersHash = 0;
  113. std::vector<not_null<DocumentData*>> _stickers;
  114. rpl::event_stream<> _stickersUpdated;
  115. mtpRequestId _cloudSetRequestId = 0;
  116. uint64 _cloudSetHash = 0;
  117. std::vector<not_null<DocumentData*>> _cloudSet;
  118. rpl::event_stream<> _cloudSetUpdated;
  119. mtpRequestId _helloStickersRequestId = 0;
  120. uint64 _helloStickersHash = 0;
  121. std::vector<not_null<DocumentData*>> _helloStickers;
  122. rpl::event_stream<> _helloStickersUpdated;
  123. int64 _monthlyAmount = 0;
  124. QString _monthlyCurrency;
  125. mtpRequestId _giftCodeRequestId = 0;
  126. QString _giftCodeSlug;
  127. base::flat_map<QString, GiftCode> _giftCodes;
  128. rpl::event_stream<QString> _giftCodeUpdated;
  129. mtpRequestId _giveawayInfoRequestId = 0;
  130. PeerData *_giveawayInfoPeer = nullptr;
  131. MsgId _giveawayInfoMessageId = 0;
  132. Fn<void(GiveawayInfo)> _giveawayInfoDone;
  133. Data::PremiumSubscriptionOptions _subscriptionOptions;
  134. rpl::event_stream<> _someMessageMoneyRestrictionsResolved;
  135. base::flat_set<not_null<UserData*>> _resolveMessageMoneyRequiredUsers;
  136. base::flat_set<not_null<UserData*>> _resolveMessageMoneyRequestedUsers;
  137. bool _messageMoneyRequestScheduled = false;
  138. };
  139. class PremiumGiftCodeOptions final {
  140. public:
  141. PremiumGiftCodeOptions(not_null<PeerData*> peer);
  142. [[nodiscard]] rpl::producer<rpl::no_value, QString> request();
  143. [[nodiscard]] std::vector<GiftOptionData> optionsForPeer() const;
  144. [[nodiscard]] Data::PremiumSubscriptionOptions options(int amount);
  145. [[nodiscard]] const std::vector<int> &availablePresets() const;
  146. [[nodiscard]] int monthsFromPreset(int monthsIndex);
  147. [[nodiscard]] Payments::InvoicePremiumGiftCode invoice(
  148. int users,
  149. int months);
  150. [[nodiscard]] rpl::producer<rpl::no_value, QString> applyPrepaid(
  151. const Payments::InvoicePremiumGiftCode &invoice,
  152. uint64 prepaidId);
  153. [[nodiscard]] int giveawayBoostsPerPremium() const;
  154. [[nodiscard]] int giveawayCountriesMax() const;
  155. [[nodiscard]] int giveawayAddPeersMax() const;
  156. [[nodiscard]] int giveawayPeriodMax() const;
  157. [[nodiscard]] bool giveawayGiftsPurchaseAvailable() const;
  158. [[nodiscard]] rpl::producer<rpl::no_value, QString> requestStarGifts();
  159. [[nodiscard]] const std::vector<Data::StarGift> &starGifts() const;
  160. private:
  161. struct Token final {
  162. int users = 0;
  163. int months = 0;
  164. friend inline constexpr auto operator<=>(Token, Token) = default;
  165. };
  166. struct Store final {
  167. uint64 amount = 0;
  168. QString currency;
  169. QString product;
  170. int quantity = 0;
  171. };
  172. using Amount = int;
  173. using PremiumSubscriptionOptions = Data::PremiumSubscriptionOptions;
  174. const not_null<PeerData*> _peer;
  175. base::flat_map<Amount, PremiumSubscriptionOptions> _subscriptionOptions;
  176. struct {
  177. std::vector<int> months;
  178. std::vector<int64> totalCosts;
  179. std::vector<QString> currencies;
  180. } _optionsForOnePerson;
  181. std::vector<int> _availablePresets;
  182. base::flat_map<Token, Store> _stores;
  183. int32 _giftsHash = 0;
  184. std::vector<Data::StarGift> _gifts;
  185. MTP::Sender _api;
  186. };
  187. class SponsoredToggle final {
  188. public:
  189. explicit SponsoredToggle(not_null<Main::Session*> session);
  190. [[nodiscard]] rpl::producer<bool> toggled();
  191. [[nodiscard]] rpl::producer<rpl::no_value, QString> setToggled(bool);
  192. private:
  193. MTP::Sender _api;
  194. };
  195. struct MessageMoneyRestriction {
  196. int starsPerMessage = 0;
  197. bool premiumRequired = false;
  198. bool known = false;
  199. explicit operator bool() const {
  200. return starsPerMessage != 0 || premiumRequired;
  201. }
  202. friend inline bool operator==(
  203. const MessageMoneyRestriction &,
  204. const MessageMoneyRestriction &) = default;
  205. };
  206. [[nodiscard]] MessageMoneyRestriction ResolveMessageMoneyRestrictions(
  207. not_null<PeerData*> peer,
  208. History *maybeHistory);
  209. [[nodiscard]] rpl::producer<DocumentData*> RandomHelloStickerValue(
  210. not_null<Main::Session*> session);
  211. [[nodiscard]] std::optional<Data::StarGift> FromTL(
  212. not_null<Main::Session*> session,
  213. const MTPstarGift &gift);
  214. [[nodiscard]] std::optional<Data::SavedStarGift> FromTL(
  215. not_null<PeerData*> to,
  216. const MTPsavedStarGift &gift);
  217. [[nodiscard]] Data::UniqueGiftModel FromTL(
  218. not_null<Main::Session*> session,
  219. const MTPDstarGiftAttributeModel &data);
  220. [[nodiscard]] Data::UniqueGiftPattern FromTL(
  221. not_null<Main::Session*> session,
  222. const MTPDstarGiftAttributePattern &data);
  223. [[nodiscard]] Data::UniqueGiftBackdrop FromTL(
  224. const MTPDstarGiftAttributeBackdrop &data);
  225. [[nodiscard]] Data::UniqueGiftOriginalDetails FromTL(
  226. not_null<Main::Session*> session,
  227. const MTPDstarGiftAttributeOriginalDetails &data);
  228. } // namespace Api