Update API scheme on layer 199.

This commit is contained in:
John Preston 2025-02-05 13:35:28 +04:00
parent ba84499f00
commit f9abef9e05
4 changed files with 39 additions and 24 deletions

View file

@ -23,7 +23,8 @@ constexpr auto kRequestEach = 30 * crl::time(1000);
SendAsPeers::SendAsPeers(not_null<Session*> session) SendAsPeers::SendAsPeers(not_null<Session*> session)
: _session(session) : _session(session)
, _onlyMe({ { .peer = session->user(), .premiumRequired = false } }) { , _onlyMe({ { .peer = session->user(), .premiumRequired = false } })
, _onlyMePaid({ session->user() }) {
_session->changes().peerUpdates( _session->changes().peerUpdates(
Data::PeerUpdate::Flag::Rights Data::PeerUpdate::Flag::Rights
) | rpl::map([=](const Data::PeerUpdate &update) { ) | rpl::map([=](const Data::PeerUpdate &update) {
@ -65,6 +66,7 @@ void SendAsPeers::refresh(not_null<PeerData*> peer, bool force) {
} }
_lastRequestTime[peer] = now; _lastRequestTime[peer] = now;
request(peer); request(peer);
request(peer, true);
} }
const std::vector<SendAsPeer> &SendAsPeers::list( const std::vector<SendAsPeer> &SendAsPeers::list(
@ -73,15 +75,10 @@ const std::vector<SendAsPeer> &SendAsPeers::list(
return (i != end(_lists)) ? i->second : _onlyMe; return (i != end(_lists)) ? i->second : _onlyMe;
} }
std::vector<not_null<PeerData*>> SendAsPeers::paidReactionList() const { const std::vector<not_null<PeerData*>> &SendAsPeers::paidReactionList(
auto result = std::vector<not_null<PeerData*>>(); not_null<PeerData*> peer) const {
const auto owner = &_session->data(); const auto i = _paidReactionLists.find(peer);
owner->enumerateBroadcasts([&](not_null<ChannelData*> channel) { return (i != end(_paidReactionLists)) ? i->second : _onlyMePaid;
if (channel->amCreator() && !ranges::contains(result, channel)) {
result.push_back(channel);
}
});
return result;
} }
rpl::producer<not_null<PeerData*>> SendAsPeers::updated() const { rpl::producer<not_null<PeerData*>> SendAsPeers::updated() const {
@ -144,8 +141,10 @@ not_null<PeerData*> SendAsPeers::ResolveChosen(
: fallback; : fallback;
} }
void SendAsPeers::request(not_null<PeerData*> peer) { void SendAsPeers::request(not_null<PeerData*> peer, bool forPaidReactions) {
using Flag = MTPchannels_GetSendAs::Flag;
peer->session().api().request(MTPchannels_GetSendAs( peer->session().api().request(MTPchannels_GetSendAs(
MTP_flags(forPaidReactions ? Flag::f_for_paid_reactions : Flag()),
peer->input peer->input
)).done([=](const MTPchannels_SendAsPeers &result) { )).done([=](const MTPchannels_SendAsPeers &result) {
auto parsed = std::vector<SendAsPeer>(); auto parsed = std::vector<SendAsPeer>();
@ -166,15 +165,26 @@ void SendAsPeers::request(not_null<PeerData*> peer) {
} }
} }
}); });
if (parsed.size() > 1) { if (forPaidReactions) {
auto &now = _lists[peer]; auto peers = parsed | ranges::views::transform(
if (now != parsed) { &SendAsPeer::peer
now = std::move(parsed); ) | ranges::to_vector;
if (!peers.empty()) {
_paidReactionLists[peer] = std::move(peers);
} else {
_paidReactionLists.remove(peer);
}
} else {
if (parsed.size() > 1) {
auto &now = _lists[peer];
if (now != parsed) {
now = std::move(parsed);
_updates.fire_copy(peer);
}
} else if (const auto i = _lists.find(peer); i != end(_lists)) {
_lists.erase(i);
_updates.fire_copy(peer); _updates.fire_copy(peer);
} }
} else if (const auto i = _lists.find(peer); i != end(_lists)) {
_lists.erase(i);
_updates.fire_copy(peer);
} }
}).send(); }).send();
} }

View file

