From ec93a91db23163e79081dea581b83398e624e1d1 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 9 Aug 2024 20:32:36 +0300 Subject: [PATCH] Added api support for subscriptions list. --- Telegram/SourceFiles/api/api_credits.cpp | 61 ++++++++++++++++--- Telegram/SourceFiles/api/api_credits.h | 3 + Telegram/SourceFiles/data/data_credits.h | 9 +++ .../SourceFiles/data/data_subscriptions.h | 15 +++++ 4 files changed, 81 insertions(+), 7 deletions(-) diff --git a/Telegram/SourceFiles/api/api_credits.cpp b/Telegram/SourceFiles/api/api_credits.cpp index 64b219304..d0dc717ea 100644 --- a/Telegram/SourceFiles/api/api_credits.cpp +++ b/Telegram/SourceFiles/api/api_credits.cpp @@ -111,25 +111,53 @@ constexpr auto kTransactionsLimit = 100; }; } +[[nodiscard]] Data::SubscriptionEntry SubscriptionFromTL( + const MTPStarsSubscription &tl) { + return Data::SubscriptionEntry{ + .id = qs(tl.data().vid()), + .inviteHash = qs(tl.data().vchat_invite_hash().value_or_empty()), + .until = base::unixtime::parse(tl.data().vuntil_date().v), + .subscription = Data::PeerSubscription{ + .credits = tl.data().vpricing().data().vamount().v, + .period = tl.data().vpricing().data().vperiod().v, + }, + .barePeerId = peerFromMTP(tl.data().vpeer()).value, + .cancelled = tl.data().is_canceled(), + .expired = (base::unixtime::now() > tl.data().vuntil_date().v), + .canRefulfill = tl.data().is_can_refulfill(), + }; +} + [[nodiscard]] Data::CreditsStatusSlice StatusFromTL( const MTPpayments_StarsStatus &status, not_null peer) { const auto &data = status.data(); peer->owner().processUsers(data.vusers()); peer->owner().processChats(data.vchats()); - auto list = std::vector(); + auto entries = std::vector(); if (const auto history = data.vhistory()) { - list = ranges::views::all( - history->v - ) | ranges::views::transform([&](const MTPStarsTransaction &tl) { - return HistoryFromTL(tl, peer); - }) | ranges::to_vector; + entries.reserve(history->v.size()); + for (const auto &tl : history->v) { + entries.push_back(HistoryFromTL(tl, peer)); + } + } + auto subscriptions = std::vector(); + if (const auto history = data.vsubscriptions()) { + subscriptions.reserve(history->v.size()); + for (const auto &tl : history->v) { + subscriptions.push_back(SubscriptionFromTL(tl)); + } } return Data::CreditsStatusSlice{ - .list = std::move(list), + .list = std::move(entries), + .subscriptions = std::move(subscriptions), .balance = status.data().vbalance().v, + .subscriptionsMissingBalance + = status.data().vsubscriptions_missing_balance().value_or_empty(), .allLoaded = !status.data().vnext_offset().has_value(), .token = qs(status.data().vnext_offset().value_or_empty()), + .tokenSubscriptions = qs( + status.data().vsubscriptions_next_offset().value_or_empty()), }; } @@ -247,6 +275,25 @@ void CreditsHistory::request( }).send(); } +void CreditsHistory::requestSubscriptions( + const Data::CreditsStatusSlice::OffsetToken &token, + Fn done) { + if (_requestId) { + return; + } + _requestId = _api.request(MTPpayments_GetStarsSubscriptions( + MTP_flags(0), + _peer->isSelf() ? MTP_inputPeerSelf() : _peer->input, + MTP_string(token) + )).done([=](const MTPpayments_StarsStatus &result) { + _requestId = 0; + done(StatusFromTL(result, _peer)); + }).fail([=] { + _requestId = 0; + done({}); + }).send(); +} + Data::CreditTopupOptions CreditsTopupOptions::options() const { return _options; } diff --git a/Telegram/SourceFiles/api/api_credits.h b/Telegram/SourceFiles/api/api_credits.h index e63380734..e038d9c95 100644 --- a/Telegram/SourceFiles/api/api_credits.h +++ b/Telegram/SourceFiles/api/api_credits.h @@ -60,6 +60,9 @@ public: void request( const Data::CreditsStatusSlice::OffsetToken &token, Fn done); + void requestSubscriptions( + const Data::CreditsStatusSlice::OffsetToken &token, + Fn done); private: using HistoryTL = MTPpayments_GetStarsTransactions; diff --git a/Telegram/SourceFiles/data/data_credits.h b/Telegram/SourceFiles/data/data_credits.h index 1aa49105d..e9b67e354 100644 --- a/Telegram/SourceFiles/data/data_credits.h +++ b/Telegram/SourceFiles/data/data_credits.h @@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "data/data_subscriptions.h" + namespace Data { struct CreditTopupOption final { @@ -31,6 +33,10 @@ struct CreditsHistoryMedia { }; struct CreditsHistoryEntry final { + explicit operator bool() const { + return !id.isEmpty(); + } + using PhotoId = uint64; enum class PeerType { Peer, @@ -66,9 +72,12 @@ struct CreditsHistoryEntry final { struct CreditsStatusSlice final { using OffsetToken = QString; std::vector list; + std::vector subscriptions; uint64 balance = 0; + uint64 subscriptionsMissingBalance = 0; bool allLoaded = false; OffsetToken token; + OffsetToken tokenSubscriptions; }; } // namespace Data diff --git a/Telegram/SourceFiles/data/data_subscriptions.h b/Telegram/SourceFiles/data/data_subscriptions.h index 3624adf65..69af0d4d6 100644 --- a/Telegram/SourceFiles/data/data_subscriptions.h +++ b/Telegram/SourceFiles/data/data_subscriptions.h @@ -18,4 +18,19 @@ struct PeerSubscription final { } }; +struct SubscriptionEntry final { + explicit operator bool() const { + return !id.isEmpty(); + } + + QString id; + QString inviteHash; + QDateTime until; + PeerSubscription subscription; + uint64 barePeerId = 0; + bool cancelled = false; + bool expired = false; + bool canRefulfill = false; +}; + } // namespace Data