data_session.h 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158
  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 "storage/storage_databases.h"
  9. #include "dialogs/dialogs_main_list.h"
  10. #include "data/data_groups.h"
  11. #include "data/data_cloud_file.h"
  12. #include "data/data_star_gift.h"
  13. #include "history/history_location_manager.h"
  14. #include "base/timer.h"
  15. class Image;
  16. class HistoryItem;
  17. struct WebPageCollage;
  18. struct WebPageStickerSet;
  19. enum class WebPageType : uint8;
  20. enum class NewMessageType;
  21. namespace HistoryView {
  22. struct Group;
  23. class Element;
  24. class ElementDelegate;
  25. } // namespace HistoryView
  26. namespace Main {
  27. class Session;
  28. } // namespace Main
  29. namespace Ui {
  30. class BoxContent;
  31. } // namespace Ui
  32. namespace Passport {
  33. struct SavedCredentials;
  34. } // namespace Passport
  35. namespace Iv {
  36. class Data;
  37. } // namespace Iv
  38. namespace Data {
  39. class Folder;
  40. class LocationPoint;
  41. class WallPaper;
  42. class ShortcutMessages;
  43. class SendActionManager;
  44. class Reactions;
  45. class EmojiStatuses;
  46. class ForumIcons;
  47. class ChatFilters;
  48. class CloudThemes;
  49. class Streaming;
  50. class MediaRotation;
  51. class Histories;
  52. class DocumentMedia;
  53. class PhotoMedia;
  54. class Stickers;
  55. class GroupCall;
  56. class NotifySettings;
  57. class CustomEmojiManager;
  58. class Stories;
  59. class SavedMessages;
  60. class Chatbots;
  61. class BusinessInfo;
  62. struct ReactionId;
  63. struct UnavailableReason;
  64. struct CreditsStatusSlice;
  65. struct UniqueGift;
  66. struct RepliesReadTillUpdate {
  67. FullMsgId id;
  68. MsgId readTillId;
  69. bool out = false;
  70. };
  71. struct GiftUpdate {
  72. enum class Action : uchar {
  73. Save,
  74. Unsave,
  75. Convert,
  76. Transfer,
  77. Delete,
  78. Pin,
  79. Unpin,
  80. };
  81. Data::SavedStarGiftId id;
  82. Action action = {};
  83. };
  84. struct SentToScheduled {
  85. not_null<History*> history;
  86. MsgId scheduledId = 0;
  87. };
  88. struct SentFromScheduled {
  89. not_null<HistoryItem*> item;
  90. MsgId sentId = 0;
  91. };
  92. class Session final {
  93. public:
  94. using ViewElement = HistoryView::Element;
  95. struct SentData {
  96. PeerId peerId = 0;
  97. QString text;
  98. };
  99. explicit Session(not_null<Main::Session*> session);
  100. ~Session();
  101. [[nodiscard]] Main::Session &session() const {
  102. return *_session;
  103. }
  104. [[nodiscard]] Groups &groups() {
  105. return _groups;
  106. }
  107. [[nodiscard]] const Groups &groups() const {
  108. return _groups;
  109. }
  110. [[nodiscard]] ChatFilters &chatsFilters() const {
  111. return *_chatsFilters;
  112. }
  113. [[nodiscard]] ShortcutMessages &shortcutMessages() const {
  114. return *_shortcutMessages;
  115. }
  116. [[nodiscard]] SendActionManager &sendActionManager() const {
  117. return *_sendActionManager;
  118. }
  119. [[nodiscard]] CloudThemes &cloudThemes() const {
  120. return *_cloudThemes;
  121. }
  122. [[nodiscard]] Streaming &streaming() const {
  123. return *_streaming;
  124. }
  125. [[nodiscard]] MediaRotation &mediaRotation() const {
  126. return *_mediaRotation;
  127. }
  128. [[nodiscard]] Histories &histories() const {
  129. return *_histories;
  130. }
  131. [[nodiscard]] Stickers &stickers() const {
  132. return *_stickers;
  133. }
  134. [[nodiscard]] Reactions &reactions() const {
  135. return *_reactions;
  136. }
  137. [[nodiscard]] EmojiStatuses &emojiStatuses() const {
  138. return *_emojiStatuses;
  139. }
  140. [[nodiscard]] ForumIcons &forumIcons() const {
  141. return *_forumIcons;
  142. }
  143. [[nodiscard]] NotifySettings &notifySettings() const {
  144. return *_notifySettings;
  145. }
  146. [[nodiscard]] CustomEmojiManager &customEmojiManager() const {
  147. return *_customEmojiManager;
  148. }
  149. [[nodiscard]] Stories &stories() const {
  150. return *_stories;
  151. }
  152. [[nodiscard]] SavedMessages &savedMessages() const {
  153. return *_savedMessages;
  154. }
  155. [[nodiscard]] Chatbots &chatbots() const {
  156. return *_chatbots;
  157. }
  158. [[nodiscard]] BusinessInfo &businessInfo() const {
  159. return *_businessInfo;
  160. }
  161. [[nodiscard]] MsgId nextNonHistoryEntryId() {
  162. return ++_nonHistoryEntryId;
  163. }
  164. void subscribeForTopicRepliesLists();
  165. void clear();
  166. void keepAlive(std::shared_ptr<PhotoMedia> media);
  167. void keepAlive(std::shared_ptr<DocumentMedia> media);
  168. void suggestStartExport(TimeId availableAt);
  169. void clearExportSuggestion();
  170. [[nodiscard]] auto passportCredentials() const
  171. -> const Passport::SavedCredentials*;
  172. void rememberPassportCredentials(
  173. Passport::SavedCredentials data,
  174. crl::time rememberFor);
  175. void forgetPassportCredentials();
  176. [[nodiscard]] Storage::Cache::Database &cache();
  177. [[nodiscard]] Storage::Cache::Database &cacheBigFile();
  178. [[nodiscard]] not_null<PeerData*> peer(PeerId id);
  179. [[nodiscard]] not_null<PeerData*> peer(UserId id) = delete;
  180. [[nodiscard]] not_null<UserData*> user(UserId id);
  181. [[nodiscard]] not_null<ChatData*> chat(ChatId id);
  182. [[nodiscard]] not_null<ChannelData*> channel(ChannelId id);
  183. [[nodiscard]] not_null<UserData*> user(PeerId id) = delete;
  184. [[nodiscard]] not_null<ChatData*> chat(PeerId id) = delete;
  185. [[nodiscard]] not_null<ChannelData*> channel(PeerId id) = delete;
  186. [[nodiscard]] PeerData *peerLoaded(PeerId id) const;
  187. [[nodiscard]] PeerData *peerLoaded(UserId id) const = delete;
  188. [[nodiscard]] UserData *userLoaded(UserId id) const;
  189. [[nodiscard]] ChatData *chatLoaded(ChatId id) const;
  190. [[nodiscard]] ChannelData *channelLoaded(ChannelId id) const;
  191. [[nodiscard]] UserData *userLoaded(PeerId id) const = delete;
  192. [[nodiscard]] ChatData *chatLoaded(PeerId id) const = delete;
  193. [[nodiscard]] ChannelData *channelLoaded(PeerId id) const = delete;
  194. not_null<UserData*> processUser(const MTPUser &data);
  195. not_null<PeerData*> processChat(const MTPChat &data);
  196. // Returns last user, if there were any.
  197. UserData *processUsers(const MTPVector<MTPUser> &data);
  198. PeerData *processChats(const MTPVector<MTPChat> &data);
  199. void applyMaximumChatVersions(const MTPVector<MTPChat> &data);
  200. void registerGroupCall(not_null<GroupCall*> call);
  201. void unregisterGroupCall(not_null<GroupCall*> call);
  202. GroupCall *groupCall(CallId callId) const;
  203. void watchForOffline(not_null<UserData*> user, TimeId now = 0);
  204. void maybeStopWatchForOffline(not_null<UserData*> user);
  205. [[nodiscard]] auto invitedToCallUsers(CallId callId) const
  206. -> const base::flat_set<not_null<UserData*>> &;
  207. void registerInvitedToCallUser(
  208. CallId callId,
  209. not_null<PeerData*> peer,
  210. not_null<UserData*> user);
  211. void unregisterInvitedToCallUser(CallId callId, not_null<UserData*> user);
  212. struct InviteToCall {
  213. CallId id = 0;
  214. not_null<UserData*> user;
  215. };
  216. [[nodiscard]] rpl::producer<InviteToCall> invitesToCalls() const {
  217. return _invitesToCalls.events();
  218. }
  219. void enumerateUsers(Fn<void(not_null<UserData*>)> action) const;
  220. void enumerateGroups(Fn<void(not_null<PeerData*>)> action) const;
  221. void enumerateBroadcasts(Fn<void(not_null<ChannelData*>)> action) const;
  222. [[nodiscard]] UserData *userByPhone(const QString &phone) const;
  223. [[nodiscard]] PeerData *peerByUsername(const QString &username) const;
  224. [[nodiscard]] not_null<History*> history(PeerId peerId);
  225. [[nodiscard]] History *historyLoaded(PeerId peerId) const;
  226. [[nodiscard]] not_null<History*> history(UserId userId) = delete;
  227. [[nodiscard]] History *historyLoaded(UserId userId) const = delete;
  228. [[nodiscard]] not_null<History*> history(not_null<const PeerData*> peer);
  229. [[nodiscard]] History *historyLoaded(const PeerData *peer);
  230. void deleteConversationLocally(not_null<PeerData*> peer);
  231. [[nodiscard]] rpl::variable<bool> &contactsLoaded() {
  232. return _contactsLoaded;
  233. }
  234. [[nodiscard]] rpl::producer<Folder*> chatsListChanges() const {
  235. return _chatsListChanged.events();
  236. }
  237. [[nodiscard]] bool chatsListLoaded(Folder *folder = nullptr);
  238. [[nodiscard]] rpl::producer<Folder*> chatsListLoadedEvents() const {
  239. return _chatsListLoadedEvents.events();
  240. }
  241. void chatsListChanged(FolderId folderId);
  242. void chatsListChanged(Folder *folder);
  243. void chatsListDone(Folder *folder);
  244. void userIsBotChanged(not_null<UserData*> user);
  245. [[nodiscard]] rpl::producer<not_null<UserData*>> userIsBotChanges() const;
  246. void botCommandsChanged(not_null<PeerData*> peer);
  247. [[nodiscard]] rpl::producer<not_null<PeerData*>> botCommandsChanges() const;
  248. struct ItemVisibilityQuery {
  249. not_null<HistoryItem*> item;
  250. not_null<bool*> isVisible;
  251. };
  252. [[nodiscard]] bool queryItemVisibility(not_null<HistoryItem*> item) const;
  253. [[nodiscard]] bool queryDocumentVisibility(not_null<DocumentData*> document) const;
  254. [[nodiscard]] rpl::producer<ItemVisibilityQuery> itemVisibilityQueries() const;
  255. void itemVisibilitiesUpdated();
  256. struct IdChange {
  257. FullMsgId newId;
  258. MsgId oldId = 0;
  259. };
  260. void notifyItemIdChange(IdChange event);
  261. [[nodiscard]] rpl::producer<IdChange> itemIdChanged() const;
  262. void notifyItemLayoutChange(not_null<const HistoryItem*> item);
  263. [[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemLayoutChanged() const;
  264. void notifyViewLayoutChange(not_null<const ViewElement*> view);
  265. [[nodiscard]] rpl::producer<not_null<const ViewElement*>> viewLayoutChanged() const;
  266. void notifyNewItemAdded(not_null<HistoryItem*> item);
  267. [[nodiscard]] rpl::producer<not_null<HistoryItem*>> newItemAdded() const;
  268. void notifyGiftUpdate(GiftUpdate &&update);
  269. [[nodiscard]] rpl::producer<GiftUpdate> giftUpdates() const;
  270. void requestItemRepaint(not_null<const HistoryItem*> item);
  271. [[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemRepaintRequest() const;
  272. void requestViewRepaint(not_null<const ViewElement*> view);
  273. [[nodiscard]] rpl::producer<not_null<const ViewElement*>> viewRepaintRequest() const;
  274. void requestItemResize(not_null<const HistoryItem*> item);
  275. [[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemResizeRequest() const;
  276. void requestViewResize(not_null<ViewElement*> view);
  277. [[nodiscard]] rpl::producer<not_null<ViewElement*>> viewResizeRequest() const;
  278. void requestItemViewRefresh(not_null<const HistoryItem*> item);
  279. [[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemViewRefreshRequest() const;
  280. void requestItemTextRefresh(not_null<HistoryItem*> item);
  281. void requestUnreadReactionsAnimation(not_null<HistoryItem*> item);
  282. void notifyHistoryUnloaded(not_null<const History*> history);
  283. [[nodiscard]] rpl::producer<not_null<const History*>> historyUnloaded() const;
  284. void notifyItemDataChange(not_null<HistoryItem*> item);
  285. [[nodiscard]] rpl::producer<not_null<HistoryItem*>> itemDataChanges() const;
  286. [[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemRemoved() const;
  287. [[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemRemoved(
  288. FullMsgId itemId) const;
  289. void notifyViewRemoved(not_null<const ViewElement*> view);
  290. [[nodiscard]] rpl::producer<not_null<const ViewElement*>> viewRemoved() const;
  291. void notifyHistoryCleared(not_null<const History*> history);
  292. [[nodiscard]] rpl::producer<not_null<const History*>> historyCleared() const;
  293. void notifyHistoryChangeDelayed(not_null<History*> history);
  294. [[nodiscard]] rpl::producer<not_null<History*>> historyChanged() const;
  295. void notifyViewPaidReactionSent(not_null<const ViewElement*> view);
  296. [[nodiscard]] rpl::producer<not_null<const ViewElement*>> viewPaidReactionSent() const;
  297. void sendHistoryChangeNotifications();
  298. void notifyPinnedDialogsOrderUpdated();
  299. [[nodiscard]] rpl::producer<> pinnedDialogsOrderUpdated() const;
  300. using CreditsSubsRebuilder = rpl::event_stream<CreditsStatusSlice>;
  301. using CreditsSubsRebuilderPtr = std::shared_ptr<CreditsSubsRebuilder>;
  302. [[nodiscard]] CreditsSubsRebuilderPtr createCreditsSubsRebuilder();
  303. [[nodiscard]] CreditsSubsRebuilderPtr activeCreditsSubsRebuilder() const;
  304. void registerRestricted(
  305. not_null<const HistoryItem*> item,
  306. const QString &reason);
  307. void registerRestricted(
  308. not_null<const HistoryItem*> item,
  309. const std::vector<UnavailableReason> &reasons);
  310. void registerHighlightProcess(
  311. uint64 processId,
  312. not_null<HistoryItem*> item);
  313. void registerHeavyViewPart(not_null<ViewElement*> view);
  314. void unregisterHeavyViewPart(not_null<ViewElement*> view);
  315. void unloadHeavyViewParts(
  316. not_null<HistoryView::ElementDelegate*> delegate);
  317. void unloadHeavyViewParts(
  318. not_null<HistoryView::ElementDelegate*> delegate,
  319. int from,
  320. int till);
  321. void registerShownSpoiler(not_null<ViewElement*> view);
  322. void hideShownSpoilers();
  323. using MegagroupParticipant = std::tuple<
  324. not_null<ChannelData*>,
  325. not_null<UserData*>>;
  326. void removeMegagroupParticipant(
  327. not_null<ChannelData*> channel,
  328. not_null<UserData*> user);
  329. [[nodiscard]] rpl::producer<MegagroupParticipant> megagroupParticipantRemoved() const;
  330. [[nodiscard]] rpl::producer<not_null<UserData*>> megagroupParticipantRemoved(
  331. not_null<ChannelData*> channel) const;
  332. void addNewMegagroupParticipant(
  333. not_null<ChannelData*> channel,
  334. not_null<UserData*> user);
  335. [[nodiscard]] rpl::producer<MegagroupParticipant> megagroupParticipantAdded() const;
  336. [[nodiscard]] rpl::producer<not_null<UserData*>> megagroupParticipantAdded(
  337. not_null<ChannelData*> channel) const;
  338. HistoryItemsList idsToItems(const MessageIdsList &ids) const;
  339. MessageIdsList itemsToIds(const HistoryItemsList &items) const;
  340. MessageIdsList itemOrItsGroup(not_null<HistoryItem*> item) const;
  341. void applyUpdate(const MTPDupdateMessagePoll &update);
  342. void applyUpdate(const MTPDupdateChatParticipants &update);
  343. void applyUpdate(const MTPDupdateChatParticipantAdd &update);
  344. void applyUpdate(const MTPDupdateChatParticipantDelete &update);
  345. void applyUpdate(const MTPDupdateChatParticipantAdmin &update);
  346. void applyUpdate(const MTPDupdateChatDefaultBannedRights &update);
  347. void applyDialogs(
  348. Folder *requestFolder,
  349. const QVector<MTPMessage> &messages,
  350. const QVector<MTPDialog> &dialogs,
  351. std::optional<int> count = std::nullopt);
  352. [[nodiscard]] bool pinnedCanPin(not_null<Dialogs::Entry*> entry) const;
  353. [[nodiscard]] bool pinnedCanPin(
  354. FilterId filterId,
  355. not_null<History*> history) const;
  356. [[nodiscard]] int pinnedChatsLimit(Folder *folder) const;
  357. [[nodiscard]] int pinnedChatsLimit(FilterId filterId) const;
  358. [[nodiscard]] int pinnedChatsLimit(not_null<Forum*> forum) const;
  359. [[nodiscard]] int pinnedChatsLimit(
  360. not_null<SavedMessages*> saved) const;
  361. [[nodiscard]] rpl::producer<int> maxPinnedChatsLimitValue(
  362. Folder *folder) const;
  363. [[nodiscard]] rpl::producer<int> maxPinnedChatsLimitValue(
  364. FilterId filterId) const;
  365. [[nodiscard]] rpl::producer<int> maxPinnedChatsLimitValue(
  366. not_null<Forum*> forum) const;
  367. [[nodiscard]] rpl::producer<int> maxPinnedChatsLimitValue(
  368. not_null<SavedMessages*> saved) const;
  369. [[nodiscard]] int groupFreeTranscribeLevel() const;
  370. [[nodiscard]] const std::vector<Dialogs::Key> &pinnedChatsOrder(
  371. Folder *folder) const;
  372. [[nodiscard]] const std::vector<Dialogs::Key> &pinnedChatsOrder(
  373. not_null<Forum*> forum) const;
  374. [[nodiscard]] const std::vector<Dialogs::Key> &pinnedChatsOrder(
  375. FilterId filterId) const;
  376. [[nodiscard]] const std::vector<Dialogs::Key> &pinnedChatsOrder(
  377. not_null<SavedMessages*> saved) const;
  378. void setChatPinned(Dialogs::Key key, FilterId filterId, bool pinned);
  379. void setPinnedFromEntryList(Dialogs::Key key, bool pinned);
  380. void clearPinnedChats(Folder *folder);
  381. void applyPinnedChats(
  382. Folder *folder,
  383. const QVector<MTPDialogPeer> &list);
  384. void applyPinnedTopics(
  385. not_null<Forum*> forum,
  386. const QVector<MTPint> &list);
  387. void reorderTwoPinnedChats(
  388. FilterId filterId,
  389. Dialogs::Key key1,
  390. Dialogs::Key key2);
  391. void setSuggestToGigagroup(not_null<ChannelData*> group, bool suggest);
  392. [[nodiscard]] bool suggestToGigagroup(
  393. not_null<ChannelData*> group) const;
  394. void registerMessage(not_null<HistoryItem*> item);
  395. void unregisterMessage(not_null<HistoryItem*> item);
  396. void registerMessageTTL(TimeId when, not_null<HistoryItem*> item);
  397. void unregisterMessageTTL(TimeId when, not_null<HistoryItem*> item);
  398. // Returns true if item found and it is not detached.
  399. bool updateExistingMessage(const MTPDmessage &data);
  400. void updateEditedMessage(const MTPMessage &data);
  401. void processMessages(
  402. const QVector<MTPMessage> &data,
  403. NewMessageType type);
  404. void processMessages(
  405. const MTPVector<MTPMessage> &data,
  406. NewMessageType type);
  407. void processExistingMessages(
  408. ChannelData *channel,
  409. const MTPmessages_Messages &data);
  410. void processNonChannelMessagesDeleted(const QVector<MTPint> &data);
  411. void processMessagesDeleted(
  412. PeerId peerId,
  413. const QVector<MTPint> &data);
  414. [[nodiscard]] MsgId nextLocalMessageId();
  415. [[nodiscard]] HistoryItem *message(
  416. PeerId peerId,
  417. MsgId itemId) const;
  418. [[nodiscard]] HistoryItem *message(
  419. not_null<const PeerData*> peer,
  420. MsgId itemId) const;
  421. [[nodiscard]] HistoryItem *message(FullMsgId itemId) const;
  422. [[nodiscard]] HistoryItem *nonChannelMessage(MsgId itemId) const;
  423. void updateDependentMessages(not_null<HistoryItem*> item);
  424. void registerDependentMessage(
  425. not_null<HistoryItem*> dependent,
  426. not_null<HistoryItem*> dependency);
  427. void unregisterDependentMessage(
  428. not_null<HistoryItem*> dependent,
  429. not_null<HistoryItem*> dependency);
  430. void destroyAllCallItems();
  431. void registerMessageRandomId(uint64 randomId, FullMsgId itemId);
  432. void unregisterMessageRandomId(uint64 randomId);
  433. [[nodiscard]] FullMsgId messageIdByRandomId(uint64 randomId) const;
  434. void registerMessageSentData(
  435. uint64 randomId,
  436. PeerId peerId,
  437. const QString &text);
  438. void unregisterMessageSentData(uint64 randomId);
  439. [[nodiscard]] SentData messageSentData(uint64 randomId) const;
  440. void photoLoadSettingsChanged();
  441. void documentLoadSettingsChanged();
  442. void notifyPhotoLayoutChanged(not_null<const PhotoData*> photo);
  443. void requestPhotoViewRepaint(not_null<const PhotoData*> photo);
  444. void notifyDocumentLayoutChanged(
  445. not_null<const DocumentData*> document);
  446. void requestDocumentViewRepaint(not_null<const DocumentData*> document);
  447. void markMediaRead(not_null<const DocumentData*> document);
  448. void requestPollViewRepaint(not_null<const PollData*> poll);
  449. void photoLoadProgress(not_null<PhotoData*> photo);
  450. void photoLoadDone(not_null<PhotoData*> photo);
  451. void photoLoadFail(not_null<PhotoData*> photo, bool started);
  452. void documentLoadProgress(not_null<DocumentData*> document);
  453. void documentLoadDone(not_null<DocumentData*> document);
  454. void documentLoadFail(not_null<DocumentData*> document, bool started);
  455. [[nodiscard]] auto documentLoadProgress() const
  456. -> rpl::producer<not_null<DocumentData*>> {
  457. return _documentLoadProgress.events();
  458. }
  459. HistoryItem *addNewMessage(
  460. const MTPMessage &data,
  461. MessageFlags localFlags,
  462. NewMessageType type);
  463. HistoryItem *addNewMessage( // Override message id.
  464. MsgId id,
  465. const MTPMessage &data,
  466. MessageFlags localFlags,
  467. NewMessageType type);
  468. [[nodiscard]] int unreadBadge() const;
  469. [[nodiscard]] bool unreadBadgeMuted() const;
  470. [[nodiscard]] int unreadBadgeIgnoreOne(Dialogs::Key key) const;
  471. [[nodiscard]] bool unreadBadgeMutedIgnoreOne(Dialogs::Key key) const;
  472. [[nodiscard]] int unreadOnlyMutedBadge() const;
  473. [[nodiscard]] rpl::producer<> unreadBadgeChanges() const;
  474. void notifyUnreadBadgeChanged();
  475. void updateRepliesReadTill(RepliesReadTillUpdate update);
  476. [[nodiscard]] auto repliesReadTillUpdates() const
  477. -> rpl::producer<RepliesReadTillUpdate>;
  478. void selfDestructIn(not_null<HistoryItem*> item, crl::time delay);
  479. [[nodiscard]] not_null<PhotoData*> photo(PhotoId id);
  480. not_null<PhotoData*> processPhoto(const MTPPhoto &data);
  481. not_null<PhotoData*> processPhoto(const MTPDphoto &data);
  482. not_null<PhotoData*> processPhoto(
  483. const MTPPhoto &data,
  484. const PreparedPhotoThumbs &thumbs);
  485. [[nodiscard]] not_null<PhotoData*> photo(
  486. PhotoId id,
  487. const uint64 &access,
  488. const QByteArray &fileReference,
  489. TimeId date,
  490. int32 dc,
  491. bool hasStickers,
  492. const QByteArray &inlineThumbnailBytes,
  493. const ImageWithLocation &small,
  494. const ImageWithLocation &thumbnail,
  495. const ImageWithLocation &large,
  496. const ImageWithLocation &videoSmall,
  497. const ImageWithLocation &videoLarge,
  498. crl::time videoStartTime);
  499. void photoConvert(
  500. not_null<PhotoData*> original,
  501. const MTPPhoto &data);
  502. [[nodiscard]] PhotoData *photoFromWeb(
  503. const MTPWebDocument &data,
  504. const ImageLocation &thumbnailLocation);
  505. [[nodiscard]] not_null<DocumentData*> document(DocumentId id);
  506. not_null<DocumentData*> processDocument(
  507. const MTPDocument &data,
  508. const MTPVector<MTPDocument> *qualities = nullptr);
  509. not_null<DocumentData*> processDocument(
  510. const MTPDdocument &data,
  511. const MTPVector<MTPDocument> *qualities = nullptr);
  512. not_null<DocumentData*> processDocument(
  513. const MTPdocument &data,
  514. const ImageWithLocation &thumbnail);
  515. [[nodiscard]] not_null<DocumentData*> document(
  516. DocumentId id,
  517. const uint64 &access,
  518. const QByteArray &fileReference,
  519. TimeId date,
  520. const QVector<MTPDocumentAttribute> &attributes,
  521. const QString &mime,
  522. const InlineImageLocation &inlineThumbnail,
  523. const ImageWithLocation &thumbnail,
  524. const ImageWithLocation &videoThumbnail,
  525. bool isPremiumSticker,
  526. int32 dc,
  527. int64 size);
  528. void documentConvert(
  529. not_null<DocumentData*> original,
  530. const MTPDocument &data);
  531. [[nodiscard]] DocumentData *documentFromWeb(
  532. const MTPWebDocument &data,
  533. const ImageLocation &thumbnailLocation,
  534. const ImageLocation &videoThumbnailLocation);
  535. [[nodiscard]] not_null<DocumentData*> venueIconDocument(
  536. const QString &icon);
  537. [[nodiscard]] not_null<WebPageData*> webpage(WebPageId id);
  538. not_null<WebPageData*> processWebpage(const MTPWebPage &data);
  539. not_null<WebPageData*> processWebpage(const MTPDwebPage &data);
  540. not_null<WebPageData*> processWebpage(const MTPDwebPagePending &data);
  541. [[nodiscard]] not_null<WebPageData*> webpage(
  542. WebPageId id,
  543. const QString &siteName,
  544. const TextWithEntities &content);
  545. [[nodiscard]] not_null<WebPageData*> webpage(
  546. WebPageId id,
  547. WebPageType type,
  548. const QString &url,
  549. const QString &displayUrl,
  550. const QString &siteName,
  551. const QString &title,
  552. const TextWithEntities &description,
  553. PhotoData *photo,
  554. DocumentData *document,
  555. WebPageCollage &&collage,
  556. std::unique_ptr<Iv::Data> iv,
  557. std::unique_ptr<WebPageStickerSet> stickerSet,
  558. std::shared_ptr<UniqueGift> uniqueGift,
  559. int duration,
  560. const QString &author,
  561. bool hasLargeMedia,
  562. bool photoIsVideoCover,
  563. TimeId pendingTill);
  564. [[nodiscard]] not_null<GameData*> game(GameId id);
  565. not_null<GameData*> processGame(const MTPDgame &data);
  566. [[nodiscard]] not_null<GameData*> game(
  567. GameId id,
  568. const uint64 &accessHash,
  569. const QString &shortName,
  570. const QString &title,
  571. const QString &description,
  572. PhotoData *photo,
  573. DocumentData *document);
  574. void gameConvert(
  575. not_null<GameData*> original,
  576. const MTPGame &data);
  577. [[nodiscard]] not_null<BotAppData*> botApp(BotAppId id);
  578. BotAppData *findBotApp(PeerId botId, const QString &appName) const;
  579. BotAppData *processBotApp(
  580. PeerId botId,
  581. const MTPBotApp &data);
  582. [[nodiscard]] not_null<PollData*> poll(PollId id);
  583. not_null<PollData*> processPoll(const MTPPoll &data);
  584. not_null<PollData*> processPoll(const MTPDmessageMediaPoll &data);
  585. [[nodiscard]] not_null<CloudImage*> location(
  586. const LocationPoint &point);
  587. void registerPhotoItem(
  588. not_null<const PhotoData*> photo,
  589. not_null<HistoryItem*> item);
  590. void unregisterPhotoItem(
  591. not_null<const PhotoData*> photo,
  592. not_null<HistoryItem*> item);
  593. void registerDocumentItem(
  594. not_null<const DocumentData*> document,
  595. not_null<HistoryItem*> item);
  596. void unregisterDocumentItem(
  597. not_null<const DocumentData*> document,
  598. not_null<HistoryItem*> item);
  599. void registerWebPageView(
  600. not_null<const WebPageData*> page,
  601. not_null<ViewElement*> view);
  602. void unregisterWebPageView(
  603. not_null<const WebPageData*> page,
  604. not_null<ViewElement*> view);
  605. void registerWebPageItem(
  606. not_null<const WebPageData*> page,
  607. not_null<HistoryItem*> item);
  608. void unregisterWebPageItem(
  609. not_null<const WebPageData*> page,
  610. not_null<HistoryItem*> item);
  611. void registerGameView(
  612. not_null<const GameData*> game,
  613. not_null<ViewElement*> view);
  614. void unregisterGameView(
  615. not_null<const GameData*> game,
  616. not_null<ViewElement*> view);
  617. void registerPollView(
  618. not_null<const PollData*> poll,
  619. not_null<ViewElement*> view);
  620. void unregisterPollView(
  621. not_null<const PollData*> poll,
  622. not_null<ViewElement*> view);
  623. void registerContactView(
  624. UserId contactId,
  625. not_null<ViewElement*> view);
  626. void unregisterContactView(
  627. UserId contactId,
  628. not_null<ViewElement*> view);
  629. void registerContactItem(
  630. UserId contactId,
  631. not_null<HistoryItem*> item);
  632. void unregisterContactItem(
  633. UserId contactId,
  634. not_null<HistoryItem*> item);
  635. void registerCallItem(not_null<HistoryItem*> item);
  636. void unregisterCallItem(not_null<HistoryItem*> item);
  637. void registerStoryItem(FullStoryId id, not_null<HistoryItem*> item);
  638. void unregisterStoryItem(FullStoryId id, not_null<HistoryItem*> item);
  639. void refreshStoryItemViews(FullStoryId id);
  640. void documentMessageRemoved(not_null<DocumentData*> document);
  641. void checkPlayingAnimations();
  642. HistoryItem *findWebPageItem(not_null<WebPageData*> page) const;
  643. QString findContactPhone(not_null<UserData*> contact) const;
  644. QString findContactPhone(UserId contactId) const;
  645. void notifyWebPageUpdateDelayed(not_null<WebPageData*> page);
  646. void notifyGameUpdateDelayed(not_null<GameData*> game);
  647. void notifyPollUpdateDelayed(not_null<PollData*> poll);
  648. [[nodiscard]] bool hasPendingWebPageGamePollNotification() const;
  649. void sendWebPageGamePollNotifications();
  650. [[nodiscard]] rpl::producer<not_null<WebPageData*>> webPageUpdates() const;
  651. void channelDifferenceTooLong(not_null<ChannelData*> channel);
  652. [[nodiscard]] rpl::producer<not_null<ChannelData*>> channelDifferenceTooLong() const;
  653. void registerItemView(not_null<ViewElement*> view);
  654. void unregisterItemView(not_null<ViewElement*> view);
  655. [[nodiscard]] not_null<Folder*> folder(FolderId id);
  656. [[nodiscard]] Folder *folderLoaded(FolderId id) const;
  657. not_null<Folder*> processFolder(const MTPFolder &data);
  658. not_null<Folder*> processFolder(const MTPDfolder &data);
  659. [[nodiscard]] not_null<Dialogs::MainList*> chatsListFor(
  660. not_null<Dialogs::Entry*> entry);
  661. [[nodiscard]] not_null<Dialogs::MainList*> chatsList(
  662. Folder *folder = nullptr);
  663. [[nodiscard]] not_null<const Dialogs::MainList*> chatsList(
  664. Folder *folder = nullptr) const;
  665. [[nodiscard]] not_null<Dialogs::IndexedList*> contactsList();
  666. [[nodiscard]] not_null<Dialogs::IndexedList*> contactsNoChatsList();
  667. struct ChatListEntryRefresh {
  668. Dialogs::Key key;
  669. Dialogs::PositionChange moved;
  670. FilterId filterId = 0;
  671. bool existenceChanged = false;
  672. explicit operator bool() const {
  673. return existenceChanged || (moved.from != moved.to);
  674. }
  675. };
  676. void refreshChatListEntry(Dialogs::Key key);
  677. void removeChatListEntry(Dialogs::Key key);
  678. [[nodiscard]] auto chatListEntryRefreshes() const
  679. -> rpl::producer<ChatListEntryRefresh>;
  680. struct DialogsRowReplacement {
  681. not_null<Dialogs::Row*> old;
  682. Dialogs::Row *now = nullptr;
  683. };
  684. void dialogsRowReplaced(DialogsRowReplacement replacement);
  685. rpl::producer<DialogsRowReplacement> dialogsRowReplacements() const;
  686. void serviceNotification(
  687. const TextWithEntities &message,
  688. const MTPMessageMedia &media = MTP_messageMediaEmpty(),
  689. bool invertMedia = false);
  690. void setMimeForwardIds(MessageIdsList &&list);
  691. MessageIdsList takeMimeForwardIds();
  692. void setTopPromoted(
  693. History *promoted,
  694. const QString &type,
  695. const QString &message);
  696. bool updateWallpapers(const MTPaccount_WallPapers &data);
  697. void removeWallpaper(const WallPaper &paper);
  698. const std::vector<WallPaper> &wallpapers() const;
  699. uint64 wallpapersHash() const;
  700. struct WebViewResultSent {
  701. uint64 queryId = 0;
  702. };
  703. void webViewResultSent(WebViewResultSent &&sent);
  704. [[nodiscard]] rpl::producer<WebViewResultSent> webViewResultSent() const;
  705. void saveViewAsMessages(not_null<Forum*> forum, bool viewAsMessages);
  706. [[nodiscard]] auto peerDecorationsUpdated() const
  707. -> rpl::producer<not_null<PeerData*>>;
  708. void applyStatsDcId(not_null<PeerData*>, MTP::DcId);
  709. [[nodiscard]] MTP::DcId statsDcId(not_null<PeerData*>);
  710. void viewTagsChanged(
  711. not_null<ViewElement*> view,
  712. std::vector<ReactionId> &&was,
  713. std::vector<ReactionId> &&now);
  714. void sentToScheduled(SentToScheduled value);
  715. [[nodiscard]] rpl::producer<SentToScheduled> sentToScheduled() const;
  716. void sentFromScheduled(SentFromScheduled value);
  717. [[nodiscard]] rpl::producer<SentFromScheduled> sentFromScheduled() const;
  718. void clearLocalStorage();
  719. private:
  720. using Messages = std::unordered_map<MsgId, not_null<HistoryItem*>>;
  721. void suggestStartExport();
  722. void setupMigrationViewer();
  723. void setupChannelLeavingViewer();
  724. void setupPeerNameViewer();
  725. void setupUserIsContactViewer();
  726. void checkSelfDestructItems();
  727. void checkLocalUsersWentOffline();
  728. void scheduleNextTTLs();
  729. void checkTTLs();
  730. int computeUnreadBadge(const Dialogs::UnreadState &state) const;
  731. bool computeUnreadBadgeMuted(const Dialogs::UnreadState &state) const;
  732. void applyDialog(Folder *requestFolder, const MTPDdialog &data);
  733. void applyDialog(
  734. Folder *requestFolder,
  735. const MTPDdialogFolder &data);
  736. const Messages *messagesList(PeerId peerId) const;
  737. not_null<Messages*> messagesListForInsert(PeerId peerId);
  738. not_null<HistoryItem*> registerMessage(
  739. std::unique_ptr<HistoryItem> item);
  740. HistoryItem *changeMessageId(PeerId peerId, MsgId wasId, MsgId nowId);
  741. void removeDependencyMessage(not_null<HistoryItem*> item);
  742. void photoApplyFields(
  743. not_null<PhotoData*> photo,
  744. const MTPPhoto &data);
  745. void photoApplyFields(
  746. not_null<PhotoData*> photo,
  747. const MTPDphoto &data);
  748. void photoApplyFields(
  749. not_null<PhotoData*> photo,
  750. const uint64 &access,
  751. const QByteArray &fileReference,
  752. TimeId date,
  753. int32 dc,
  754. bool hasStickers,
  755. const QByteArray &inlineThumbnailBytes,
  756. const ImageWithLocation &small,
  757. const ImageWithLocation &thumbnail,
  758. const ImageWithLocation &large,
  759. const ImageWithLocation &videoSmall,
  760. const ImageWithLocation &videoLarge,
  761. crl::time videoStartTime);
  762. void documentApplyFields(
  763. not_null<DocumentData*> document,
  764. const MTPDocument &data);
  765. void documentApplyFields(
  766. not_null<DocumentData*> document,
  767. const MTPDdocument &data);
  768. void documentApplyFields(
  769. not_null<DocumentData*> document,
  770. const uint64 &access,
  771. const QByteArray &fileReference,
  772. TimeId date,
  773. const QVector<MTPDocumentAttribute> &attributes,
  774. const QString &mime,
  775. const InlineImageLocation &inlineThumbnail,
  776. const ImageWithLocation &thumbnail,
  777. const ImageWithLocation &videoThumbnail,
  778. bool isPremiumSticker,
  779. int32 dc,
  780. int64 size);
  781. DocumentData *documentFromWeb(
  782. const MTPDwebDocument &data,
  783. const ImageLocation &thumbnailLocation,
  784. const ImageLocation &videoThumbnailLocation);
  785. DocumentData *documentFromWeb(
  786. const MTPDwebDocumentNoProxy &data,
  787. const ImageLocation &thumbnailLocation,
  788. const ImageLocation &videoThumbnailLocation);
  789. void webpageApplyFields(
  790. not_null<WebPageData*> page,
  791. const MTPDwebPage &data);
  792. void webpageApplyFields(
  793. not_null<WebPageData*> page,
  794. WebPageType type,
  795. const QString &url,
  796. const QString &displayUrl,
  797. const QString &siteName,
  798. const QString &title,
  799. const TextWithEntities &description,
  800. FullStoryId storyId,
  801. PhotoData *photo,
  802. DocumentData *document,
  803. WebPageCollage &&collage,
  804. std::unique_ptr<Iv::Data> iv,
  805. std::unique_ptr<WebPageStickerSet> stickerSet,
  806. std::shared_ptr<UniqueGift> uniqueGift,
  807. int duration,
  808. const QString &author,
  809. bool hasLargeMedia,
  810. bool photoIsVideoCover,
  811. TimeId pendingTill);
  812. void gameApplyFields(
  813. not_null<GameData*> game,
  814. const MTPDgame &data);
  815. void gameApplyFields(
  816. not_null<GameData*> game,
  817. const uint64 &accessHash,
  818. const QString &shortName,
  819. const QString &title,
  820. const QString &description,
  821. PhotoData *photo,
  822. DocumentData *document);
  823. template <typename Method>
  824. void enumerateItemViews(
  825. not_null<const HistoryItem*> item,
  826. Method method);
  827. void insertCheckedServiceNotification(
  828. const TextWithEntities &message,
  829. const MTPMessageMedia &media,
  830. TimeId date,
  831. bool invertMedia);
  832. void setWallpapers(const QVector<MTPWallPaper> &data, uint64 hash);
  833. void highlightProcessDone(uint64 processId);
  834. void checkPollsClosings();
  835. const not_null<Main::Session*> _session;
  836. Storage::DatabasePointer _cache;
  837. Storage::DatabasePointer _bigFileCache;
  838. TimeId _exportAvailableAt = 0;
  839. QPointer<Ui::BoxContent> _exportSuggestion;
  840. rpl::variable<bool> _contactsLoaded = false;
  841. rpl::variable<int> _groupFreeTranscribeLevel;
  842. rpl::event_stream<Folder*> _chatsListLoadedEvents;
  843. rpl::event_stream<Folder*> _chatsListChanged;
  844. rpl::event_stream<not_null<UserData*>> _userIsBotChanges;
  845. rpl::event_stream<not_null<PeerData*>> _botCommandsChanges;
  846. rpl::event_stream<ItemVisibilityQuery> _itemVisibilityQueries;
  847. rpl::event_stream<IdChange> _itemIdChanges;
  848. rpl::event_stream<not_null<const HistoryItem*>> _itemLayoutChanges;
  849. rpl::event_stream<not_null<const ViewElement*>> _viewLayoutChanges;
  850. rpl::event_stream<not_null<HistoryItem*>> _newItemAdded;
  851. rpl::event_stream<GiftUpdate> _giftUpdates;
  852. rpl::event_stream<not_null<const HistoryItem*>> _itemRepaintRequest;
  853. rpl::event_stream<not_null<const ViewElement*>> _viewRepaintRequest;
  854. rpl::event_stream<not_null<const HistoryItem*>> _itemResizeRequest;
  855. rpl::event_stream<not_null<ViewElement*>> _viewResizeRequest;
  856. rpl::event_stream<not_null<const HistoryItem*>> _itemViewRefreshRequest;
  857. rpl::event_stream<not_null<HistoryItem*>> _itemTextRefreshRequest;
  858. rpl::event_stream<not_null<HistoryItem*>> _itemDataChanges;
  859. rpl::event_stream<not_null<const HistoryItem*>> _itemRemoved;
  860. rpl::event_stream<not_null<const ViewElement*>> _viewRemoved;
  861. rpl::event_stream<not_null<const ViewElement*>> _viewPaidReactionSent;
  862. rpl::event_stream<not_null<const History*>> _historyUnloaded;
  863. rpl::event_stream<not_null<const History*>> _historyCleared;
  864. base::flat_set<not_null<History*>> _historiesChanged;
  865. rpl::event_stream<not_null<History*>> _historyChanged;
  866. rpl::event_stream<MegagroupParticipant> _megagroupParticipantRemoved;
  867. rpl::event_stream<MegagroupParticipant> _megagroupParticipantAdded;
  868. rpl::event_stream<DialogsRowReplacement> _dialogsRowReplacements;
  869. rpl::event_stream<ChatListEntryRefresh> _chatListEntryRefreshes;
  870. rpl::event_stream<> _unreadBadgeChanges;
  871. rpl::event_stream<RepliesReadTillUpdate> _repliesReadTillUpdates;
  872. rpl::event_stream<SentToScheduled> _sentToScheduled;
  873. rpl::event_stream<SentFromScheduled> _sentFromScheduled;
  874. Dialogs::MainList _chatsList;
  875. Dialogs::IndexedList _contactsList;
  876. Dialogs::IndexedList _contactsNoChatsList;
  877. MsgId _localMessageIdCounter = StartClientMsgId;
  878. std::unordered_map<PeerId, Messages> _messages;
  879. std::map<
  880. not_null<HistoryItem*>,
  881. base::flat_set<not_null<HistoryItem*>>> _dependentMessages;
  882. std::map<TimeId, base::flat_set<not_null<HistoryItem*>>> _ttlMessages;
  883. base::Timer _ttlCheckTimer;
  884. std::unordered_map<MsgId, not_null<HistoryItem*>> _nonChannelMessages;
  885. base::flat_map<uint64, FullMsgId> _messageByRandomId;
  886. base::flat_map<uint64, SentData> _sentMessagesData;
  887. base::Timer _selfDestructTimer;
  888. std::vector<FullMsgId> _selfDestructItems;
  889. std::unordered_map<
  890. PhotoId,
  891. std::unique_ptr<PhotoData>> _photos;
  892. std::unordered_map<
  893. not_null<const PhotoData*>,
  894. base::flat_set<not_null<HistoryItem*>>> _photoItems;
  895. std::unordered_map<
  896. DocumentId,
  897. std::unique_ptr<DocumentData>> _documents;
  898. std::unordered_map<
  899. not_null<const DocumentData*>,
  900. base::flat_set<not_null<HistoryItem*>>> _documentItems;
  901. std::unordered_map<
  902. WebPageId,
  903. std::unique_ptr<WebPageData>> _webpages;
  904. std::unordered_map<
  905. not_null<const WebPageData*>,
  906. base::flat_set<not_null<HistoryItem*>>> _webpageItems;
  907. std::unordered_map<
  908. not_null<const WebPageData*>,
  909. base::flat_set<not_null<ViewElement*>>> _webpageViews;
  910. std::unordered_map<
  911. LocationPoint,
  912. std::unique_ptr<CloudImage>> _locations;
  913. std::unordered_map<
  914. PollId,
  915. std::unique_ptr<PollData>> _polls;
  916. std::unordered_map<
  917. GameId,
  918. std::unique_ptr<GameData>> _games;
  919. std::unordered_map<
  920. BotAppId,
  921. std::unique_ptr<BotAppData>> _botApps;
  922. std::unordered_map<
  923. not_null<const GameData*>,
  924. base::flat_set<not_null<ViewElement*>>> _gameViews;
  925. std::unordered_map<
  926. not_null<const PollData*>,
  927. base::flat_set<not_null<ViewElement*>>> _pollViews;
  928. std::unordered_map<
  929. UserId,
  930. base::flat_set<not_null<HistoryItem*>>> _contactItems;
  931. std::unordered_map<
  932. UserId,
  933. base::flat_set<not_null<ViewElement*>>> _contactViews;
  934. std::unordered_set<not_null<HistoryItem*>> _callItems;
  935. std::unordered_map<
  936. FullStoryId,
  937. base::flat_set<not_null<HistoryItem*>>> _storyItems;
  938. base::flat_map<uint64, not_null<HistoryItem*>> _highlightings;
  939. base::flat_map<QString, not_null<DocumentData*>> _venueIcons;
  940. base::flat_set<not_null<WebPageData*>> _webpagesUpdated;
  941. base::flat_set<not_null<GameData*>> _gamesUpdated;
  942. base::flat_set<not_null<PollData*>> _pollsUpdated;
  943. rpl::event_stream<not_null<WebPageData*>> _webpageUpdates;
  944. rpl::event_stream<not_null<ChannelData*>> _channelDifferenceTooLong;
  945. rpl::event_stream<not_null<DocumentData*>> _documentLoadProgress;
  946. base::flat_set<not_null<ChannelData*>> _suggestToGigagroup;
  947. base::flat_multi_map<TimeId, not_null<PollData*>> _pollsClosings;
  948. base::Timer _pollsClosingTimer;
  949. base::flat_map<
  950. not_null<const HistoryItem*>,
  951. base::flat_set<QString>> _possiblyRestricted;
  952. base::flat_map<FolderId, std::unique_ptr<Folder>> _folders;
  953. std::unordered_map<
  954. not_null<const HistoryItem*>,
  955. std::vector<not_null<ViewElement*>>> _views;
  956. rpl::event_stream<> _pinnedDialogsOrderUpdated;
  957. base::flat_set<not_null<ViewElement*>> _heavyViewParts;
  958. base::flat_map<uint64, not_null<GroupCall*>> _groupCalls;
  959. rpl::event_stream<InviteToCall> _invitesToCalls;
  960. base::flat_map<
  961. uint64,
  962. base::flat_set<not_null<UserData*>>> _invitedToCallUsers;
  963. base::flat_set<not_null<ViewElement*>> _shownSpoilers;
  964. base::flat_map<
  965. ReactionId,
  966. base::flat_set<not_null<ViewElement*>>> _viewsByTag;
  967. History *_topPromoted = nullptr;
  968. std::unordered_map<PeerId, std::unique_ptr<PeerData>> _peers;
  969. MessageIdsList _mimeForwardIds;
  970. std::weak_ptr<CreditsSubsRebuilder> _creditsSubsRebuilder;
  971. using CredentialsWithGeneration = std::pair<
  972. const Passport::SavedCredentials,
  973. int>;
  974. std::unique_ptr<CredentialsWithGeneration> _passportCredentials;
  975. std::vector<WallPaper> _wallpapers;
  976. uint64 _wallpapersHash = 0;
  977. base::flat_map<not_null<UserData*>, TimeId> _watchingForOffline;
  978. base::Timer _watchForOfflineTimer;
  979. base::flat_map<not_null<PeerData*>, MTP::DcId> _peerStatsDcIds;
  980. rpl::event_stream<WebViewResultSent> _webViewResultSent;
  981. rpl::event_stream<not_null<PeerData*>> _peerDecorationsUpdated;
  982. base::flat_map<
  983. not_null<ChannelData*>,
  984. mtpRequestId> _viewAsMessagesRequests;
  985. Groups _groups;
  986. const std::unique_ptr<ChatFilters> _chatsFilters;
  987. const std::unique_ptr<CloudThemes> _cloudThemes;
  988. const std::unique_ptr<SendActionManager> _sendActionManager;
  989. const std::unique_ptr<Streaming> _streaming;
  990. const std::unique_ptr<MediaRotation> _mediaRotation;
  991. const std::unique_ptr<Histories> _histories;
  992. const std::unique_ptr<Stickers> _stickers;
  993. const std::unique_ptr<Reactions> _reactions;
  994. const std::unique_ptr<EmojiStatuses> _emojiStatuses;
  995. const std::unique_ptr<ForumIcons> _forumIcons;
  996. const std::unique_ptr<NotifySettings> _notifySettings;
  997. const std::unique_ptr<CustomEmojiManager> _customEmojiManager;
  998. const std::unique_ptr<Stories> _stories;
  999. const std::unique_ptr<SavedMessages> _savedMessages;
  1000. const std::unique_ptr<Chatbots> _chatbots;
  1001. const std::unique_ptr<BusinessInfo> _businessInfo;
  1002. std::unique_ptr<ShortcutMessages> _shortcutMessages;
  1003. MsgId _nonHistoryEntryId = ShortcutMaxMsgId;
  1004. rpl::lifetime _lifetime;
  1005. };
  1006. } // namespace Data