apiwrap.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  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 "api/api_common.h"
  9. #include "base/timer.h"
  10. #include "mtproto/sender.h"
  11. #include "data/stickers/data_stickers_set.h"
  12. #include "data/data_messages.h"
  13. class TaskQueue;
  14. struct MessageGroupId;
  15. struct SendingAlbum;
  16. enum class SendMediaType;
  17. struct FileLoadTo;
  18. struct ChatRestrictionsInfo;
  19. namespace Main {
  20. class Session;
  21. } // namespace Main
  22. namespace Data {
  23. struct UpdatedFileReferences;
  24. class WallPaper;
  25. struct ResolvedForwardDraft;
  26. enum class DefaultNotify;
  27. enum class StickersType : uchar;
  28. class Forum;
  29. class ForumTopic;
  30. class Thread;
  31. class Story;
  32. class SavedMessages;
  33. } // namespace Data
  34. namespace InlineBots {
  35. class Result;
  36. } // namespace InlineBots
  37. namespace Storage {
  38. enum class SharedMediaType : signed char;
  39. class DownloadMtprotoTask;
  40. class Account;
  41. } // namespace Storage
  42. namespace Dialogs {
  43. class Key;
  44. } // namespace Dialogs
  45. namespace Ui {
  46. struct PreparedList;
  47. class Show;
  48. } // namespace Ui
  49. namespace Api {
  50. struct SearchResult;
  51. struct GlobalMediaResult;
  52. class Updates;
  53. class Authorizations;
  54. class AttachedStickers;
  55. class BlockedPeers;
  56. class CloudPassword;
  57. class SelfDestruct;
  58. class SensitiveContent;
  59. class GlobalPrivacy;
  60. class UserPrivacy;
  61. class InviteLinks;
  62. class ChatLinks;
  63. class ViewsManager;
  64. class ConfirmPhone;
  65. class PeerPhoto;
  66. class PeerColors;
  67. class Polls;
  68. class ChatParticipants;
  69. class UnreadThings;
  70. class Ringtones;
  71. class Transcribes;
  72. class Premium;
  73. class Usernames;
  74. class Websites;
  75. namespace details {
  76. inline QString ToString(const QString &value) {
  77. return value;
  78. }
  79. inline QString ToString(int32 value) {
  80. return QString::number(value);
  81. }
  82. inline QString ToString(uint64 value) {
  83. return QString::number(value);
  84. }
  85. template <uchar Shift>
  86. inline QString ToString(ChatIdType<Shift> value) {
  87. return QString::number(value.bare);
  88. }
  89. inline QString ToString(PeerId value) {
  90. return QString::number(value.value);
  91. }
  92. } // namespace details
  93. template <
  94. typename ...Types,
  95. typename = std::enable_if_t<(sizeof...(Types) > 0)>>
  96. QString RequestKey(Types &&...values) {
  97. const auto strings = { details::ToString(values)... };
  98. if (strings.size() == 1) {
  99. return *strings.begin();
  100. }
  101. auto result = QString();
  102. result.reserve(
  103. ranges::accumulate(strings, 0, ranges::plus(), &QString::size));
  104. for (const auto &string : strings) {
  105. result.append(string);
  106. }
  107. return result;
  108. }
  109. } // namespace Api
  110. class ApiWrap final : public MTP::Sender {
  111. public:
  112. using SendAction = Api::SendAction;
  113. using MessageToSend = Api::MessageToSend;
  114. explicit ApiWrap(not_null<Main::Session*> session);
  115. ~ApiWrap();
  116. [[nodiscard]] Main::Session &session() const;
  117. [[nodiscard]] Storage::Account &local() const;
  118. [[nodiscard]] Api::Updates &updates() const;
  119. void applyUpdates(
  120. const MTPUpdates &updates,
  121. uint64 sentMessageRandomId = 0) const;
  122. int applyAffectedHistory(
  123. PeerData *peer, // May be nullptr, like for deletePhoneCallHistory.
  124. const MTPmessages_AffectedHistory &result) const;
  125. void registerModifyRequest(const QString &key, mtpRequestId requestId);
  126. void clearModifyRequest(const QString &key);
  127. void saveCurrentDraftToCloud();
  128. void savePinnedOrder(Data::Folder *folder);
  129. void savePinnedOrder(not_null<Data::Forum*> forum);
  130. void savePinnedOrder(not_null<Data::SavedMessages*> saved);
  131. void toggleHistoryArchived(
  132. not_null<History*> history,
  133. bool archived,
  134. Fn<void()> callback);
  135. void requestMessageData(PeerData *peer, MsgId msgId, Fn<void()> done);
  136. QString exportDirectMessageLink(
  137. not_null<HistoryItem*> item,
  138. bool inRepliesContext,
  139. bool forceNonPublicLink = false,
  140. std::optional<TimeId> videoTimestamp = {});
  141. QString exportDirectStoryLink(not_null<Data::Story*> item);
  142. void requestContacts();
  143. void requestDialogs(Data::Folder *folder = nullptr);
  144. void requestPinnedDialogs(Data::Folder *folder = nullptr);
  145. void requestMoreBlockedByDateDialogs();
  146. void requestMoreDialogsIfNeeded();
  147. rpl::producer<bool> dialogsLoadMayBlockByDate() const;
  148. rpl::producer<bool> dialogsLoadBlockedByDate() const;
  149. void requestWallPaper(
  150. const QString &slug,
  151. Fn<void(const Data::WallPaper &)> done,
  152. Fn<void()> fail);
  153. void requestFullPeer(not_null<PeerData*> peer);
  154. void requestPeerSettings(not_null<PeerData*> peer);
  155. using UpdatedFileReferences = Data::UpdatedFileReferences;
  156. using FileReferencesHandler = FnMut<void(const UpdatedFileReferences&)>;
  157. void refreshFileReference(
  158. Data::FileOrigin origin,
  159. FileReferencesHandler &&handler);
  160. void refreshFileReference(
  161. Data::FileOrigin origin,
  162. not_null<Storage::DownloadMtprotoTask*> task,
  163. int requestId,
  164. const QByteArray &current);
  165. void requestChangelog(
  166. const QString &sinceVersion,
  167. Fn<void(const MTPUpdates &result)> callback);
  168. void refreshTopPromotion();
  169. void requestDeepLinkInfo(
  170. const QString &path,
  171. Fn<void(TextWithEntities message, bool updateRequired)> callback);
  172. void requestTermsUpdate();
  173. void acceptTerms(bytes::const_span termsId);
  174. void checkChatInvite(
  175. const QString &hash,
  176. FnMut<void(const MTPChatInvite &)> done,
  177. Fn<void(const MTP::Error &)> fail);
  178. void checkFilterInvite(
  179. const QString &slug,
  180. FnMut<void(const MTPchatlists_ChatlistInvite &)> done,
  181. Fn<void(const MTP::Error &)> fail);
  182. void processFullPeer(
  183. not_null<PeerData*> peer,
  184. const MTPmessages_ChatFull &result);
  185. void migrateChat(
  186. not_null<ChatData*> chat,
  187. FnMut<void(not_null<ChannelData*>)> done,
  188. Fn<void(const QString &)> fail = nullptr);
  189. void markContentsRead(
  190. const base::flat_set<not_null<HistoryItem*>> &items);
  191. void markContentsRead(not_null<HistoryItem*> item);
  192. void deleteAllFromParticipant(
  193. not_null<ChannelData*> channel,
  194. not_null<PeerData*> from);
  195. void requestWebPageDelayed(not_null<WebPageData*> page);
  196. void clearWebPageRequest(not_null<WebPageData*> page);
  197. void clearWebPageRequests();
  198. void scheduleStickerSetRequest(uint64 setId, uint64 access);
  199. void requestStickerSets();
  200. void saveStickerSets(
  201. const Data::StickersSetsOrder &localOrder,
  202. const Data::StickersSetsOrder &localRemoved,
  203. Data::StickersType type);
  204. void updateStickers();
  205. void updateSavedGifs();
  206. void updateMasks();
  207. void updateCustomEmoji();
  208. void requestSpecialStickersForce(
  209. bool faved,
  210. bool recent,
  211. bool attached);
  212. void setGroupStickerSet(
  213. not_null<ChannelData*> megagroup,
  214. const StickerSetIdentifier &set);
  215. void setGroupEmojiSet(
  216. not_null<ChannelData*> megagroup,
  217. const StickerSetIdentifier &set);
  218. [[nodiscard]] std::vector<not_null<DocumentData*>> *stickersByEmoji(
  219. const QString &key);
  220. void joinChannel(not_null<ChannelData*> channel);
  221. void leaveChannel(not_null<ChannelData*> channel);
  222. void requestNotifySettings(const MTPInputNotifyPeer &peer);
  223. void updateNotifySettingsDelayed(not_null<const Data::Thread*> thread);
  224. void updateNotifySettingsDelayed(not_null<const PeerData*> peer);
  225. void updateNotifySettingsDelayed(Data::DefaultNotify type);
  226. void saveDraftToCloudDelayed(not_null<Data::Thread*> thread);
  227. void clearHistory(not_null<PeerData*> peer, bool revoke);
  228. void deleteConversation(not_null<PeerData*> peer, bool revoke);
  229. bool isQuitPrevent();
  230. void resolveJumpToDate(
  231. Dialogs::Key chat,
  232. const QDate &date,
  233. Fn<void(not_null<PeerData*>, MsgId)> callback);
  234. using SliceType = Data::LoadDirection;
  235. void requestHistory(
  236. not_null<History*> history,
  237. MsgId messageId,
  238. SliceType slice);
  239. void requestSharedMedia(
  240. not_null<PeerData*> peer,
  241. MsgId topicRootId,
  242. Storage::SharedMediaType type,
  243. MsgId messageId,
  244. SliceType slice);
  245. mtpRequestId requestGlobalMedia(
  246. Storage::SharedMediaType type,
  247. const QString &query,
  248. int32 offsetRate,
  249. Data::MessagePosition offsetPosition,
  250. Fn<void(Api::GlobalMediaResult)> done);
  251. void readFeaturedSetDelayed(uint64 setId);
  252. rpl::producer<SendAction> sendActions() const {
  253. return _sendActions.events();
  254. }
  255. void sendAction(const SendAction &action);
  256. void finishForwarding(const SendAction &action);
  257. void forwardMessages(
  258. Data::ResolvedForwardDraft &&draft,
  259. SendAction action,
  260. FnMut<void()> &&successCallback = nullptr);
  261. void shareContact(
  262. const QString &phone,
  263. const QString &firstName,
  264. const QString &lastName,
  265. const SendAction &action,
  266. Fn<void(bool)> done = nullptr);
  267. void shareContact(
  268. not_null<UserData*> user,
  269. const SendAction &action,
  270. Fn<void(bool)> done = nullptr);
  271. void applyAffectedMessages(
  272. not_null<PeerData*> peer,
  273. const MTPmessages_AffectedMessages &result);
  274. void sendVoiceMessage(
  275. QByteArray result,
  276. VoiceWaveform waveform,
  277. crl::time duration,
  278. bool video,
  279. const SendAction &action);
  280. void sendFiles(
  281. Ui::PreparedList &&list,
  282. SendMediaType type,
  283. TextWithTags &&caption,
  284. std::shared_ptr<SendingAlbum> album,
  285. const SendAction &action);
  286. void sendFile(
  287. const QByteArray &fileContent,
  288. SendMediaType type,
  289. const SendAction &action);
  290. void editMedia(
  291. Ui::PreparedList &&list,
  292. SendMediaType type,
  293. TextWithTags &&caption,
  294. const SendAction &action);
  295. void sendUploadedPhoto(
  296. FullMsgId localId,
  297. Api::RemoteFileInfo info,
  298. Api::SendOptions options);
  299. void sendUploadedDocument(
  300. FullMsgId localId,
  301. Api::RemoteFileInfo file,
  302. Api::SendOptions options);
  303. void cancelLocalItem(not_null<HistoryItem*> item);
  304. void sendShortcutMessages(
  305. not_null<PeerData*> peer,
  306. BusinessShortcutId id);
  307. void sendMessage(MessageToSend &&message);
  308. void sendBotStart(
  309. std::shared_ptr<Ui::Show> show,
  310. not_null<UserData*> bot,
  311. PeerData *chat = nullptr,
  312. const QString &startTokenForChat = QString());
  313. void sendInlineResult(
  314. not_null<UserData*> bot,
  315. not_null<InlineBots::Result*> data,
  316. SendAction action,
  317. std::optional<MsgId> localMessageId,
  318. Fn<void(bool)> done = nullptr);
  319. void sendMessageFail(
  320. const MTP::Error &error,
  321. not_null<PeerData*> peer,
  322. uint64 randomId = 0,
  323. FullMsgId itemId = FullMsgId());
  324. void sendMessageFail(
  325. const QString &error,
  326. not_null<PeerData*> peer,
  327. uint64 randomId = 0,
  328. FullMsgId itemId = FullMsgId());
  329. void reloadContactSignupSilent();
  330. rpl::producer<bool> contactSignupSilent() const;
  331. std::optional<bool> contactSignupSilentCurrent() const;
  332. void saveContactSignupSilent(bool silent);
  333. [[nodiscard]] auto botCommonGroups(not_null<UserData*> bot) const
  334. -> std::optional<std::vector<not_null<PeerData*>>>;
  335. void requestBotCommonGroups(not_null<UserData*> bot, Fn<void()> done);
  336. void saveSelfBio(const QString &text);
  337. void registerStatsRequest(MTP::DcId dcId, mtpRequestId id);
  338. void unregisterStatsRequest(MTP::DcId dcId, mtpRequestId id);
  339. [[nodiscard]] Api::Authorizations &authorizations();
  340. [[nodiscard]] Api::AttachedStickers &attachedStickers();
  341. [[nodiscard]] Api::BlockedPeers &blockedPeers();
  342. [[nodiscard]] Api::CloudPassword &cloudPassword();
  343. [[nodiscard]] Api::SelfDestruct &selfDestruct();
  344. [[nodiscard]] Api::SensitiveContent &sensitiveContent();
  345. [[nodiscard]] Api::GlobalPrivacy &globalPrivacy();
  346. [[nodiscard]] Api::UserPrivacy &userPrivacy();
  347. [[nodiscard]] Api::InviteLinks &inviteLinks();
  348. [[nodiscard]] Api::ChatLinks &chatLinks();
  349. [[nodiscard]] Api::ViewsManager &views();
  350. [[nodiscard]] Api::ConfirmPhone &confirmPhone();
  351. [[nodiscard]] Api::PeerPhoto &peerPhoto();
  352. [[nodiscard]] Api::Polls &polls();
  353. [[nodiscard]] Api::ChatParticipants &chatParticipants();
  354. [[nodiscard]] Api::UnreadThings &unreadThings();
  355. [[nodiscard]] Api::Ringtones &ringtones();
  356. [[nodiscard]] Api::Transcribes &transcribes();
  357. [[nodiscard]] Api::Premium &premium();
  358. [[nodiscard]] Api::Usernames &usernames();
  359. [[nodiscard]] Api::Websites &websites();
  360. [[nodiscard]] Api::PeerColors &peerColors();
  361. void updatePrivacyLastSeens();
  362. static constexpr auto kJoinErrorDuration = 5 * crl::time(1000);
  363. private:
  364. struct MessageDataRequest {
  365. using Callbacks = std::vector<Fn<void()>>;
  366. mtpRequestId requestId = 0;
  367. Callbacks callbacks;
  368. };
  369. using MessageDataRequests = base::flat_map<MsgId, MessageDataRequest>;
  370. using SharedMediaType = Storage::SharedMediaType;
  371. struct StickersByEmoji {
  372. std::vector<not_null<DocumentData*>> list;
  373. uint64 hash = 0;
  374. crl::time received = 0;
  375. };
  376. struct DialogsLoadState {
  377. TimeId offsetDate = 0;
  378. MsgId offsetId = 0;
  379. PeerData *offsetPeer = nullptr;
  380. mtpRequestId requestId = 0;
  381. bool listReceived = false;
  382. mtpRequestId pinnedRequestId = 0;
  383. bool pinnedReceived = false;
  384. };
  385. void setupSupportMode();
  386. void refreshDialogsLoadBlocked();
  387. void updateDialogsOffset(
  388. Data::Folder *folder,
  389. const QVector<MTPDialog> &dialogs,
  390. const QVector<MTPMessage> &messages);
  391. void requestMoreDialogs(Data::Folder *folder);
  392. DialogsLoadState *dialogsLoadState(Data::Folder *folder);
  393. void dialogsLoadFinish(Data::Folder *folder);
  394. void checkQuitPreventFinished();
  395. void saveDraftsToCloud();
  396. void resolveMessageDatas();
  397. void finalizeMessageDataRequest(
  398. ChannelData *channel,
  399. mtpRequestId requestId);
  400. [[nodiscard]] QVector<MTPInputMessage> collectMessageIds(
  401. const MessageDataRequests &requests);
  402. [[nodiscard]] MessageDataRequests *messageDataRequests(
  403. ChannelData *channel,
  404. bool onlyExisting = false);
  405. void gotChatFull(
  406. not_null<PeerData*> peer,
  407. const MTPmessages_ChatFull &result);
  408. void gotUserFull(
  409. not_null<UserData*> user,
  410. const MTPusers_UserFull &result);
  411. void resolveWebPages();
  412. void gotWebPages(
  413. ChannelData *channel,
  414. const MTPmessages_Messages &result,
  415. mtpRequestId req);
  416. void gotStickerSet(uint64 setId, const MTPmessages_StickerSet &result);
  417. void requestStickers(TimeId now);
  418. void requestMasks(TimeId now);
  419. void requestCustomEmoji(TimeId now);
  420. void requestRecentStickers(
  421. std::optional<TimeId> now,
  422. bool attached);
  423. void requestFavedStickers(std::optional<TimeId> now);
  424. void requestFeaturedStickers(TimeId now);
  425. void requestFeaturedEmoji(TimeId now);
  426. void requestSavedGifs(TimeId now);
  427. void readFeaturedSets();
  428. void resolveJumpToHistoryDate(
  429. not_null<PeerData*> peer,
  430. MsgId topicRootId,
  431. const QDate &date,
  432. Fn<void(not_null<PeerData*>, MsgId)> callback);
  433. template <typename Callback>
  434. void requestMessageAfterDate(
  435. not_null<PeerData*> peer,
  436. MsgId topicRootId,
  437. const QDate &date,
  438. Callback &&callback);
  439. void sharedMediaDone(
  440. not_null<PeerData*> peer,
  441. MsgId topicRootId,
  442. SharedMediaType type,
  443. Api::SearchResult &&parsed);
  444. void globalMediaDone(
  445. SharedMediaType type,
  446. FullMsgId messageId,
  447. Api::GlobalMediaResult &&parsed);
  448. void sendSharedContact(
  449. const QString &phone,
  450. const QString &firstName,
  451. const QString &lastName,
  452. UserId userId,
  453. const SendAction &action,
  454. Fn<void(bool)> done);
  455. void deleteHistory(
  456. not_null<PeerData*> peer,
  457. bool justClear,
  458. bool revoke);
  459. void applyAffectedMessages(
  460. const MTPmessages_AffectedMessages &result) const;
  461. void deleteAllFromParticipantSend(
  462. not_null<ChannelData*> channel,
  463. not_null<PeerData*> from);
  464. void uploadAlbumMedia(
  465. not_null<HistoryItem*> item,
  466. const MessageGroupId &groupId,
  467. const MTPInputMedia &media);
  468. void sendAlbumWithUploaded(
  469. not_null<HistoryItem*> item,
  470. const MessageGroupId &groupId,
  471. const MTPInputMedia &media);
  472. void sendAlbumWithCancelled(
  473. not_null<HistoryItem*> item,
  474. const MessageGroupId &groupId);
  475. void sendAlbumIfReady(not_null<SendingAlbum*> album);
  476. void sendMedia(
  477. not_null<HistoryItem*> item,
  478. const MTPInputMedia &media,
  479. Api::SendOptions options,
  480. Fn<void(bool)> done = nullptr);
  481. void sendMediaWithRandomId(
  482. not_null<HistoryItem*> item,
  483. const MTPInputMedia &media,
  484. Api::SendOptions options,
  485. uint64 randomId,
  486. Fn<void(bool)> done = nullptr);
  487. void sendMultiPaidMedia(
  488. not_null<HistoryItem*> item,
  489. not_null<SendingAlbum*> album,
  490. Fn<void(bool)> done = nullptr);
  491. void getTopPromotionDelayed(TimeId now, TimeId next);
  492. void topPromotionDone(const MTPhelp_PromoData &proxy);
  493. void sendNotifySettingsUpdates();
  494. template <typename Request>
  495. void requestFileReference(
  496. Data::FileOrigin origin,
  497. FileReferencesHandler &&handler,
  498. Request &&data);
  499. void migrateDone(
  500. not_null<PeerData*> peer,
  501. not_null<ChannelData*> channel);
  502. void migrateFail(not_null<PeerData*> peer, const QString &error);
  503. void checkStatsSessions();
  504. const not_null<Main::Session*> _session;
  505. base::flat_map<QString, int> _modifyRequests;
  506. MessageDataRequests _messageDataRequests;
  507. base::flat_map<
  508. not_null<ChannelData*>,
  509. MessageDataRequests> _channelMessageDataRequests;
  510. SingleQueuedInvokation _messageDataResolveDelayed;
  511. using PeerRequests = base::flat_map<PeerData*, mtpRequestId>;
  512. PeerRequests _fullPeerRequests;
  513. base::flat_set<not_null<PeerData*>> _requestedPeerSettings;
  514. base::flat_map<
  515. not_null<History*>,
  516. std::pair<mtpRequestId,Fn<void()>>> _historyArchivedRequests;
  517. base::flat_map<not_null<WebPageData*>, mtpRequestId> _webPagesPending;
  518. base::Timer _webPagesTimer;
  519. struct StickerSetRequest {
  520. uint64 accessHash = 0;
  521. mtpRequestId id = 0;
  522. };
  523. base::flat_map<uint64, StickerSetRequest> _stickerSetRequests;
  524. base::flat_map<
  525. not_null<ChannelData*>,
  526. mtpRequestId> _channelAmInRequests;
  527. struct NotifySettingsKey {
  528. PeerId peerId = 0;
  529. MsgId topicRootId = 0;
  530. friend inline constexpr auto operator<=>(
  531. NotifySettingsKey,
  532. NotifySettingsKey) = default;
  533. };
  534. base::flat_map<NotifySettingsKey, mtpRequestId> _notifySettingRequests;
  535. base::flat_map<
  536. base::weak_ptr<Data::Thread>,
  537. mtpRequestId> _draftsSaveRequestIds;
  538. base::Timer _draftsSaveTimer;
  539. base::flat_set<mtpRequestId> _stickerSetDisenableRequests;
  540. base::flat_set<mtpRequestId> _maskSetDisenableRequests;
  541. base::flat_set<mtpRequestId> _customEmojiSetDisenableRequests;
  542. mtpRequestId _masksReorderRequestId = 0;
  543. mtpRequestId _customEmojiReorderRequestId = 0;
  544. mtpRequestId _stickersReorderRequestId = 0;
  545. mtpRequestId _stickersClearRecentRequestId = 0;
  546. mtpRequestId _stickersClearRecentAttachedRequestId = 0;
  547. mtpRequestId _stickersUpdateRequest = 0;
  548. mtpRequestId _masksUpdateRequest = 0;
  549. mtpRequestId _customEmojiUpdateRequest = 0;
  550. mtpRequestId _recentStickersUpdateRequest = 0;
  551. mtpRequestId _recentAttachedStickersUpdateRequest = 0;
  552. mtpRequestId _favedStickersUpdateRequest = 0;
  553. mtpRequestId _featuredStickersUpdateRequest = 0;
  554. mtpRequestId _featuredEmojiUpdateRequest = 0;
  555. mtpRequestId _savedGifsUpdateRequest = 0;
  556. base::Timer _featuredSetsReadTimer;
  557. base::flat_set<uint64> _featuredSetsRead;
  558. base::flat_map<QString, StickersByEmoji> _stickersByEmoji;
  559. mtpRequestId _contactsRequestId = 0;
  560. mtpRequestId _contactsStatusesRequestId = 0;
  561. struct SharedMediaRequest {
  562. not_null<PeerData*> peer;
  563. MsgId topicRootId = 0;
  564. SharedMediaType mediaType = {};
  565. MsgId aroundId = 0;
  566. SliceType sliceType = {};
  567. friend inline auto operator<=>(
  568. const SharedMediaRequest&,
  569. const SharedMediaRequest&) = default;
  570. };
  571. base::flat_set<SharedMediaRequest> _sharedMediaRequests;
  572. struct HistoryRequest {
  573. not_null<PeerData*> peer;
  574. MsgId aroundId = 0;
  575. SliceType sliceType = {};
  576. friend inline auto operator<=>(
  577. const HistoryRequest&,
  578. const HistoryRequest&) = default;
  579. };
  580. base::flat_set<HistoryRequest> _historyRequests;
  581. struct GlobalMediaRequest {
  582. SharedMediaType mediaType = {};
  583. FullMsgId aroundId;
  584. SliceType sliceType = {};
  585. friend inline auto operator<=>(
  586. const GlobalMediaRequest&,
  587. const GlobalMediaRequest&) = default;
  588. };
  589. base::flat_set<GlobalMediaRequest> _globalMediaRequests;
  590. std::unique_ptr<DialogsLoadState> _dialogsLoadState;
  591. TimeId _dialogsLoadTill = 0;
  592. rpl::variable<bool> _dialogsLoadMayBlockByDate = false;
  593. rpl::variable<bool> _dialogsLoadBlockedByDate = false;
  594. base::flat_map<
  595. not_null<Data::Folder*>,
  596. DialogsLoadState> _foldersLoadState;
  597. rpl::event_stream<SendAction> _sendActions;
  598. std::unique_ptr<TaskQueue> _fileLoader;
  599. base::flat_map<uint64, std::shared_ptr<SendingAlbum>> _sendingAlbums;
  600. mtpRequestId _topPromotionRequestId = 0;
  601. std::pair<QString, uint32> _topPromotionKey;
  602. TimeId _topPromotionNextRequestTime = TimeId(0);
  603. base::Timer _topPromotionTimer;
  604. base::flat_set<not_null<const Data::ForumTopic*>> _updateNotifyTopics;
  605. base::flat_set<not_null<const PeerData*>> _updateNotifyPeers;
  606. base::flat_set<Data::DefaultNotify> _updateNotifyDefaults;
  607. base::Timer _updateNotifyTimer;
  608. rpl::lifetime _updateNotifyQueueLifetime;
  609. std::map<
  610. Data::FileOrigin,
  611. std::vector<FileReferencesHandler>> _fileReferenceHandlers;
  612. mtpRequestId _deepLinkInfoRequestId = 0;
  613. crl::time _termsUpdateSendAt = 0;
  614. mtpRequestId _termsUpdateRequestId = 0;
  615. mtpRequestId _checkInviteRequestId = 0;
  616. mtpRequestId _checkFilterInviteRequestId = 0;
  617. struct MigrateCallbacks {
  618. FnMut<void(not_null<ChannelData*>)> done;
  619. Fn<void(const QString&)> fail;
  620. };
  621. base::flat_map<
  622. not_null<PeerData*>,
  623. std::vector<MigrateCallbacks>> _migrateCallbacks;
  624. struct {
  625. mtpRequestId requestId = 0;
  626. QString requestedText;
  627. } _bio;
  628. base::flat_map<MTP::DcId, base::flat_set<mtpRequestId>> _statsRequests;
  629. base::Timer _statsSessionKillTimer;
  630. const std::unique_ptr<Api::Authorizations> _authorizations;
  631. const std::unique_ptr<Api::AttachedStickers> _attachedStickers;
  632. const std::unique_ptr<Api::BlockedPeers> _blockedPeers;
  633. const std::unique_ptr<Api::CloudPassword> _cloudPassword;
  634. const std::unique_ptr<Api::SelfDestruct> _selfDestruct;
  635. const std::unique_ptr<Api::SensitiveContent> _sensitiveContent;
  636. const std::unique_ptr<Api::GlobalPrivacy> _globalPrivacy;
  637. const std::unique_ptr<Api::UserPrivacy> _userPrivacy;
  638. const std::unique_ptr<Api::InviteLinks> _inviteLinks;
  639. const std::unique_ptr<Api::ChatLinks> _chatLinks;
  640. const std::unique_ptr<Api::ViewsManager> _views;
  641. const std::unique_ptr<Api::ConfirmPhone> _confirmPhone;
  642. const std::unique_ptr<Api::PeerPhoto> _peerPhoto;
  643. const std::unique_ptr<Api::Polls> _polls;
  644. const std::unique_ptr<Api::ChatParticipants> _chatParticipants;
  645. const std::unique_ptr<Api::UnreadThings> _unreadThings;
  646. const std::unique_ptr<Api::Ringtones> _ringtones;
  647. const std::unique_ptr<Api::Transcribes> _transcribes;
  648. const std::unique_ptr<Api::Premium> _premium;
  649. const std::unique_ptr<Api::Usernames> _usernames;
  650. const std::unique_ptr<Api::Websites> _websites;
  651. const std::unique_ptr<Api::PeerColors> _peerColors;
  652. mtpRequestId _wallPaperRequestId = 0;
  653. QString _wallPaperSlug;
  654. Fn<void(const Data::WallPaper &)> _wallPaperDone;
  655. Fn<void()> _wallPaperFail;
  656. mtpRequestId _contactSignupSilentRequestId = 0;
  657. std::optional<bool> _contactSignupSilent;
  658. rpl::event_stream<bool> _contactSignupSilentChanges;
  659. base::flat_map<
  660. not_null<UserData*>,
  661. std::vector<not_null<PeerData*>>> _botCommonGroups;
  662. base::flat_map<not_null<UserData*>, Fn<void()>> _botCommonGroupsRequests;
  663. base::flat_map<FullMsgId, QString> _unlikelyMessageLinks;
  664. base::flat_map<FullStoryId, QString> _unlikelyStoryLinks;
  665. };