@ -34,7 +34,8 @@ public:
void setChosen(not_null<PeerData*> peer, PeerId chosenId); void setChosen(not_null<PeerData*> peer, PeerId chosenId);
[[nodiscard]] PeerId chosen(not_null<PeerData*> peer) const; [[nodiscard]] PeerId chosen(not_null<PeerData*> peer) const;
[[nodiscard]] std::vector<not_null<PeerData*>> paidReactionList() const; [[nodiscard]] const std::vector<not_null<PeerData*>> &paidReactionList(
not_null<PeerData*> peer) const;
// If !list(peer).empty() then the result will be from that list. // If !list(peer).empty() then the result will be from that list.
[[nodiscard]] not_null<PeerData*> resolveChosen( [[nodiscard]] not_null<PeerData*> resolveChosen(
@ -46,14 +47,18 @@ public:
PeerId chosen); PeerId chosen);
private: private:
void request(not_null<PeerData*> peer); void request(not_null<PeerData*> peer, bool forPaidReactions = false);
const not_null<Session*> _session; const not_null<Session*> _session;
const std::vector<SendAsPeer> _onlyMe; const std::vector<SendAsPeer> _onlyMe;
const std::vector<not_null<PeerData*>> _onlyMePaid;
base::flat_map<not_null<PeerData*>, std::vector<SendAsPeer>> _lists; base::flat_map<not_null<PeerData*>, std::vector<SendAsPeer>> _lists;
base::flat_map<not_null<PeerData*>, crl::time> _lastRequestTime; base::flat_map<not_null<PeerData*>, crl::time> _lastRequestTime;
base::flat_map<not_null<PeerData*>, PeerId> _chosen; base::flat_map<not_null<PeerData*>, PeerId> _chosen;
base::flat_map<
not_null<PeerData*>,
std::vector<not_null<PeerData*>>> _paidReactionLists;
rpl::event_stream<not_null<PeerData*>> _updates; rpl::event_stream<not_null<PeerData*>> _updates;

View file

@ -2428,7 +2428,7 @@ channels.editLocation#58e63f6d channel:InputChannel geo_point:InputGeoPoint addr
channels.toggleSlowMode#edd49ef0 channel:InputChannel seconds:int = Updates; channels.toggleSlowMode#edd49ef0 channel:InputChannel seconds:int = Updates;
channels.getInactiveChannels#11e831ee = messages.InactiveChats; channels.getInactiveChannels#11e831ee = messages.InactiveChats;
channels.convertToGigagroup#b290c69 channel:InputChannel = Updates; channels.convertToGigagroup#b290c69 channel:InputChannel = Updates;
channels.getSendAs#dc770ee peer:InputPeer = channels.SendAsPeers; channels.getSendAs#e785a43f flags:# for_paid_reactions:flags.0?true peer:InputPeer = channels.SendAsPeers;
channels.deleteParticipantHistory#367544db channel:InputChannel participant:InputPeer = messages.AffectedHistory; channels.deleteParticipantHistory#367544db channel:InputChannel participant:InputPeer = messages.AffectedHistory;
channels.toggleJoinToSend#e4cb9580 channel:InputChannel enabled:Bool = Updates; channels.toggleJoinToSend#e4cb9580 channel:InputChannel enabled:Bool = Updates;
channels.toggleJoinRequest#4c2985b6 channel:InputChannel enabled:Bool = Updates; channels.toggleJoinRequest#4c2985b6 channel:InputChannel enabled:Bool = Updates;

View file

@ -213,7 +213,9 @@ void ShowPaidReactionDetails(
.my = (entry.my == 1), .my = (entry.my == 1),
}); });
}; };
const auto channels = session->sendAsPeers().paidReactionList(); const auto linked = item->discussionPostOriginalSender();
const auto channel = (linked ? linked : item->history()->peer.get());
const auto channels = session->sendAsPeers().paidReactionList(channel);
const auto topPaid = item->topPaidReactionsWithLocal(); const auto topPaid = item->topPaidReactionsWithLocal();
top.reserve(topPaid.size() + 2 + channels.size()); top.reserve(topPaid.size() + 2 + channels.size());
for (const auto &entry : topPaid) { for (const auto &entry : topPaid) {
@ -248,8 +250,6 @@ void ShowPaidReactionDetails(
} }
ranges::stable_sort(top, ranges::greater(), &Ui::PaidReactionTop::count); ranges::stable_sort(top, ranges::greater(), &Ui::PaidReactionTop::count);
const auto linked = item->discussionPostOriginalSender();
const auto channel = (linked ? linked : item->history()->peer.get());
state->selectBox = show->show(Ui::MakePaidReactionBox({ state->selectBox = show->show(Ui::MakePaidReactionBox({
.chosen = chosen, .chosen = chosen,
.max = max, .max = max,