Update API scheme on layer 145.

Restrict send from channels to premium in line with API restrictions.
This commit is contained in:
John Preston
2022-09-02 20:07:53 +04:00
parent e32031963b
commit 9bb2bb09b9
7 changed files with 176 additions and 44 deletions
@@ -23,7 +23,7 @@ constexpr auto kRequestEach = 30 * crl::time(1000);
SendAsPeers::SendAsPeers(not_null<Session*> session)
: _session(session)
, _onlyMe({ session->user() }) {
, _onlyMe({ { .peer = session->user(), .premiumRequired = false } }) {
_session->changes().peerUpdates(
Data::PeerUpdate::Flag::Rights
) | rpl::map([=](const Data::PeerUpdate &update) {
@@ -60,7 +60,7 @@ void SendAsPeers::refresh(not_null<PeerData*> peer, bool force) {
request(peer);
}
const std::vector<not_null<PeerData*>> &SendAsPeers::list(
const std::vector<SendAsPeer> &SendAsPeers::list(
not_null<PeerData*> peer) const {
const auto i = _lists.find(peer);
return (i != end(_lists)) ? i->second : _onlyMe;
@@ -108,13 +108,15 @@ not_null<PeerData*> SendAsPeers::resolveChosen(
not_null<PeerData*> SendAsPeers::ResolveChosen(
not_null<PeerData*> peer,
const std::vector<not_null<PeerData*>> &list,
const std::vector<SendAsPeer> &list,
PeerId chosen) {
const auto i = ranges::find(list, chosen, &PeerData::id);
const auto i = ranges::find(list, chosen, [](const SendAsPeer &as) {
return as.peer->id;
});
return (i != end(list))
? (*i)
? i->peer
: !list.empty()
? list.front()
? list.front().peer
: (peer->isMegagroup() && peer->amAnonymous())
? peer
: peer->session().user();
@@ -124,21 +126,28 @@ void SendAsPeers::request(not_null<PeerData*> peer) {
peer->session().api().request(MTPchannels_GetSendAs(
peer->input
)).done([=](const MTPchannels_SendAsPeers &result) {
auto list = std::vector<not_null<PeerData*>>();
auto parsed = std::vector<SendAsPeer>();
auto &owner = peer->owner();
result.match([&](const MTPDchannels_sendAsPeers &data) {
owner.processUsers(data.vusers());
owner.processChats(data.vchats());
for (const auto &id : data.vpeers().v) {
if (const auto peer = owner.peerLoaded(peerFromMTP(id))) {
list.push_back(peer);
const auto &list = data.vpeers().v;
parsed.reserve(list.size());
for (const auto &as : list) {
const auto &data = as.data();
const auto peerId = peerFromMTP(data.vpeer());
if (const auto peer = owner.peerLoaded(peerId)) {
parsed.push_back({
.peer = peer,
.premiumRequired = data.is_premium_required(),
});
}
}
});
if (list.size() > 1) {
if (parsed.size() > 1) {
auto &now = _lists[peer];
if (now != list) {
now = std::move(list);
if (now != parsed) {
now = std::move(parsed);
_updates.fire_copy(peer);
}
} else if (const auto i = _lists.find(peer); i != end(_lists)) {
@@ -13,13 +13,20 @@ namespace Main {
class Session;
struct SendAsPeer {
not_null<PeerData*> peer;
bool premiumRequired = false;
friend inline auto operator<=>(SendAsPeer, SendAsPeer) = default;
};
class SendAsPeers final {
public:
explicit SendAsPeers(not_null<Session*> session);
bool shouldChoose(not_null<PeerData*> peer);
void refresh(not_null<PeerData*> peer, bool force = false);
[[nodiscard]] const std::vector<not_null<PeerData*>> &list(
[[nodiscard]] const std::vector<SendAsPeer> &list(
not_null<PeerData*> peer) const;
[[nodiscard]] rpl::producer<not_null<PeerData*>> updated() const;
@@ -33,18 +40,16 @@ public:
[[nodiscard]] static not_null<PeerData*> ResolveChosen(
not_null<PeerData*> peer,
const std::vector<not_null<PeerData*>> &list,
const std::vector<SendAsPeer> &list,
PeerId chosen);
private:
void request(not_null<PeerData*> peer);
const not_null<Session*> _session;
const std::vector<not_null<PeerData*>> _onlyMe;
const std::vector<SendAsPeer> _onlyMe;
base::flat_map<
not_null<PeerData*>,
std::vector<not_null<PeerData*>>> _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*>, PeerId> _chosen;