/* 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 #include "boxes/peer_list_box.h" #include "mtproto/sender.h" #include "base/timer.h" #include "base/weak_ptr.h" #include "info/profile/info_profile_members_controllers.h" namespace Window { class Navigation; } // namespace Window Fn SaveAdminCallback( not_null channel, not_null user, Fn onDone, Fn onFail); Fn SaveRestrictedCallback( not_null channel, not_null user, Fn onDone, Fn onFail); class ParticipantsOnlineSorter : private base::Subscriber { public: ParticipantsOnlineSorter( not_null peer, not_null delegate); void sort(); rpl::producer onlineCountValue() const; private: void sortDelayed(); void refreshOnlineCount(); not_null _peer; not_null _delegate; base::Timer _sortByOnlineTimer; rpl::variable _onlineCount = 0; }; // Viewing admins, banned or restricted users list with search. class ParticipantsBoxController : public PeerListController , private base::Subscriber , private MTP::Sender , public base::has_weak_ptr { public: enum class Role { Profile, Members, Admins, Restricted, Kicked, }; static void Start( not_null navigation, not_null peer, Role role); struct Additional { void fillCreator(not_null peer); std::map, MTPChatAdminRights> adminRights; std::set> adminCanEdit; std::map, not_null> adminPromotedBy; std::map, MTPChatBannedRights> restrictedRights; std::set> kicked; std::map, not_null> restrictedBy; std::set> external; std::set> infoNotLoaded; UserData *creator = nullptr; }; ParticipantsBoxController( not_null navigation, not_null peer, Role role); void prepare() override; void rowClicked(not_null row) override; void rowActionClicked(not_null row) override; base::unique_qptr rowContextMenu( QWidget *parent, not_null row) override; void loadMoreRows() override; void peerListSearchAddRow(not_null peer) override; std::unique_ptr createSearchRow( not_null peer) override; std::unique_ptr createRestoredRow( not_null peer) override; std::unique_ptr saveState() const override; void restoreState(std::unique_ptr state) override; // Callback(not_null) template static void HandleParticipant( const MTPChannelParticipant &participant, Role role, not_null additional, Callback callback); rpl::producer onlineCountValue() const override; protected: virtual std::unique_ptr createRow( not_null user) const; private: using Row = Info::Profile::MemberListRow; using Type = Row::Type; using Rights = Row::Rights; struct SavedState : SavedStateBase { using SearchStateBase = PeerListSearchController::SavedStateBase; std::unique_ptr searchState; int offset = 0; bool allLoaded = false; bool wasLoading = false; Additional additional; rpl::lifetime lifetime; }; static std::unique_ptr CreateSearchController( not_null peer, Role role, not_null additional); void prepareChatRows(not_null chat); void rebuildChatRows(not_null chat); void rebuildRowTypes(); void addNewItem(); void addNewParticipants(); void setNonEmptyDescription(); void setupListChangeViewers(); void showAdmin(not_null user); void editAdminDone( not_null user, const MTPChatAdminRights &rights); void showRestricted(not_null user); void editRestrictedDone( not_null user, const MTPChatBannedRights &rights); void removeKicked(not_null row, not_null user); void kickMember(not_null user); void kickMemberSure(not_null user); void removeAdmin(not_null user); void removeAdminSure(not_null user); bool appendRow(not_null user); bool prependRow(not_null user); bool removeRow(not_null user); void refreshCustomStatus(not_null row) const; bool feedMegagroupLastParticipants(); void refreshOnlineCount(); Type computeType(not_null user) const; void recomputeTypeFor(not_null user); bool canEditAdmin(not_null user) const; bool canRestrictUser(not_null user) const; bool canEditAdminByRights(not_null user) const; not_null _navigation; not_null _peer; Role _role = Role::Admins; int _offset = 0; mtpRequestId _loadRequestId = 0; bool _allLoaded = false; Additional _additional; std::unique_ptr _onlineSorter; QPointer _editBox; QPointer _addBox; }; // Members, banned and restricted users server side search. class ParticipantsBoxSearchController : public PeerListSearchController , private MTP::Sender { public: using Role = ParticipantsBoxController::Role; using Additional = ParticipantsBoxController::Additional; ParticipantsBoxSearchController( not_null channel, Role role, not_null additional); void searchQuery(const QString &query) override; bool isLoading() override; bool loadMoreRows() override; std::unique_ptr saveState() const override; void restoreState(std::unique_ptr state) override; private: struct SavedState : SavedStateBase { QString query; int offset = 0; bool allLoaded = false; bool wasLoading = false; }; struct CacheEntry { MTPchannels_ChannelParticipants result; int requestedCount = 0; }; struct Query { QString text; int offset = 0; }; void searchOnServer(); bool searchInCache(); void searchDone( mtpRequestId requestId, const MTPchannels_ChannelParticipants &result, int requestedCount); not_null _channel; Role _role = Role::Restricted; not_null _additional; base::Timer _timer; QString _query; mtpRequestId _requestId = 0; int _offset = 0; bool _allLoaded = false; std::map _cache; std::map _queries; };