mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2026-07-25 06:54:43 +00:00
Update API scheme on layer 145.
Restrict send from channels to premium in line with API restrictions.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user