tdesktop/Telegram/SourceFiles/api/api_chat_participants.h

143 lines
3.2 KiB
C++

/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "data/data_chat_participant_status.h"
#include "mtproto/sender.h"
#include "base/timer.h"
class ApiWrap;
class ChannelData;
namespace Api {
class ChatParticipant final {
public:
enum class Type {
Creator,
Admin,
Member,
Restricted,
Left,
Banned,
};
explicit ChatParticipant(
const MTPChannelParticipant &p,
not_null<PeerData*> peer);
ChatParticipant(
Type type,
PeerId peerId,
UserId by,
ChatRestrictionsInfo restrictions,
ChatAdminRightsInfo rights,
bool canBeEdited = false,
QString rank = QString());
bool isUser() const;
bool isCreator() const;
bool isCreatorOrAdmin() const;
bool isKicked() const;
bool canBeEdited() const;
UserId by() const;
PeerId id() const;
UserId userId() const;
ChatRestrictionsInfo restrictions() const;
ChatAdminRightsInfo rights() const;
Type type() const;
QString rank() const;
void tryApplyCreatorTo(not_null<ChannelData*> channel) const;
private:
Type _type = Type::Member;
PeerId _peer;
UserId _by; // Banned/Restricted/Promoted.
bool _canBeEdited = false;
QString _rank;
ChatRestrictionsInfo _restrictions;
ChatAdminRightsInfo _rights;
};
class ChatParticipants final {
public:
struct Parsed {
const int availableCount;
const std::vector<ChatParticipant> list;
};
using TLMembers = MTPDchannels_channelParticipants;
using Members = const std::vector<ChatParticipant> &;
explicit ChatParticipants(not_null<ApiWrap*> api);
void requestLast(not_null<ChannelData*> channel);
void requestBots(not_null<ChannelData*> channel);
void requestAdmins(not_null<ChannelData*> channel);
void requestCountDelayed(not_null<ChannelData*> channel);
static Parsed Parse(
not_null<ChannelData*> channel,
const TLMembers &data);
static Parsed ParseRecent(
not_null<ChannelData*> channel,
const TLMembers &data);
void add(
not_null<PeerData*> peer,
const std::vector<not_null<UserData*>> &users,
Fn<void(bool)> done = nullptr);
void requestSelf(not_null<ChannelData*> channel);
void requestForAdd(
not_null<ChannelData*> channel,
Fn<void(const TLMembers&)> callback);
void kick(
not_null<ChatData*> chat,
not_null<PeerData*> participant);
void kick(
not_null<ChannelData*> channel,
not_null<PeerData*> participant,
ChatRestrictionsInfo currentRights);
void unblock(
not_null<ChannelData*> channel,
not_null<PeerData*> participant);
private:
MTP::Sender _api;
using PeerRequests = base::flat_map<PeerData*, mtpRequestId>;
PeerRequests _participantsRequests;
PeerRequests _botsRequests;
PeerRequests _adminsRequests;
base::DelayedCallTimer _participantsCountRequestTimer;
struct {
ChannelData *channel = nullptr;
mtpRequestId requestId = 0;
Fn<void(const TLMembers&)> callback;
} _forAdd;
base::flat_set<not_null<ChannelData*>> _selfParticipantRequests;
using KickRequest = std::pair<
not_null<ChannelData*>,
not_null<PeerData*>>;
base::flat_map<KickRequest, mtpRequestId> _kickRequests;
};
} // namespace Api