data_channel.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "data/data_peer.h"
  9. #include "data/data_pts_waiter.h"
  10. #include "data/data_location.h"
  11. #include "data/data_chat_participant_status.h"
  12. #include "data/data_peer_bot_commands.h"
  13. #include "data/data_user_names.h"
  14. class ChannelData;
  15. struct ChannelLocation {
  16. QString address;
  17. Data::LocationPoint point;
  18. friend inline bool operator==(
  19. const ChannelLocation &a,
  20. const ChannelLocation &b) {
  21. return a.address.isEmpty()
  22. ? b.address.isEmpty()
  23. : (a.address == b.address && a.point == b.point);
  24. }
  25. friend inline bool operator!=(
  26. const ChannelLocation &a,
  27. const ChannelLocation &b) {
  28. return !(a == b);
  29. }
  30. };
  31. enum class ChannelDataFlag : uint64 {
  32. Left = (1ULL << 0),
  33. Creator = (1ULL << 1),
  34. Forbidden = (1ULL << 2),
  35. CallActive = (1ULL << 3),
  36. CallNotEmpty = (1ULL << 4),
  37. Signatures = (1ULL << 5),
  38. Verified = (1ULL << 6),
  39. Scam = (1ULL << 7),
  40. Fake = (1ULL << 8),
  41. Megagroup = (1ULL << 9),
  42. Broadcast = (1ULL << 10),
  43. Gigagroup = (1ULL << 11),
  44. Username = (1ULL << 12),
  45. Location = (1ULL << 13),
  46. CanSetUsername = (1ULL << 14),
  47. CanSetStickers = (1ULL << 15),
  48. PreHistoryHidden = (1ULL << 16),
  49. CanViewParticipants = (1ULL << 17),
  50. HasLink = (1ULL << 18),
  51. SlowmodeEnabled = (1ULL << 19),
  52. NoForwards = (1ULL << 20),
  53. JoinToWrite = (1ULL << 21),
  54. RequestToJoin = (1ULL << 22),
  55. Forum = (1ULL << 23),
  56. AntiSpam = (1ULL << 24),
  57. ParticipantsHidden = (1ULL << 25),
  58. StoriesHidden = (1ULL << 26),
  59. HasActiveStories = (1ULL << 27),
  60. HasUnreadStories = (1ULL << 28),
  61. CanGetStatistics = (1ULL << 29),
  62. ViewAsMessages = (1ULL << 30),
  63. SimilarExpanded = (1ULL << 31),
  64. CanViewRevenue = (1ULL << 32),
  65. PaidMediaAllowed = (1ULL << 33),
  66. CanViewCreditsRevenue = (1ULL << 34),
  67. SignatureProfiles = (1ULL << 35),
  68. StargiftsAvailable = (1ULL << 36),
  69. PaidMessagesAvailable = (1ULL << 37),
  70. };
  71. inline constexpr bool is_flag_type(ChannelDataFlag) { return true; };
  72. using ChannelDataFlags = base::flags<ChannelDataFlag>;
  73. class MegagroupInfo {
  74. public:
  75. MegagroupInfo();
  76. ~MegagroupInfo();
  77. struct Admin {
  78. explicit Admin(ChatAdminRightsInfo rights)
  79. : rights(rights) {
  80. }
  81. Admin(ChatAdminRightsInfo rights, bool canEdit)
  82. : rights(rights)
  83. , canEdit(canEdit) {
  84. }
  85. ChatAdminRightsInfo rights;
  86. bool canEdit = false;
  87. };
  88. struct Restricted {
  89. explicit Restricted(ChatRestrictionsInfo rights)
  90. : rights(rights) {
  91. }
  92. ChatRestrictionsInfo rights;
  93. };
  94. ChatData *getMigrateFromChat() const;
  95. void setMigrateFromChat(ChatData *chat);
  96. const ChannelLocation *getLocation() const;
  97. void setLocation(const ChannelLocation &location);
  98. Data::ChatBotCommands::Changed setBotCommands(
  99. const std::vector<Data::BotCommands> &commands);
  100. [[nodiscard]] const Data::ChatBotCommands &botCommands() const {
  101. return _botCommands;
  102. }
  103. void ensureForum(not_null<ChannelData*> that);
  104. [[nodiscard]] Data::Forum *forum() const;
  105. [[nodiscard]] std::unique_ptr<Data::Forum> takeForumData();
  106. std::deque<not_null<UserData*>> lastParticipants;
  107. base::flat_map<not_null<UserData*>, Admin> lastAdmins;
  108. base::flat_map<not_null<UserData*>, Restricted> lastRestricted;
  109. base::flat_set<not_null<PeerData*>> markupSenders;
  110. base::flat_set<not_null<UserData*>> bots;
  111. rpl::event_stream<bool> unrestrictedByBoostsChanges;
  112. // For admin badges, full admins list with ranks.
  113. base::flat_map<UserId, QString> admins;
  114. UserData *creator = nullptr; // nullptr means unknown
  115. QString creatorRank;
  116. int botStatus = 0; // -1 - no bots, 0 - unknown, 1 - one bot, that sees all history, 2 - other
  117. bool joinedMessageFound = false;
  118. bool adminsLoaded = false;
  119. StickerSetIdentifier stickerSet;
  120. StickerSetIdentifier emojiSet;
  121. enum LastParticipantsStatus {
  122. LastParticipantsUpToDate = 0x00,
  123. LastParticipantsOnceReceived = 0x01,
  124. LastParticipantsCountOutdated = 0x02,
  125. };
  126. mutable int lastParticipantsStatus = LastParticipantsUpToDate;
  127. int lastParticipantsCount = 0;
  128. int boostsApplied = 0;
  129. int boostsUnrestrict = 0;
  130. int slowmodeSeconds = 0;
  131. TimeId slowmodeLastMessage = 0;
  132. private:
  133. ChatData *_migratedFrom = nullptr;
  134. ChannelLocation _location;
  135. Data::ChatBotCommands _botCommands;
  136. std::unique_ptr<Data::Forum> _forum;
  137. int _starsPerMessage = 0;
  138. friend class ChannelData;
  139. };
  140. class ChannelData final : public PeerData {
  141. public:
  142. using Flag = ChannelDataFlag;
  143. using Flags = Data::Flags<ChannelDataFlags>;
  144. using AdminRight = ChatAdminRight;
  145. using Restriction = ChatRestriction;
  146. using AdminRights = ChatAdminRights;
  147. using Restrictions = ChatRestrictions;
  148. using AdminRightFlags = Data::Flags<AdminRights>;
  149. using RestrictionFlags = Data::Flags<Restrictions>;
  150. ChannelData(not_null<Data::Session*> owner, PeerId id);
  151. void setName(const QString &name, const QString &username);
  152. void setUsername(const QString &username);
  153. void setUsernames(const Data::Usernames &newUsernames);
  154. void setPhoto(const MTPChatPhoto &photo);
  155. void setAccessHash(uint64 accessHash);
  156. void setFlags(ChannelDataFlags which);
  157. void addFlags(ChannelDataFlags which);
  158. void removeFlags(ChannelDataFlags which);
  159. [[nodiscard]] auto flags() const {
  160. return _flags.current();
  161. }
  162. [[nodiscard]] auto flagsValue() const {
  163. return _flags.value();
  164. }
  165. [[nodiscard]] QString username() const;
  166. [[nodiscard]] QString editableUsername() const;
  167. [[nodiscard]] const std::vector<QString> &usernames() const;
  168. [[nodiscard]] bool isUsernameEditable(QString username) const;
  169. [[nodiscard]] int membersCount() const {
  170. return std::max(_membersCount, 1);
  171. }
  172. void setMembersCount(int newMembersCount);
  173. [[nodiscard]] bool membersCountKnown() const {
  174. return (_membersCount >= 0);
  175. }
  176. [[nodiscard]] int adminsCount() const {
  177. return _adminsCount;
  178. }
  179. void setAdminsCount(int newAdminsCount);
  180. [[nodiscard]] int restrictedCount() const {
  181. return _restrictedCount;
  182. }
  183. void setRestrictedCount(int newRestrictedCount);
  184. [[nodiscard]] int kickedCount() const {
  185. return _kickedCount;
  186. }
  187. void setKickedCount(int newKickedCount);
  188. [[nodiscard]] int pendingRequestsCount() const {
  189. return _pendingRequestsCount;
  190. }
  191. [[nodiscard]] const std::vector<UserId> &recentRequesters() const {
  192. return _recentRequesters;
  193. }
  194. void setPendingRequestsCount(
  195. int count,
  196. const QVector<MTPlong> &recentRequesters);
  197. void setPendingRequestsCount(
  198. int count,
  199. std::vector<UserId> recentRequesters);
  200. [[nodiscard]] bool haveLeft() const {
  201. return flags() & Flag::Left;
  202. }
  203. [[nodiscard]] bool amIn() const {
  204. return !isForbidden() && !haveLeft();
  205. }
  206. [[nodiscard]] bool addsSignature() const {
  207. return flags() & Flag::Signatures;
  208. }
  209. [[nodiscard]] bool signatureProfiles() const {
  210. return flags() & Flag::SignatureProfiles;
  211. }
  212. [[nodiscard]] bool isForbidden() const {
  213. return flags() & Flag::Forbidden;
  214. }
  215. [[nodiscard]] bool isVerified() const {
  216. return flags() & Flag::Verified;
  217. }
  218. [[nodiscard]] bool isScam() const {
  219. return flags() & Flag::Scam;
  220. }
  221. [[nodiscard]] bool isFake() const {
  222. return flags() & Flag::Fake;
  223. }
  224. [[nodiscard]] bool hasStoriesHidden() const {
  225. return flags() & Flag::StoriesHidden;
  226. }
  227. [[nodiscard]] bool viewForumAsMessages() const {
  228. return flags() & Flag::ViewAsMessages;
  229. }
  230. [[nodiscard]] bool stargiftsAvailable() const {
  231. return flags() & Flag::StargiftsAvailable;
  232. }
  233. [[nodiscard]] bool paidMessagesAvailable() const {
  234. return flags() & Flag::PaidMessagesAvailable;
  235. }
  236. [[nodiscard]] static ChatRestrictionsInfo KickedRestrictedRights(
  237. not_null<PeerData*> participant);
  238. static constexpr auto kRestrictUntilForever = TimeId(INT_MAX);
  239. [[nodiscard]] static bool IsRestrictedForever(TimeId until) {
  240. return !until || (until == kRestrictUntilForever);
  241. }
  242. void applyEditAdmin(
  243. not_null<UserData*> user,
  244. ChatAdminRightsInfo oldRights,
  245. ChatAdminRightsInfo newRights,
  246. const QString &rank);
  247. void applyEditBanned(
  248. not_null<PeerData*> participant,
  249. ChatRestrictionsInfo oldRights,
  250. ChatRestrictionsInfo newRights);
  251. void setViewAsMessagesFlag(bool enabled);
  252. void markForbidden();
  253. [[nodiscard]] bool isGroupAdmin(not_null<UserData*> user) const;
  254. [[nodiscard]] bool lastParticipantsRequestNeeded() const;
  255. [[nodiscard]] bool isMegagroup() const {
  256. return flags() & Flag::Megagroup;
  257. }
  258. [[nodiscard]] bool isBroadcast() const {
  259. return flags() & Flag::Broadcast;
  260. }
  261. [[nodiscard]] bool isGigagroup() const {
  262. return flags() & Flag::Gigagroup;
  263. }
  264. [[nodiscard]] bool isForum() const {
  265. return flags() & Flag::Forum;
  266. }
  267. [[nodiscard]] bool hasUsername() const {
  268. return flags() & Flag::Username;
  269. }
  270. [[nodiscard]] bool hasLocation() const {
  271. return flags() & Flag::Location;
  272. }
  273. [[nodiscard]] bool isPublic() const {
  274. return hasUsername() || hasLocation();
  275. }
  276. [[nodiscard]] bool amCreator() const {
  277. return flags() & Flag::Creator;
  278. }
  279. [[nodiscard]] bool joinToWrite() const {
  280. return flags() & Flag::JoinToWrite;
  281. }
  282. [[nodiscard]] bool requestToJoin() const {
  283. return flags() & Flag::RequestToJoin;
  284. }
  285. [[nodiscard]] bool antiSpamMode() const {
  286. return flags() & Flag::AntiSpam;
  287. }
  288. [[nodiscard]] auto adminRights() const {
  289. return _adminRights.current();
  290. }
  291. [[nodiscard]] auto adminRightsValue() const {
  292. return _adminRights.value();
  293. }
  294. void setAdminRights(ChatAdminRights rights);
  295. [[nodiscard]] bool hasAdminRights() const {
  296. return (adminRights() != 0);
  297. }
  298. [[nodiscard]] auto restrictions() const {
  299. return _restrictions.current();
  300. }
  301. [[nodiscard]] auto restrictionsValue() const {
  302. return _restrictions.value();
  303. }
  304. [[nodiscard]] TimeId restrictedUntil() const {
  305. return _restrictedUntil;
  306. }
  307. void setRestrictions(ChatRestrictionsInfo rights);
  308. [[nodiscard]] bool hasRestrictions() const {
  309. return (restrictions() != 0);
  310. }
  311. [[nodiscard]] bool hasRestrictions(TimeId now) const {
  312. return hasRestrictions()
  313. && (restrictedUntil() > now);
  314. }
  315. [[nodiscard]] auto defaultRestrictions() const {
  316. return _defaultRestrictions.current();
  317. }
  318. [[nodiscard]] auto defaultRestrictionsValue() const {
  319. return _defaultRestrictions.value();
  320. }
  321. void setDefaultRestrictions(ChatRestrictions rights);
  322. // Like in ChatData.
  323. [[nodiscard]] bool allowsForwarding() const;
  324. [[nodiscard]] bool canEditInformation() const;
  325. [[nodiscard]] bool canEditPermissions() const;
  326. [[nodiscard]] bool canEditUsername() const;
  327. [[nodiscard]] bool canEditPreHistoryHidden() const;
  328. [[nodiscard]] bool canAddMembers() const;
  329. [[nodiscard]] bool canAddAdmins() const;
  330. [[nodiscard]] bool canBanMembers() const;
  331. [[nodiscard]] bool anyoneCanAddMembers() const;
  332. [[nodiscard]] bool canPostMessages() const;
  333. [[nodiscard]] bool canEditMessages() const;
  334. [[nodiscard]] bool canDeleteMessages() const;
  335. [[nodiscard]] bool canPostStories() const;
  336. [[nodiscard]] bool canEditStories() const;
  337. [[nodiscard]] bool canDeleteStories() const;
  338. [[nodiscard]] bool canPostPaidMedia() const;
  339. [[nodiscard]] bool hiddenPreHistory() const;
  340. [[nodiscard]] bool canViewMembers() const;
  341. [[nodiscard]] bool canViewAdmins() const;
  342. [[nodiscard]] bool canViewBanned() const;
  343. [[nodiscard]] bool canEditSignatures() const;
  344. [[nodiscard]] bool canEditStickers() const;
  345. [[nodiscard]] bool canEditEmoji() const;
  346. [[nodiscard]] bool canDelete() const;
  347. [[nodiscard]] bool canEditAdmin(not_null<UserData*> user) const;
  348. [[nodiscard]] bool canRestrictParticipant(
  349. not_null<PeerData*> participant) const;
  350. void setBotVerifyDetails(Ui::BotVerifyDetails details);
  351. void setBotVerifyDetailsIcon(DocumentId iconId);
  352. [[nodiscard]] Ui::BotVerifyDetails *botVerifyDetails() const {
  353. return _botVerifyDetails.get();
  354. }
  355. void setInviteLink(const QString &newInviteLink);
  356. [[nodiscard]] QString inviteLink() const {
  357. return _inviteLink;
  358. }
  359. [[nodiscard]] bool canHaveInviteLink() const;
  360. void setLocation(const MTPChannelLocation &data);
  361. [[nodiscard]] const ChannelLocation *getLocation() const;
  362. void setLinkedChat(ChannelData *linked);
  363. [[nodiscard]] ChannelData *linkedChat() const;
  364. [[nodiscard]] bool linkedChatKnown() const;
  365. void ptsInit(int32 pts) {
  366. _ptsWaiter.init(pts);
  367. }
  368. void ptsReceived(int32 pts) {
  369. _ptsWaiter.updateAndApply(this, pts, 0);
  370. }
  371. bool ptsUpdateAndApply(int32 pts, int32 count) {
  372. return _ptsWaiter.updateAndApply(this, pts, count);
  373. }
  374. bool ptsUpdateAndApply(
  375. int32 pts,
  376. int32 count,
  377. const MTPUpdate &update) {
  378. return _ptsWaiter.updateAndApply(this, pts, count, update);
  379. }
  380. bool ptsUpdateAndApply(
  381. int32 pts,
  382. int32 count,
  383. const MTPUpdates &updates) {
  384. return _ptsWaiter.updateAndApply(this, pts, count, updates);
  385. }
  386. [[nodiscard]] int32 pts() const {
  387. return _ptsWaiter.current();
  388. }
  389. [[nodiscard]] bool ptsInited() const {
  390. return _ptsWaiter.inited();
  391. }
  392. [[nodiscard]] bool ptsRequesting() const {
  393. return _ptsWaiter.requesting();
  394. }
  395. void ptsSetRequesting(bool isRequesting) {
  396. return _ptsWaiter.setRequesting(isRequesting);
  397. }
  398. // < 0 - not waiting
  399. void ptsSetWaitingForShortPoll(int32 ms) {
  400. return _ptsWaiter.setWaitingForShortPoll(this, ms);
  401. }
  402. [[nodiscard]] bool ptsWaitingForSkipped() const {
  403. return _ptsWaiter.waitingForSkipped();
  404. }
  405. [[nodiscard]] bool ptsWaitingForShortPoll() const {
  406. return _ptsWaiter.waitingForShortPoll();
  407. }
  408. [[nodiscard]] MsgId availableMinId() const {
  409. return _availableMinId;
  410. }
  411. void setAvailableMinId(MsgId availableMinId);
  412. [[nodiscard]] ChatData *getMigrateFromChat() const;
  413. void setMigrateFromChat(ChatData *chat);
  414. [[nodiscard]] int slowmodeSeconds() const;
  415. void setSlowmodeSeconds(int seconds);
  416. [[nodiscard]] TimeId slowmodeLastMessage() const;
  417. void growSlowmodeLastMessage(TimeId when);
  418. void setStarsPerMessage(int stars);
  419. [[nodiscard]] int starsPerMessage() const;
  420. [[nodiscard]] int peerGiftsCount() const;
  421. void setPeerGiftsCount(int count);
  422. [[nodiscard]] int boostsApplied() const;
  423. [[nodiscard]] int boostsUnrestrict() const;
  424. [[nodiscard]] bool unrestrictedByBoosts() const;
  425. [[nodiscard]] rpl::producer<bool> unrestrictedByBoostsValue() const;
  426. void setBoostsUnrestrict(int applied, int unrestrict);
  427. void setInvitePeek(const QString &hash, TimeId expires);
  428. void clearInvitePeek();
  429. [[nodiscard]] TimeId invitePeekExpires() const;
  430. [[nodiscard]] QString invitePeekHash() const;
  431. void privateErrorReceived();
  432. [[nodiscard]] Data::GroupCall *groupCall() const {
  433. return _call.get();
  434. }
  435. void migrateCall(std::unique_ptr<Data::GroupCall> call);
  436. void setGroupCall(
  437. const MTPInputGroupCall &call,
  438. TimeId scheduleDate = 0,
  439. bool rtmp = false);
  440. void clearGroupCall();
  441. void setGroupCallDefaultJoinAs(PeerId peerId);
  442. [[nodiscard]] PeerId groupCallDefaultJoinAs() const;
  443. void setAllowedReactions(Data::AllowedReactions value);
  444. [[nodiscard]] const Data::AllowedReactions &allowedReactions() const;
  445. [[nodiscard]] bool hasActiveStories() const;
  446. [[nodiscard]] bool hasUnreadStories() const;
  447. void setStoriesState(StoriesState state);
  448. [[nodiscard]] Data::Forum *forum() const {
  449. return mgInfo ? mgInfo->forum() : nullptr;
  450. }
  451. void processTopics(const MTPVector<MTPForumTopic> &topics);
  452. [[nodiscard]] int levelHint() const;
  453. void updateLevelHint(int levelHint);
  454. [[nodiscard]] TimeId subscriptionUntilDate() const;
  455. void updateSubscriptionUntilDate(TimeId subscriptionUntilDate);
  456. // Still public data members.
  457. uint64 access = 0;
  458. MTPinputChannel inputChannel = MTP_inputChannelEmpty();
  459. int32 date = 0;
  460. std::unique_ptr<MegagroupInfo> mgInfo;
  461. // > 0 - user who invited me to channel, < 0 - not in channel.
  462. UserId inviter = 0;
  463. TimeId inviteDate = 0;
  464. bool inviteViaRequest = false;
  465. private:
  466. struct InvitePeek {
  467. QString hash;
  468. TimeId expires = 0;
  469. };
  470. auto unavailableReasons() const
  471. -> const std::vector<Data::UnavailableReason> & override;
  472. bool canEditLastAdmin(not_null<UserData*> user) const;
  473. void setUnavailableReasonsList(
  474. std::vector<Data::UnavailableReason> &&reasons) override;
  475. Flags _flags = ChannelDataFlags(Flag::Forbidden);
  476. int _peerGiftsCount = 0;
  477. PtsWaiter _ptsWaiter;
  478. Data::UsernamesInfo _username;
  479. int _membersCount = -1;
  480. int _adminsCount = 1;
  481. int _restrictedCount = 0;
  482. int _kickedCount = 0;
  483. int _pendingRequestsCount = 0;
  484. int _levelHint = 0;
  485. std::vector<UserId> _recentRequesters;
  486. MsgId _availableMinId = 0;
  487. RestrictionFlags _defaultRestrictions;
  488. AdminRightFlags _adminRights;
  489. RestrictionFlags _restrictions;
  490. TimeId _restrictedUntil;
  491. TimeId _subscriptionUntilDate;
  492. std::vector<Data::UnavailableReason> _unavailableReasons;
  493. std::unique_ptr<InvitePeek> _invitePeek;
  494. QString _inviteLink;
  495. std::optional<ChannelData*> _linkedChat;
  496. Data::AllowedReactions _allowedReactions;
  497. std::unique_ptr<Data::GroupCall> _call;
  498. PeerId _callDefaultJoinAs = 0;
  499. std::unique_ptr<Ui::BotVerifyDetails> _botVerifyDetails;
  500. };
  501. namespace Data {
  502. void ApplyMigration(
  503. not_null<ChatData*> chat,
  504. not_null<ChannelData*> channel);
  505. void ApplyChannelUpdate(
  506. not_null<ChannelData*> channel,
  507. const MTPDupdateChatDefaultBannedRights &update);
  508. void ApplyChannelUpdate(
  509. not_null<ChannelData*> channel,
  510. const MTPDchannelFull &update);
  511. } // namespace Data