Added ability to cache credits balance by peer.

This commit is contained in:
23rd 2024-10-03 22:36:07 +03:00
parent 649d242e9a
commit 9716a901d1
4 changed files with 21 additions and 1 deletions

View file

@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "api/api_updates.h" #include "api/api_updates.h"
#include "apiwrap.h" #include "apiwrap.h"
#include "base/unixtime.h" #include "base/unixtime.h"
#include "data/components/credits.h"
#include "data/data_channel.h" #include "data/data_channel.h"
#include "data/data_document.h" #include "data/data_document.h"
#include "data/data_peer.h" #include "data/data_peer.h"
@ -248,6 +249,8 @@ void CreditsStatus::request(
_peer->isSelf() ? MTP_inputPeerSelf() : _peer->input _peer->isSelf() ? MTP_inputPeerSelf() : _peer->input
)).done([=](const TLResult &result) { )).done([=](const TLResult &result) {
_requestId = 0; _requestId = 0;
const auto balance = result.data().vbalance().v;
_peer->session().credits().apply(_peer->id, balance);
if (const auto onstack = done) { if (const auto onstack = done) {
onstack(StatusFromTL(result, _peer)); onstack(StatusFromTL(result, _peer));
} }

View file

@ -33,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "chat_helpers/tabbed_selector.h" #include "chat_helpers/tabbed_selector.h"
#include "core/application.h" #include "core/application.h"
#include "core/core_settings.h" #include "core/core_settings.h"
#include "data/components/credits.h"
#include "data/data_channel.h" #include "data/data_channel.h"
#include "data/data_chat.h" #include "data/data_chat.h"
#include "data/data_peer.h" #include "data/data_peer.h"
@ -1591,6 +1592,9 @@ void Controller::fillBotBalanceButton() {
auto &lifetime = _controls.buttonsLayout->lifetime(); auto &lifetime = _controls.buttonsLayout->lifetime();
const auto state = lifetime.make_state<State>(); const auto state = lifetime.make_state<State>();
if (const auto balance = _peer->session().credits().balance(_peer->id)) {
state->balance = QString::number(balance);
}
const auto wrap = _controls.buttonsLayout->add( const auto wrap = _controls.buttonsLayout->add(
object_ptr<Ui::SlideWrap<Ui::SettingsButton>>( object_ptr<Ui::SlideWrap<Ui::SettingsButton>>(
@ -1604,7 +1608,7 @@ void Controller::fillBotBalanceButton() {
}, },
st::manageGroupButton, st::manageGroupButton,
{}))); {})));
wrap->toggle(false, anim::type::instant); wrap->toggle(!state->balance.current().isEmpty(), anim::type::instant);
const auto button = wrap->entity(); const auto button = wrap->entity();
{ {

View file

@ -69,6 +69,11 @@ uint64 Credits::balance() const {
return _nonLockedBalance.current(); return _nonLockedBalance.current();
} }
uint64 Credits::balance(PeerId peerId) const {
const auto it = _cachedPeerBalances.find(peerId);
return (it != _cachedPeerBalances.end()) ? it->second : 0;
}
rpl::producer<uint64> Credits::balanceValue() const { rpl::producer<uint64> Credits::balanceValue() const {
return _nonLockedBalance.value(); return _nonLockedBalance.value();
} }
@ -119,4 +124,8 @@ void Credits::apply(uint64 balance) {
} }
} }
void Credits::apply(PeerId peerId, uint64 balance) {
_cachedPeerBalances[peerId] = balance;
}
} // namespace Data } // namespace Data

View file

@ -24,11 +24,13 @@ public:
void load(bool force = false); void load(bool force = false);
void apply(uint64 balance); void apply(uint64 balance);
void apply(PeerId peerId, uint64 balance);
[[nodiscard]] bool loaded() const; [[nodiscard]] bool loaded() const;
[[nodiscard]] rpl::producer<bool> loadedValue() const; [[nodiscard]] rpl::producer<bool> loadedValue() const;
[[nodiscard]] uint64 balance() const; [[nodiscard]] uint64 balance() const;
[[nodiscard]] uint64 balance(PeerId peerId) const;
[[nodiscard]] rpl::producer<uint64> balanceValue() const; [[nodiscard]] rpl::producer<uint64> balanceValue() const;
[[nodiscard]] rpl::producer<float64> rateValue( [[nodiscard]] rpl::producer<float64> rateValue(
not_null<PeerData*> ownedBotOrChannel); not_null<PeerData*> ownedBotOrChannel);
@ -47,6 +49,8 @@ private:
std::unique_ptr<Api::CreditsStatus> _loader; std::unique_ptr<Api::CreditsStatus> _loader;
base::flat_map<PeerId, uint64> _cachedPeerBalances;
uint64 _balance = 0; uint64 _balance = 0;
uint64 _locked = 0; uint64 _locked = 0;
rpl::variable<uint64> _nonLockedBalance; rpl::variable<uint64> _nonLockedBalance;