From 9716a901d1c2d3b4f49c899f24d72b50a10b7c5a Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 3 Oct 2024 22:36:07 +0300 Subject: [PATCH] Added ability to cache credits balance by peer. --- Telegram/SourceFiles/api/api_credits.cpp | 3 +++ Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp | 6 +++++- Telegram/SourceFiles/data/components/credits.cpp | 9 +++++++++ Telegram/SourceFiles/data/components/credits.h | 4 ++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/api/api_credits.cpp b/Telegram/SourceFiles/api/api_credits.cpp index 1fab209ce..4ef4b09c8 100644 --- a/Telegram/SourceFiles/api/api_credits.cpp +++ b/Telegram/SourceFiles/api/api_credits.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_updates.h" #include "apiwrap.h" #include "base/unixtime.h" +#include "data/components/credits.h" #include "data/data_channel.h" #include "data/data_document.h" #include "data/data_peer.h" @@ -248,6 +249,8 @@ void CreditsStatus::request( _peer->isSelf() ? MTP_inputPeerSelf() : _peer->input )).done([=](const TLResult &result) { _requestId = 0; + const auto balance = result.data().vbalance().v; + _peer->session().credits().apply(_peer->id, balance); if (const auto onstack = done) { onstack(StatusFromTL(result, _peer)); } diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index 993948306..4b11e3745 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -33,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/tabbed_selector.h" #include "core/application.h" #include "core/core_settings.h" +#include "data/components/credits.h" #include "data/data_channel.h" #include "data/data_chat.h" #include "data/data_peer.h" @@ -1591,6 +1592,9 @@ void Controller::fillBotBalanceButton() { auto &lifetime = _controls.buttonsLayout->lifetime(); const auto state = lifetime.make_state(); + if (const auto balance = _peer->session().credits().balance(_peer->id)) { + state->balance = QString::number(balance); + } const auto wrap = _controls.buttonsLayout->add( object_ptr>( @@ -1604,7 +1608,7 @@ void Controller::fillBotBalanceButton() { }, st::manageGroupButton, {}))); - wrap->toggle(false, anim::type::instant); + wrap->toggle(!state->balance.current().isEmpty(), anim::type::instant); const auto button = wrap->entity(); { diff --git a/Telegram/SourceFiles/data/components/credits.cpp b/Telegram/SourceFiles/data/components/credits.cpp index 34520f923..4c2379a95 100644 --- a/Telegram/SourceFiles/data/components/credits.cpp +++ b/Telegram/SourceFiles/data/components/credits.cpp @@ -69,6 +69,11 @@ uint64 Credits::balance() const { return _nonLockedBalance.current(); } +uint64 Credits::balance(PeerId peerId) const { + const auto it = _cachedPeerBalances.find(peerId); + return (it != _cachedPeerBalances.end()) ? it->second : 0; +} + rpl::producer Credits::balanceValue() const { return _nonLockedBalance.value(); } @@ -119,4 +124,8 @@ void Credits::apply(uint64 balance) { } } +void Credits::apply(PeerId peerId, uint64 balance) { + _cachedPeerBalances[peerId] = balance; +} + } // namespace Data diff --git a/Telegram/SourceFiles/data/components/credits.h b/Telegram/SourceFiles/data/components/credits.h index bd5a2f725..62fefcc3c 100644 --- a/Telegram/SourceFiles/data/components/credits.h +++ b/Telegram/SourceFiles/data/components/credits.h @@ -24,11 +24,13 @@ public: void load(bool force = false); void apply(uint64 balance); + void apply(PeerId peerId, uint64 balance); [[nodiscard]] bool loaded() const; [[nodiscard]] rpl::producer loadedValue() const; [[nodiscard]] uint64 balance() const; + [[nodiscard]] uint64 balance(PeerId peerId) const; [[nodiscard]] rpl::producer balanceValue() const; [[nodiscard]] rpl::producer rateValue( not_null ownedBotOrChannel); @@ -47,6 +49,8 @@ private: std::unique_ptr _loader; + base::flat_map _cachedPeerBalances; + uint64 _balance = 0; uint64 _locked = 0; rpl::variable _nonLockedBalance;