tdesktop/Telegram/SourceFiles/data/data_session.h

999 lines
33 KiB
C
Raw Normal View History

/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "storage/storage_databases.h"
#include "dialogs/dialogs_key.h"
#include "dialogs/dialogs_indexed_list.h"
2019-04-22 14:22:39 +00:00
#include "dialogs/dialogs_main_list.h"
#include "data/data_groups.h"
#include "data/data_cloud_file.h"
2018-10-11 15:54:57 +00:00
#include "history/history_location_manager.h"
#include "base/timer.h"
#include "base/flags.h"
2019-01-16 12:25:29 +00:00
class Image;
class HistoryItem;
2019-04-25 12:45:15 +00:00
class HistoryMessage;
class HistoryService;
struct WebPageCollage;
enum class WebPageType;
2019-04-25 12:45:15 +00:00
enum class NewMessageType;
namespace HistoryView {
struct Group;
class Element;
2019-05-14 09:50:44 +00:00
class ElementDelegate;
} // namespace HistoryView
2019-07-24 11:45:24 +00:00
namespace Main {
class Session;
} // namespace Main
2019-09-18 11:19:05 +00:00
namespace Ui {
class BoxContent;
} // namespace Ui
namespace Passport {
struct SavedCredentials;
} // namespace Passport
namespace Data {
2019-04-15 11:54:03 +00:00
class Folder;
2019-06-21 12:27:46 +00:00
class LocationPoint;
2019-01-28 13:59:49 +00:00
class WallPaper;
2019-08-08 14:13:26 +00:00
class ScheduledMessages;
class SendActionManager;
2021-09-26 18:24:47 +00:00
class SponsoredMessages;
class Reactions;
class EmojiStatuses;
2020-02-07 16:07:21 +00:00
class ChatFilters;
2019-09-03 15:24:51 +00:00
class CloudThemes;
class Streaming;
class MediaRotation;
class Histories;
class DocumentMedia;
class PhotoMedia;
class Stickers;
2020-11-24 11:56:46 +00:00
class GroupCall;
class NotifySettings;
class CustomEmojiManager;
2019-01-03 12:36:01 +00:00
struct RepliesReadTillUpdate {
FullMsgId id;
MsgId readTillId;
bool out = false;
};
class Session final {
public:
using ViewElement = HistoryView::Element;
2019-04-25 12:45:15 +00:00
struct SentData {
PeerId peerId = 0;
QString text;
};
2019-07-24 11:45:24 +00:00
explicit Session(not_null<Main::Session*> session);
~Session();
2019-07-24 11:45:24 +00:00
[[nodiscard]] Main::Session &session() const {
return *_session;
}
[[nodiscard]] QString nameSortKey(const QString &name) const;
2019-08-08 14:13:26 +00:00
[[nodiscard]] Groups &groups() {
return _groups;
}
[[nodiscard]] const Groups &groups() const {
return _groups;
}
2020-02-07 16:07:21 +00:00
[[nodiscard]] ChatFilters &chatsFilters() const {
return *_chatsFilters;
}
[[nodiscard]] ScheduledMessages &scheduledMessages() const {
return *_scheduledMessages;
2019-08-08 14:13:26 +00:00
}
[[nodiscard]] SendActionManager &sendActionManager() const {
return *_sendActionManager;
}
2019-09-03 15:24:51 +00:00
[[nodiscard]] CloudThemes &cloudThemes() const {
return *_cloudThemes;
}
[[nodiscard]] Streaming &streaming() const {
return *_streaming;
}
[[nodiscard]] MediaRotation &mediaRotation() const {
return *_mediaRotation;
}
[[nodiscard]] Histories &histories() const {
return *_histories;
}
[[nodiscard]] Stickers &stickers() const {
return *_stickers;
}
2021-09-26 18:24:47 +00:00
[[nodiscard]] SponsoredMessages &sponsoredMessages() const {
return *_sponsoredMessages;
}
[[nodiscard]] Reactions &reactions() const {
return *_reactions;
}
[[nodiscard]] EmojiStatuses &emojiStatuses() const {
return *_emojiStatuses;
}
[[nodiscard]] NotifySettings &notifySettings() const {
return *_notifySettings;
}
[[nodiscard]] CustomEmojiManager &customEmojiManager() const {
return *_customEmojiManager;
}
[[nodiscard]] MsgId nextNonHistoryEntryId() {
return ++_nonHistoryEntryId;
}
2019-08-08 14:13:26 +00:00
2019-01-03 12:36:01 +00:00
void clear();
void keepAlive(std::shared_ptr<PhotoMedia> media);
void keepAlive(std::shared_ptr<DocumentMedia> media);
2018-06-22 23:18:43 +00:00
void suggestStartExport(TimeId availableAt);
2018-06-28 17:44:07 +00:00
void clearExportSuggestion();
[[nodiscard]] auto passportCredentials() const
-> const Passport::SavedCredentials*;
void rememberPassportCredentials(
Passport::SavedCredentials data,
crl::time rememberFor);
void forgetPassportCredentials();
[[nodiscard]] Storage::Cache::Database &cache();
[[nodiscard]] Storage::Cache::Database &cacheBigFile();
2019-01-03 12:36:01 +00:00
[[nodiscard]] not_null<PeerData*> peer(PeerId id);
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<PeerData*> peer(UserId id) = delete;
2019-01-03 12:36:01 +00:00
[[nodiscard]] not_null<UserData*> user(UserId id);
[[nodiscard]] not_null<ChatData*> chat(ChatId id);
[[nodiscard]] not_null<ChannelData*> channel(ChannelId id);
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<UserData*> user(PeerId id) = delete;
[[nodiscard]] not_null<ChatData*> chat(PeerId id) = delete;
[[nodiscard]] not_null<ChannelData*> channel(PeerId id) = delete;
2019-01-03 12:36:01 +00:00
[[nodiscard]] PeerData *peerLoaded(PeerId id) const;
2019-01-18 12:27:37 +00:00
[[nodiscard]] PeerData *peerLoaded(UserId id) const = delete;
2019-01-03 12:36:01 +00:00
[[nodiscard]] UserData *userLoaded(UserId id) const;
[[nodiscard]] ChatData *chatLoaded(ChatId id) const;
[[nodiscard]] ChannelData *channelLoaded(ChannelId id) const;
2019-01-18 12:27:37 +00:00
[[nodiscard]] UserData *userLoaded(PeerId id) const = delete;
[[nodiscard]] ChatData *chatLoaded(PeerId id) const = delete;
[[nodiscard]] ChannelData *channelLoaded(PeerId id) const = delete;
2019-01-03 12:36:01 +00:00
2019-01-18 12:27:37 +00:00
not_null<UserData*> processUser(const MTPUser &data);
not_null<PeerData*> processChat(const MTPChat &data);
2019-01-03 12:36:01 +00:00
// Returns last user, if there were any.
UserData *processUsers(const MTPVector<MTPUser> &data);
PeerData *processChats(const MTPVector<MTPChat> &data);
void applyMaximumChatVersions(const MTPVector<MTPChat> &data);
2020-11-24 11:56:46 +00:00
void registerGroupCall(not_null<GroupCall*> call);
void unregisterGroupCall(not_null<GroupCall*> call);
2021-10-24 21:33:53 +00:00
GroupCall *groupCall(CallId callId) const;
2020-11-24 11:56:46 +00:00
2021-10-24 21:33:53 +00:00
[[nodiscard]] auto invitedToCallUsers(CallId callId) const
-> const base::flat_set<not_null<UserData*>> &;
void registerInvitedToCallUser(
2021-10-24 21:33:53 +00:00
CallId callId,
not_null<PeerData*> peer,
not_null<UserData*> user);
2021-10-24 21:33:53 +00:00
void unregisterInvitedToCallUser(CallId callId, not_null<UserData*> user);
2020-12-16 11:58:53 +00:00
struct InviteToCall {
2021-10-24 21:33:53 +00:00
CallId id = 0;
2020-12-16 11:58:53 +00:00
not_null<UserData*> user;
};
[[nodiscard]] rpl::producer<InviteToCall> invitesToCalls() const {
return _invitesToCalls.events();
}
2019-01-03 12:36:01 +00:00
void enumerateUsers(Fn<void(not_null<UserData*>)> action) const;
void enumerateGroups(Fn<void(not_null<PeerData*>)> action) const;
void enumerateBroadcasts(Fn<void(not_null<ChannelData*>)> action) const;
2022-03-01 11:44:29 +00:00
[[nodiscard]] UserData *userByPhone(const QString &phone) const;
2019-01-03 12:36:01 +00:00
[[nodiscard]] PeerData *peerByUsername(const QString &username) const;
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<History*> history(PeerId peerId);
[[nodiscard]] History *historyLoaded(PeerId peerId) const;
[[nodiscard]] not_null<History*> history(UserId userId) = delete;
[[nodiscard]] History *historyLoaded(UserId userId) const = delete;
[[nodiscard]] not_null<History*> history(not_null<const PeerData*> peer);
[[nodiscard]] History *historyLoaded(const PeerData *peer);
2019-01-03 12:36:01 +00:00
void deleteConversationLocally(not_null<PeerData*> peer);
void cancelForwarding(not_null<History*> history);
[[nodiscard]] rpl::variable<bool> &contactsLoaded() {
return _contactsLoaded;
}
[[nodiscard]] rpl::producer<Data::Folder*> chatsListChanges() const {
return _chatsListChanged.events();
}
[[nodiscard]] bool chatsListLoaded(Data::Folder *folder = nullptr);
[[nodiscard]] rpl::producer<Data::Folder*> chatsListLoadedEvents() const {
return _chatsListLoadedEvents.events();
}
void chatsListChanged(FolderId folderId);
void chatsListChanged(Data::Folder *folder);
2019-04-22 14:22:39 +00:00
void chatsListDone(Data::Folder *folder);
2020-06-10 18:08:17 +00:00
void userIsBotChanged(not_null<UserData*> user);
[[nodiscard]] rpl::producer<not_null<UserData*>> userIsBotChanges() const;
void botCommandsChanged(not_null<PeerData*> peer);
[[nodiscard]] rpl::producer<not_null<PeerData*>> botCommandsChanges() const;
2020-06-10 18:08:17 +00:00
struct ItemVisibilityQuery {
not_null<HistoryItem*> item;
not_null<bool*> isVisible;
};
[[nodiscard]] bool queryItemVisibility(not_null<HistoryItem*> item) const;
[[nodiscard]] rpl::producer<ItemVisibilityQuery> itemVisibilityQueries() const;
void itemVisibilitiesUpdated();
struct IdChange {
2022-10-04 15:34:45 +00:00
FullMsgId newId;
MsgId oldId = 0;
};
void notifyItemIdChange(IdChange event);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<IdChange> itemIdChanged() const;
void notifyItemLayoutChange(not_null<const HistoryItem*> item);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemLayoutChanged() const;
void notifyViewLayoutChange(not_null<const ViewElement*> view);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<const ViewElement*>> viewLayoutChanged() const;
2021-07-19 10:02:36 +00:00
void notifyNewItemAdded(not_null<HistoryItem*> item);
[[nodiscard]] rpl::producer<not_null<HistoryItem*>> newItemAdded() const;
void requestItemRepaint(not_null<const HistoryItem*> item);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemRepaintRequest() const;
void requestViewRepaint(not_null<const ViewElement*> view);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<const ViewElement*>> viewRepaintRequest() const;
void requestItemResize(not_null<const HistoryItem*> item);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemResizeRequest() const;
void requestViewResize(not_null<ViewElement*> view);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<ViewElement*>> viewResizeRequest() const;
2018-01-18 13:59:22 +00:00
void requestItemViewRefresh(not_null<HistoryItem*> item);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<HistoryItem*>> itemViewRefreshRequest() const;
void requestItemTextRefresh(not_null<HistoryItem*> item);
void requestAnimationPlayInline(not_null<HistoryItem*> item);
2022-01-28 11:44:33 +00:00
void requestUnreadReactionsAnimation(not_null<HistoryItem*> item);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<HistoryItem*>> animationPlayInlineRequest() const;
void notifyHistoryUnloaded(not_null<const History*> history);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<const History*>> historyUnloaded() const;
void notifyItemDataChange(not_null<HistoryItem*> item);
[[nodiscard]] rpl::producer<not_null<HistoryItem*>> itemDataChanges() const;
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemRemoved() const;
[[nodiscard]] rpl::producer<not_null<const HistoryItem*>> itemRemoved(
FullMsgId itemId) const;
void notifyViewRemoved(not_null<const ViewElement*> view);
[[nodiscard]] rpl::producer<not_null<const ViewElement*>> viewRemoved() const;
void notifyHistoryCleared(not_null<const History*> history);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<const History*>> historyCleared() const;
void notifyHistoryChangeDelayed(not_null<History*> history);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<not_null<History*>> historyChanged() const;
void sendHistoryChangeNotifications();
void notifyPinnedDialogsOrderUpdated();
[[nodiscard]] rpl::producer<> pinnedDialogsOrderUpdated() const;
2019-05-14 09:50:44 +00:00
void registerHeavyViewPart(not_null<ViewElement*> view);
void unregisterHeavyViewPart(not_null<ViewElement*> view);
void unloadHeavyViewParts(
not_null<HistoryView::ElementDelegate*> delegate);
void unloadHeavyViewParts(
not_null<HistoryView::ElementDelegate*> delegate,
int from,
int till);
void registerShownSpoiler(not_null<ViewElement*> view);
void hideShownSpoilers();
using MegagroupParticipant = std::tuple<
not_null<ChannelData*>,
not_null<UserData*>>;
void removeMegagroupParticipant(
not_null<ChannelData*> channel,
not_null<UserData*> user);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<MegagroupParticipant> megagroupParticipantRemoved() const;
[[nodiscard]] rpl::producer<not_null<UserData*>> megagroupParticipantRemoved(
not_null<ChannelData*> channel) const;
void addNewMegagroupParticipant(
not_null<ChannelData*> channel,
not_null<UserData*> user);
2018-03-07 13:53:12 +00:00
[[nodiscard]] rpl::producer<MegagroupParticipant> megagroupParticipantAdded() const;
[[nodiscard]] rpl::producer<not_null<UserData*>> megagroupParticipantAdded(
not_null<ChannelData*> channel) const;
HistoryItemsList idsToItems(const MessageIdsList &ids) const;
MessageIdsList itemsToIds(const HistoryItemsList &items) const;
MessageIdsList itemOrItsGroup(not_null<HistoryItem*> item) const;
void applyUpdate(const MTPDupdateMessagePoll &update);
void applyUpdate(const MTPDupdateChatParticipants &update);
void applyUpdate(const MTPDupdateChatParticipantAdd &update);
void applyUpdate(const MTPDupdateChatParticipantDelete &update);
void applyUpdate(const MTPDupdateChatParticipantAdmin &update);
void applyUpdate(const MTPDupdateChatDefaultBannedRights &update);
void applyDialogs(
2019-04-22 14:22:39 +00:00
Data::Folder *requestFolder,
const QVector<MTPMessage> &messages,
const QVector<MTPDialog> &dialogs,
std::optional<int> count = std::nullopt);
int pinnedCanPin(
Data::Folder *folder,
FilterId filterId,
not_null<History*> history) const;
2022-05-09 13:09:46 +00:00
int pinnedChatsLimit(
Data::Folder *folder,
FilterId filterId) const;
rpl::producer<int> maxPinnedChatsLimitValue(
Data::Folder *folder,
FilterId filterId) const;
2019-04-19 08:47:49 +00:00
const std::vector<Dialogs::Key> &pinnedChatsOrder(
2020-03-17 13:04:30 +00:00
Data::Folder *folder,
FilterId filterId) const;
void setChatPinned(
const Dialogs::Key &key,
FilterId filterId,
bool pinned);
void clearPinnedChats(Data::Folder *folder);
2019-04-19 08:47:49 +00:00
void applyPinnedChats(
2019-04-22 14:22:39 +00:00
Data::Folder *folder,
2019-04-19 08:47:49 +00:00
const QVector<MTPDialogPeer> &list);
void reorderTwoPinnedChats(
2020-03-17 13:04:30 +00:00
FilterId filterId,
const Dialogs::Key &key1,
const Dialogs::Key &key2);
2021-02-19 13:53:20 +00:00
void setSuggestToGigagroup(not_null<ChannelData*> group, bool suggest);
[[nodiscard]] bool suggestToGigagroup(
not_null<ChannelData*> group) const;
2020-02-20 08:45:25 +00:00
void registerMessage(not_null<HistoryItem*> item);
void unregisterMessage(not_null<HistoryItem*> item);
2019-04-25 12:45:15 +00:00
2021-02-02 14:42:26 +00:00
void registerMessageTTL(TimeId when, not_null<HistoryItem*> item);
void unregisterMessageTTL(TimeId when, not_null<HistoryItem*> item);
2019-04-25 12:45:15 +00:00
// Returns true if item found and it is not detached.
bool updateExistingMessage(const MTPDmessage &data);
2019-04-25 12:45:15 +00:00
void updateEditedMessage(const MTPMessage &data);
void processMessages(
const QVector<MTPMessage> &data,
NewMessageType type);
void processMessages(
const MTPVector<MTPMessage> &data,
NewMessageType type);
2021-10-04 19:37:55 +00:00
void processExistingMessages(
ChannelData *channel,
const MTPmessages_Messages &data);
void processNonChannelMessagesDeleted(const QVector<MTPint> &data);
2019-04-25 12:45:15 +00:00
void processMessagesDeleted(
PeerId peerId,
2019-04-25 12:45:15 +00:00
const QVector<MTPint> &data);
2019-08-12 16:33:36 +00:00
[[nodiscard]] MsgId nextLocalMessageId();
2019-04-25 12:45:15 +00:00
[[nodiscard]] HistoryItem *message(
PeerId peerId,
2019-04-25 12:45:15 +00:00
MsgId itemId) const;
[[nodiscard]] HistoryItem *message(
not_null<const PeerData*> peer,
2019-04-25 12:45:15 +00:00
MsgId itemId) const;
[[nodiscard]] HistoryItem *message(FullMsgId itemId) const;
[[nodiscard]] HistoryItem *nonChannelMessage(MsgId itemId) const;
2019-04-25 12:45:15 +00:00
void updateDependentMessages(not_null<HistoryItem*> item);
void registerDependentMessage(
not_null<HistoryItem*> dependent,
not_null<HistoryItem*> dependency);
void unregisterDependentMessage(
not_null<HistoryItem*> dependent,
not_null<HistoryItem*> dependency);
2021-01-21 15:57:12 +00:00
void destroyAllCallItems();
2019-04-25 12:45:15 +00:00
void registerMessageRandomId(uint64 randomId, FullMsgId itemId);
void unregisterMessageRandomId(uint64 randomId);
[[nodiscard]] FullMsgId messageIdByRandomId(uint64 randomId) const;
void registerMessageSentData(
uint64 randomId,
PeerId peerId,
const QString &text);
void unregisterMessageSentData(uint64 randomId);
[[nodiscard]] SentData messageSentData(uint64 randomId) const;
void photoLoadSettingsChanged();
2018-12-06 15:47:28 +00:00
void documentLoadSettingsChanged();
void notifyPhotoLayoutChanged(not_null<const PhotoData*> photo);
2020-05-25 14:16:04 +00:00
void requestPhotoViewRepaint(not_null<const PhotoData*> photo);
void notifyDocumentLayoutChanged(
not_null<const DocumentData*> document);
void requestDocumentViewRepaint(not_null<const DocumentData*> document);
void markMediaRead(not_null<const DocumentData*> document);
2018-12-18 05:43:11 +00:00
void requestPollViewRepaint(not_null<const PollData*> poll);
2020-05-25 14:16:04 +00:00
void photoLoadProgress(not_null<PhotoData*> photo);
void photoLoadDone(not_null<PhotoData*> photo);
void photoLoadFail(not_null<PhotoData*> photo, bool started);
void documentLoadProgress(not_null<DocumentData*> document);
void documentLoadDone(not_null<DocumentData*> document);
void documentLoadFail(not_null<DocumentData*> document, bool started);
[[nodiscard]] auto documentLoadProgress() const
-> rpl::producer<not_null<DocumentData*>> {
return _documentLoadProgress.events();
}
HistoryItem *addNewMessage(
const MTPMessage &data,
2021-07-28 11:55:02 +00:00
MessageFlags localFlags,
NewMessageType type);
HistoryItem *addNewMessage( // Override message id.
MsgId id,
const MTPMessage &data,
MessageFlags localFlags,
NewMessageType type);
2019-01-03 12:36:01 +00:00
[[nodiscard]] int unreadBadge() const;
[[nodiscard]] bool unreadBadgeMuted() const;
[[nodiscard]] int unreadBadgeIgnoreOne(const Dialogs::Key &key) const;
[[nodiscard]] bool unreadBadgeMutedIgnoreOne(
const Dialogs::Key &key) const;
[[nodiscard]] int unreadOnlyMutedBadge() const;
[[nodiscard]] rpl::producer<> unreadBadgeChanges() const;
void notifyUnreadBadgeChanged();
2019-01-03 12:36:01 +00:00
void updateRepliesReadTill(RepliesReadTillUpdate update);
[[nodiscard]] auto repliesReadTillUpdates() const
-> rpl::producer<RepliesReadTillUpdate>;
void selfDestructIn(not_null<HistoryItem*> item, crl::time delay);
2019-01-03 12:36:01 +00:00
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<PhotoData*> photo(PhotoId id);
not_null<PhotoData*> processPhoto(const MTPPhoto &data);
not_null<PhotoData*> processPhoto(const MTPDphoto &data);
not_null<PhotoData*> processPhoto(
const MTPPhoto &data,
const PreparedPhotoThumbs &thumbs);
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<PhotoData*> photo(
PhotoId id,
const uint64 &access,
2018-07-13 16:49:46 +00:00
const QByteArray &fileReference,
TimeId date,
int32 dc,
bool hasStickers,
2020-05-25 14:16:04 +00:00
const QByteArray &inlineThumbnailBytes,
const ImageWithLocation &small,
const ImageWithLocation &thumbnail,
const ImageWithLocation &large,
const ImageWithLocation &videoSmall,
const ImageWithLocation &videoLarge,
2020-07-03 10:48:55 +00:00
crl::time videoStartTime);
void photoConvert(
not_null<PhotoData*> original,
const MTPPhoto &data);
2019-01-18 12:27:37 +00:00
[[nodiscard]] PhotoData *photoFromWeb(
const MTPWebDocument &data,
const ImageLocation &thumbnailLocation);
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<DocumentData*> document(DocumentId id);
not_null<DocumentData*> processDocument(const MTPDocument &data);
not_null<DocumentData*> processDocument(const MTPDdocument &data);
not_null<DocumentData*> processDocument(
const MTPdocument &data,
const ImageWithLocation &thumbnail);
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<DocumentData*> document(
DocumentId id,
const uint64 &access,
2018-07-13 16:49:46 +00:00
const QByteArray &fileReference,
TimeId date,
const QVector<MTPDocumentAttribute> &attributes,
const QString &mime,
const InlineImageLocation &inlineThumbnail,
const ImageWithLocation &thumbnail,
const ImageWithLocation &videoThumbnail,
bool isPremiumSticker,
int32 dc,
2022-05-10 14:22:28 +00:00
int64 size);
void documentConvert(
not_null<DocumentData*> original,
const MTPDocument &data);
2019-01-18 12:27:37 +00:00
[[nodiscard]] DocumentData *documentFromWeb(
const MTPWebDocument &data,
2020-05-22 15:23:19 +00:00
const ImageLocation &thumbnailLocation,
const ImageLocation &videoThumbnailLocation);
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<WebPageData*> webpage(WebPageId id);
not_null<WebPageData*> processWebpage(const MTPWebPage &data);
not_null<WebPageData*> processWebpage(const MTPDwebPage &data);
not_null<WebPageData*> processWebpage(const MTPDwebPagePending &data);
[[nodiscard]] not_null<WebPageData*> webpage(
WebPageId id,
const QString &siteName,
const TextWithEntities &content);
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<WebPageData*> webpage(
WebPageId id,
WebPageType type,
const QString &url,
const QString &displayUrl,
const QString &siteName,
const QString &title,
const TextWithEntities &description,
PhotoData *photo,
DocumentData *document,
WebPageCollage &&collage,
int duration,
const QString &author,
TimeId pendingTill);
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<GameData*> game(GameId id);
not_null<GameData*> processGame(const MTPDgame &data);
[[nodiscard]] not_null<GameData*> game(
GameId id,
const uint64 &accessHash,
const QString &shortName,
const QString &title,
const QString &description,
PhotoData *photo,
DocumentData *document);
void gameConvert(
not_null<GameData*> original,
const MTPGame &data);
2019-01-18 12:27:37 +00:00
[[nodiscard]] not_null<PollData*> poll(PollId id);
not_null<PollData*> processPoll(const MTPPoll &data);
not_null<PollData*> processPoll(const MTPDmessageMediaPoll &data);
2018-12-18 05:43:11 +00:00
[[nodiscard]] not_null<Data::CloudImage*> location(
2019-06-21 12:27:46 +00:00
const LocationPoint &point);
2018-10-11 15:54:57 +00:00
void registerPhotoItem(
not_null<const PhotoData*> photo,
not_null<HistoryItem*> item);
void unregisterPhotoItem(
not_null<const PhotoData*> photo,
not_null<HistoryItem*> item);
void registerDocumentItem(
not_null<const DocumentData*> document,
not_null<HistoryItem*> item);
void unregisterDocumentItem(
not_null<const DocumentData*> document,
not_null<HistoryItem*> item);
void registerWebPageView(
not_null<const WebPageData*> page,
not_null<ViewElement*> view);
void unregisterWebPageView(
not_null<const WebPageData*> page,
not_null<ViewElement*> view);
void registerWebPageItem(
not_null<const WebPageData*> page,
not_null<HistoryItem*> item);
void unregisterWebPageItem(
not_null<const WebPageData*> page,
not_null<HistoryItem*> item);
void registerGameView(
not_null<const GameData*> game,
not_null<ViewElement*> view);
void unregisterGameView(
not_null<const GameData*> game,
not_null<ViewElement*> view);
2018-12-18 05:43:11 +00:00
void registerPollView(
not_null<const PollData*> poll,
not_null<ViewElement*> view);
void unregisterPollView(
not_null<const PollData*> poll,
not_null<ViewElement*> view);
void registerContactView(
UserId contactId,
not_null<ViewElement*> view);
void unregisterContactView(
UserId contactId,
not_null<ViewElement*> view);
void registerContactItem(
UserId contactId,
not_null<HistoryItem*> item);
void unregisterContactItem(
UserId contactId,
not_null<HistoryItem*> item);
2021-01-21 15:57:12 +00:00
void registerCallItem(not_null<HistoryItem*> item);
void unregisterCallItem(not_null<HistoryItem*> item);
void documentMessageRemoved(not_null<DocumentData*> document);
void checkPlayingAnimations();
HistoryItem *findWebPageItem(not_null<WebPageData*> page) const;
QString findContactPhone(not_null<UserData*> contact) const;
QString findContactPhone(UserId contactId) const;
void notifyWebPageUpdateDelayed(not_null<WebPageData*> page);
void notifyGameUpdateDelayed(not_null<GameData*> game);
2018-12-18 05:43:11 +00:00
void notifyPollUpdateDelayed(not_null<PollData*> poll);
[[nodiscard]] bool hasPendingWebPageGamePollNotification() const;
2018-12-18 05:43:11 +00:00
void sendWebPageGamePollNotifications();
[[nodiscard]] rpl::producer<not_null<WebPageData*>> webPageUpdates() const;
void channelDifferenceTooLong(not_null<ChannelData*> channel);
[[nodiscard]] rpl::producer<not_null<ChannelData*>> channelDifferenceTooLong() const;
void registerItemView(not_null<ViewElement*> view);
void unregisterItemView(not_null<ViewElement*> view);
2019-04-15 11:54:03 +00:00
[[nodiscard]] not_null<Folder*> folder(FolderId id);
2019-04-19 08:47:49 +00:00
[[nodiscard]] Folder *folderLoaded(FolderId id) const;
2019-04-15 11:54:03 +00:00
not_null<Folder*> processFolder(const MTPFolder &data);
not_null<Folder*> processFolder(const MTPDfolder &data);
[[nodiscard]] not_null<Dialogs::MainList*> chatsListFor(
not_null<Dialogs::Entry*> entry);
2020-02-07 11:34:05 +00:00
[[nodiscard]] not_null<Dialogs::MainList*> chatsList(
Data::Folder *folder = nullptr);
[[nodiscard]] not_null<const Dialogs::MainList*> chatsList(
2019-04-22 14:22:39 +00:00
Data::Folder *folder = nullptr) const;
2020-02-07 11:34:05 +00:00
[[nodiscard]] not_null<Dialogs::IndexedList*> contactsList();
[[nodiscard]] not_null<Dialogs::IndexedList*> contactsNoChatsList();
2020-06-12 14:09:04 +00:00
struct ChatListEntryRefresh {
Dialogs::Key key;
Dialogs::PositionChange moved;
2020-06-12 14:09:04 +00:00
FilterId filterId = 0;
bool existenceChanged = false;
explicit operator bool() const {
return existenceChanged || (moved.from != moved.to);
}
};
2020-06-12 14:09:04 +00:00
void refreshChatListEntry(Dialogs::Key key);
void removeChatListEntry(Dialogs::Key key);
2020-06-12 14:09:04 +00:00
[[nodiscard]] auto chatListEntryRefreshes() const
-> rpl::producer<ChatListEntryRefresh>;
struct DialogsRowReplacement {
not_null<Dialogs::Row*> old;
Dialogs::Row *now = nullptr;
};
void dialogsRowReplaced(DialogsRowReplacement replacement);
rpl::producer<DialogsRowReplacement> dialogsRowReplacements() const;
void serviceNotification(
const TextWithEntities &message,
const MTPMessageMedia &media = MTP_messageMediaEmpty());
void setMimeForwardIds(MessageIdsList &&list);
MessageIdsList takeMimeForwardIds();
void setTopPromoted(
History *promoted,
const QString &type,
const QString &message);
2019-01-16 12:25:29 +00:00
bool updateWallpapers(const MTPaccount_WallPapers &data);
2019-02-09 13:36:07 +00:00
void removeWallpaper(const WallPaper &paper);
2019-01-16 12:25:29 +00:00
const std::vector<WallPaper> &wallpapers() const;
2021-08-25 08:15:05 +00:00
uint64 wallpapersHash() const;
2019-01-03 12:36:01 +00:00
struct WebViewResultSent {
uint64 queryId = 0;
};
void webViewResultSent(WebViewResultSent &&sent);
[[nodiscard]] rpl::producer<WebViewResultSent> webViewResultSent() const;
2019-01-03 12:36:01 +00:00
void clearLocalStorage();
private:
2020-02-20 08:45:25 +00:00
using Messages = std::unordered_map<MsgId, not_null<HistoryItem*>>;
2019-04-25 12:45:15 +00:00
2018-06-22 23:18:43 +00:00
void suggestStartExport();
2020-06-12 14:09:04 +00:00
void setupMigrationViewer();
void setupChannelLeavingViewer();
void setupPeerNameViewer();
void setupUserIsContactViewer();
2019-01-03 12:36:01 +00:00
void checkSelfDestructItems();
2019-04-22 14:22:39 +00:00
2021-02-02 14:42:26 +00:00
void scheduleNextTTLs();
void checkTTLs();
int computeUnreadBadge(const Dialogs::UnreadState &state) const;
bool computeUnreadBadgeMuted(const Dialogs::UnreadState &state) const;
2019-01-03 12:36:01 +00:00
2019-04-22 14:22:39 +00:00
void applyDialog(Data::Folder *requestFolder, const MTPDdialog &data);
void applyDialog(
Data::Folder *requestFolder,
const MTPDdialogFolder &data);
const Messages *messagesList(PeerId peerId) const;
not_null<Messages*> messagesListForInsert(PeerId peerId);
2020-02-20 08:45:25 +00:00
not_null<HistoryItem*> registerMessage(
std::unique_ptr<HistoryItem> item);
2022-10-04 15:34:45 +00:00
HistoryItem *changeMessageId(PeerId peerId, MsgId wasId, MsgId nowId);
void removeDependencyMessage(not_null<HistoryItem*> item);
2019-04-25 12:45:15 +00:00
void photoApplyFields(
not_null<PhotoData*> photo,
const MTPPhoto &data);
void photoApplyFields(
not_null<PhotoData*> photo,
const MTPDphoto &data);
void photoApplyFields(
not_null<PhotoData*> photo,
const uint64 &access,
2018-07-13 16:49:46 +00:00
const QByteArray &fileReference,
TimeId date,
int32 dc,
bool hasStickers,
2020-05-25 14:16:04 +00:00
const QByteArray &inlineThumbnailBytes,
const ImageWithLocation &small,
const ImageWithLocation &thumbnail,
const ImageWithLocation &large,
const ImageWithLocation &videoSmall,
const ImageWithLocation &videoLarge,
2020-07-03 10:48:55 +00:00
crl::time videoStartTime);
void documentApplyFields(
not_null<DocumentData*> document,
const MTPDocument &data);
void documentApplyFields(
not_null<DocumentData*> document,
const MTPDdocument &data);
void documentApplyFields(
not_null<DocumentData*> document,
const uint64 &access,
2018-07-13 16:49:46 +00:00
const QByteArray &fileReference,
TimeId date,
const QVector<MTPDocumentAttribute> &attributes,
const QString &mime,
const InlineImageLocation &inlineThumbnail,
const ImageWithLocation &thumbnail,
const ImageWithLocation &videoThumbnail,
bool isPremiumSticker,
int32 dc,
2022-05-10 14:22:28 +00:00
int64 size);
DocumentData *documentFromWeb(
const MTPDwebDocument &data,
2020-05-22 15:23:19 +00:00
const ImageLocation &thumbnailLocation,
const ImageLocation &videoThumbnailLocation);
DocumentData *documentFromWeb(
const MTPDwebDocumentNoProxy &data,
2020-05-22 15:23:19 +00:00
const ImageLocation &thumbnailLocation,
const ImageLocation &videoThumbnailLocation);
void webpageApplyFields(
not_null<WebPageData*> page,
const MTPDwebPage &data);
void webpageApplyFields(
not_null<WebPageData*> page,
WebPageType type,
const QString &url,
const QString &displayUrl,
const QString &siteName,
const QString &title,
const TextWithEntities &description,
PhotoData *photo,
DocumentData *document,
WebPageCollage &&collage,
int duration,
const QString &author,
TimeId pendingTill);
void gameApplyFields(
not_null<GameData*> game,
const MTPDgame &data);
void gameApplyFields(
not_null<GameData*> game,
const uint64 &accessHash,
const QString &shortName,
const QString &title,
const QString &description,
PhotoData *photo,
DocumentData *document);
2019-04-19 08:47:49 +00:00
void setPinnedFromDialog(const Dialogs::Key &key, bool pinned);
template <typename Method>
void enumerateItemViews(
not_null<const HistoryItem*> item,
Method method);
void insertCheckedServiceNotification(
const TextWithEntities &message,
const MTPMessageMedia &media,
TimeId date);
2021-08-25 08:15:05 +00:00
void setWallpapers(const QVector<MTPWallPaper> &data, uint64 hash);
2019-01-16 12:25:29 +00:00
2020-04-07 12:10:34 +00:00
void checkPollsClosings();
2020-06-25 07:14:05 +00:00
const not_null<Main::Session*> _session;
Storage::DatabasePointer _cache;
Storage::DatabasePointer _bigFileCache;
2018-06-22 23:18:43 +00:00
TimeId _exportAvailableAt = 0;
2019-09-18 11:19:05 +00:00
QPointer<Ui::BoxContent> _exportSuggestion;
rpl::variable<bool> _contactsLoaded = false;
rpl::event_stream<Data::Folder*> _chatsListLoadedEvents;
rpl::event_stream<Data::Folder*> _chatsListChanged;
2020-06-10 18:08:17 +00:00
rpl::event_stream<not_null<UserData*>> _userIsBotChanges;
rpl::event_stream<not_null<PeerData*>> _botCommandsChanges;
rpl::event_stream<ItemVisibilityQuery> _itemVisibilityQueries;
rpl::event_stream<IdChange> _itemIdChanges;
rpl::event_stream<not_null<const HistoryItem*>> _itemLayoutChanges;
rpl::event_stream<not_null<const ViewElement*>> _viewLayoutChanges;
2021-07-19 10:02:36 +00:00
rpl::event_stream<not_null<HistoryItem*>> _newItemAdded;
rpl::event_stream<not_null<const HistoryItem*>> _itemRepaintRequest;
rpl::event_stream<not_null<const ViewElement*>> _viewRepaintRequest;
rpl::event_stream<not_null<const HistoryItem*>> _itemResizeRequest;
rpl::event_stream<not_null<ViewElement*>> _viewResizeRequest;
2018-01-18 13:59:22 +00:00
rpl::event_stream<not_null<HistoryItem*>> _itemViewRefreshRequest;
rpl::event_stream<not_null<HistoryItem*>> _itemTextRefreshRequest;
rpl::event_stream<not_null<HistoryItem*>> _itemDataChanges;
rpl::event_stream<not_null<HistoryItem*>> _animationPlayInlineRequest;
rpl::event_stream<not_null<const HistoryItem*>> _itemRemoved;
rpl::event_stream<not_null<const ViewElement*>> _viewRemoved;
rpl::event_stream<not_null<const History*>> _historyUnloaded;
rpl::event_stream<not_null<const History*>> _historyCleared;
base::flat_set<not_null<History*>> _historiesChanged;
rpl::event_stream<not_null<History*>> _historyChanged;
rpl::event_stream<MegagroupParticipant> _megagroupParticipantRemoved;
rpl::event_stream<MegagroupParticipant> _megagroupParticipantAdded;
rpl::event_stream<DialogsRowReplacement> _dialogsRowReplacements;
2020-06-12 14:09:04 +00:00
rpl::event_stream<ChatListEntryRefresh> _chatListEntryRefreshes;
rpl::event_stream<> _unreadBadgeChanges;
rpl::event_stream<RepliesReadTillUpdate> _repliesReadTillUpdates;
2019-04-22 14:22:39 +00:00
Dialogs::MainList _chatsList;
Dialogs::IndexedList _contactsList;
Dialogs::IndexedList _contactsNoChatsList;
2019-08-12 16:33:36 +00:00
MsgId _localMessageIdCounter = StartClientMsgId;
std::unordered_map<PeerId, Messages> _messages;
2019-04-25 12:45:15 +00:00
std::map<
not_null<HistoryItem*>,
base::flat_set<not_null<HistoryItem*>>> _dependentMessages;
2021-02-02 14:42:26 +00:00
std::map<TimeId, base::flat_set<not_null<HistoryItem*>>> _ttlMessages;
base::Timer _ttlCheckTimer;
2019-04-25 12:45:15 +00:00
std::unordered_map<MsgId, not_null<HistoryItem*>> _nonChannelMessages;
2019-04-25 12:45:15 +00:00
base::flat_map<uint64, FullMsgId> _messageByRandomId;
base::flat_map<uint64, SentData> _sentMessagesData;
2019-01-03 12:36:01 +00:00
base::Timer _selfDestructTimer;
std::vector<FullMsgId> _selfDestructItems;
std::unordered_map<
PhotoId,
std::unique_ptr<PhotoData>> _photos;
2019-01-03 12:36:01 +00:00
std::unordered_map<
not_null<const PhotoData*>,
base::flat_set<not_null<HistoryItem*>>> _photoItems;
std::unordered_map<
DocumentId,
std::unique_ptr<DocumentData>> _documents;
2019-01-03 12:36:01 +00:00
std::unordered_map<
not_null<const DocumentData*>,
base::flat_set<not_null<HistoryItem*>>> _documentItems;
std::unordered_map<
WebPageId,
std::unique_ptr<WebPageData>> _webpages;
2019-01-03 12:36:01 +00:00
std::unordered_map<
not_null<const WebPageData*>,
base::flat_set<not_null<HistoryItem*>>> _webpageItems;
2019-01-03 12:36:01 +00:00
std::unordered_map<
not_null<const WebPageData*>,
base::flat_set<not_null<ViewElement*>>> _webpageViews;
2018-12-18 05:43:11 +00:00
std::unordered_map<
2019-06-21 12:27:46 +00:00
LocationPoint,
std::unique_ptr<Data::CloudImage>> _locations;
2018-12-18 05:43:11 +00:00
std::unordered_map<
PollId,
std::unique_ptr<PollData>> _polls;
std::unordered_map<
GameId,
std::unique_ptr<GameData>> _games;
2019-01-03 12:36:01 +00:00
std::unordered_map<
not_null<const GameData*>,
base::flat_set<not_null<ViewElement*>>> _gameViews;
2019-01-03 12:36:01 +00:00
std::unordered_map<
2018-12-18 05:43:11 +00:00
not_null<const PollData*>,
base::flat_set<not_null<ViewElement*>>> _pollViews;
2019-01-03 12:36:01 +00:00
std::unordered_map<
UserId,
base::flat_set<not_null<HistoryItem*>>> _contactItems;
2019-01-03 12:36:01 +00:00
std::unordered_map<
UserId,
base::flat_set<not_null<ViewElement*>>> _contactViews;
2021-01-21 15:57:12 +00:00
std::unordered_set<not_null<HistoryItem*>> _callItems;
base::flat_set<not_null<WebPageData*>> _webpagesUpdated;
base::flat_set<not_null<GameData*>> _gamesUpdated;
2018-12-18 05:43:11 +00:00
base::flat_set<not_null<PollData*>> _pollsUpdated;
rpl::event_stream<not_null<WebPageData*>> _webpageUpdates;
rpl::event_stream<not_null<ChannelData*>> _channelDifferenceTooLong;
rpl::event_stream<not_null<DocumentData*>> _documentLoadProgress;
2021-02-19 13:53:20 +00:00
base::flat_set<not_null<ChannelData*>> _suggestToGigagroup;
2020-04-07 12:10:34 +00:00
base::flat_multi_map<TimeId, not_null<PollData*>> _pollsClosings;
base::Timer _pollsClosingTimer;
2019-04-15 11:54:03 +00:00
base::flat_map<FolderId, std::unique_ptr<Folder>> _folders;
2019-01-03 12:36:01 +00:00
std::unordered_map<
not_null<const HistoryItem*>,
std::vector<not_null<ViewElement*>>> _views;
rpl::event_stream<> _pinnedDialogsOrderUpdated;
2019-05-14 09:50:44 +00:00
base::flat_set<not_null<ViewElement*>> _heavyViewParts;
2020-11-24 11:56:46 +00:00
base::flat_map<uint64, not_null<GroupCall*>> _groupCalls;
2020-12-16 11:58:53 +00:00
rpl::event_stream<InviteToCall> _invitesToCalls;
base::flat_map<uint64, base::flat_set<not_null<UserData*>>> _invitedToCallUsers;
2020-11-24 11:56:46 +00:00
base::flat_set<not_null<ViewElement*>> _shownSpoilers;
History *_topPromoted = nullptr;
2019-01-03 12:36:01 +00:00
std::unordered_map<PeerId, std::unique_ptr<PeerData>> _peers;
MessageIdsList _mimeForwardIds;
using CredentialsWithGeneration = std::pair<
const Passport::SavedCredentials,
int>;
std::unique_ptr<CredentialsWithGeneration> _passportCredentials;
2019-01-03 12:36:01 +00:00
std::vector<WallPaper> _wallpapers;
2021-08-25 08:15:05 +00:00
uint64 _wallpapersHash = 0;
2019-01-03 12:36:01 +00:00
rpl::event_stream<WebViewResultSent> _webViewResultSent;
2019-08-08 14:13:26 +00:00
Groups _groups;
const std::unique_ptr<ChatFilters> _chatsFilters;
std::unique_ptr<ScheduledMessages> _scheduledMessages;
const std::unique_ptr<CloudThemes> _cloudThemes;
const std::unique_ptr<SendActionManager> _sendActionManager;
const std::unique_ptr<Streaming> _streaming;
const std::unique_ptr<MediaRotation> _mediaRotation;
const std::unique_ptr<Histories> _histories;
const std::unique_ptr<Stickers> _stickers;
2021-09-26 18:24:47 +00:00
std::unique_ptr<SponsoredMessages> _sponsoredMessages;
const std::unique_ptr<Reactions> _reactions;
const std::unique_ptr<EmojiStatuses> _emojiStatuses;
const std::unique_ptr<NotifySettings> _notifySettings;
const std::unique_ptr<CustomEmojiManager> _customEmojiManager;
MsgId _nonHistoryEntryId = ServerMaxMsgId.bare + ScheduledMsgIdsRange;
2019-08-08 14:13:26 +00:00
rpl::lifetime _lifetime;
};
} // namespace Data