data_chat.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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_chat_participant_status.h"
  10. #include "data/data_peer_bot_commands.h"
  11. enum class ChatAdminRight;
  12. enum class ChatDataFlag {
  13. Left = (1 << 0),
  14. //Kicked = (1 << 1),
  15. Creator = (1 << 2),
  16. Deactivated = (1 << 3),
  17. Forbidden = (1 << 4),
  18. CallActive = (1 << 5),
  19. CallNotEmpty = (1 << 6),
  20. CanSetUsername = (1 << 7),
  21. NoForwards = (1 << 8),
  22. };
  23. inline constexpr bool is_flag_type(ChatDataFlag) { return true; };
  24. using ChatDataFlags = base::flags<ChatDataFlag>;
  25. class ChatData final : public PeerData {
  26. public:
  27. using Flag = ChatDataFlag;
  28. using Flags = Data::Flags<ChatDataFlags>;
  29. ChatData(not_null<Data::Session*> owner, PeerId id);
  30. void setName(const QString &newName);
  31. void setPhoto(const MTPChatPhoto &photo);
  32. void invalidateParticipants();
  33. [[nodiscard]] bool noParticipantInfo() const {
  34. return (count > 0 || amIn()) && participants.empty();
  35. }
  36. void setFlags(ChatDataFlags which);
  37. void addFlags(ChatDataFlags which) {
  38. _flags.add(which);
  39. }
  40. void removeFlags(ChatDataFlags which) {
  41. _flags.remove(which);
  42. }
  43. [[nodiscard]] auto flags() const {
  44. return _flags.current();
  45. }
  46. [[nodiscard]] auto flagsValue() const {
  47. return _flags.value();
  48. }
  49. [[nodiscard]] auto adminRights() const {
  50. return _adminRights.current();
  51. }
  52. [[nodiscard]] auto adminRightsValue() const {
  53. return _adminRights.value();
  54. }
  55. void setAdminRights(ChatAdminRights rights);
  56. [[nodiscard]] bool hasAdminRights() const {
  57. return (adminRights() != 0);
  58. }
  59. [[nodiscard]] auto defaultRestrictions() const {
  60. return _defaultRestrictions.current();
  61. }
  62. [[nodiscard]] auto defaultRestrictionsValue() const {
  63. return _defaultRestrictions.value();
  64. }
  65. void setDefaultRestrictions(ChatRestrictions rights);
  66. [[nodiscard]] bool isForbidden() const {
  67. return flags() & Flag::Forbidden;
  68. }
  69. [[nodiscard]] bool amIn() const {
  70. return !isForbidden() && !isDeactivated() && !haveLeft();
  71. }
  72. [[nodiscard]] bool haveLeft() const {
  73. return flags() & ChatDataFlag::Left;
  74. }
  75. [[nodiscard]] bool amCreator() const {
  76. return flags() & ChatDataFlag::Creator;
  77. }
  78. [[nodiscard]] bool isDeactivated() const {
  79. return flags() & ChatDataFlag::Deactivated;
  80. }
  81. [[nodiscard]] bool isMigrated() const {
  82. return (_migratedTo != nullptr);
  83. }
  84. [[nodiscard]] ChatAdminRightsInfo defaultAdminRights(
  85. not_null<UserData*> user);
  86. // Like in ChannelData.
  87. [[nodiscard]] bool allowsForwarding() const;
  88. [[nodiscard]] bool canEditInformation() const;
  89. [[nodiscard]] bool canEditPermissions() const;
  90. [[nodiscard]] bool canEditUsername() const;
  91. [[nodiscard]] bool canEditPreHistoryHidden() const;
  92. [[nodiscard]] bool canDeleteMessages() const;
  93. [[nodiscard]] bool canAddMembers() const;
  94. [[nodiscard]] bool canAddAdmins() const;
  95. [[nodiscard]] bool canBanMembers() const;
  96. [[nodiscard]] bool anyoneCanAddMembers() const;
  97. void applyEditAdmin(not_null<UserData*> user, bool isAdmin);
  98. void setInviteLink(const QString &newInviteLink);
  99. [[nodiscard]] QString inviteLink() const {
  100. return _inviteLink;
  101. }
  102. [[nodiscard]] bool canHaveInviteLink() const;
  103. void refreshBotStatus();
  104. enum class UpdateStatus {
  105. Good,
  106. TooOld,
  107. Skipped,
  108. };
  109. int version() const {
  110. return _version;
  111. }
  112. void setVersion(int version) {
  113. _version = version;
  114. }
  115. UpdateStatus applyUpdateVersion(int version);
  116. ChannelData *getMigrateToChannel() const;
  117. void setMigrateToChannel(ChannelData *channel);
  118. [[nodiscard]] Data::GroupCall *groupCall() const {
  119. return _call.get();
  120. }
  121. void setGroupCall(
  122. const MTPInputGroupCall &call,
  123. TimeId scheduleDate = 0,
  124. bool rtmp = false);
  125. void clearGroupCall();
  126. void setGroupCallDefaultJoinAs(PeerId peerId);
  127. [[nodiscard]] PeerId groupCallDefaultJoinAs() const;
  128. void setBotCommands(const std::vector<Data::BotCommands> &commands);
  129. [[nodiscard]] const Data::ChatBotCommands &botCommands() const {
  130. return _botCommands;
  131. }
  132. [[nodiscard]] int pendingRequestsCount() const {
  133. return _pendingRequestsCount;
  134. }
  135. [[nodiscard]] const std::vector<UserId> &recentRequesters() const {
  136. return _recentRequesters;
  137. }
  138. void setPendingRequestsCount(
  139. int count,
  140. const QVector<MTPlong> &recentRequesters);
  141. void setPendingRequestsCount(
  142. int count,
  143. std::vector<UserId> recentRequesters);
  144. void setAllowedReactions(Data::AllowedReactions value);
  145. [[nodiscard]] const Data::AllowedReactions &allowedReactions() const;
  146. // Still public data members.
  147. const MTPlong inputChat;
  148. int count = 0;
  149. TimeId date = 0;
  150. UserId creator = 0;
  151. base::flat_set<not_null<UserData*>> participants;
  152. base::flat_set<not_null<UserData*>> invitedByMe;
  153. base::flat_set<not_null<UserData*>> admins;
  154. std::deque<not_null<UserData*>> lastAuthors;
  155. base::flat_set<not_null<PeerData*>> markupSenders;
  156. int botStatus = 0; // -1 - no bots, 0 - unknown, 1 - one bot, that sees all history, 2 - other
  157. private:
  158. Flags _flags;
  159. QString _inviteLink;
  160. Data::Flags<ChatRestrictions> _defaultRestrictions;
  161. Data::Flags<ChatAdminRights> _adminRights;
  162. int _version = 0;
  163. int _pendingRequestsCount = 0;
  164. std::vector<UserId> _recentRequesters;
  165. Data::AllowedReactions _allowedReactions;
  166. std::unique_ptr<Data::GroupCall> _call;
  167. PeerId _callDefaultJoinAs = 0;
  168. Data::ChatBotCommands _botCommands;
  169. ChannelData *_migratedTo = nullptr;
  170. rpl::lifetime _lifetime;
  171. };
  172. namespace Data {
  173. void ApplyChatUpdate(
  174. not_null<ChatData*> chat,
  175. const MTPDupdateChatParticipants &update);
  176. void ApplyChatUpdate(
  177. not_null<ChatData*> chat,
  178. const MTPDupdateChatParticipantAdd &update);
  179. void ApplyChatUpdate(
  180. not_null<ChatData*> chat,
  181. const MTPDupdateChatParticipantDelete &update);
  182. void ApplyChatUpdate(
  183. not_null<ChatData*> chat,
  184. const MTPDupdateChatParticipantAdmin &update);
  185. void ApplyChatUpdate(
  186. not_null<ChatData*> chat,
  187. const MTPDupdateChatDefaultBannedRights &update);
  188. void ApplyChatUpdate(
  189. not_null<ChatData*> chat,
  190. const MTPDchatFull &update);
  191. void ApplyChatUpdate(
  192. not_null<ChatData*> chat,
  193. const MTPChatParticipants &update);
  194. } // namespace Data