/* 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 "chat_helpers/stickers.h" #include "dialogs/dialogs_key.h" #include "data/data_groups.h" class HistoryItem; namespace HistoryView { struct Group; class Element; } // namespace HistoryView namespace Data { class Feed; class Session final { public: using ViewElement = HistoryView::Element; Session(); ~Session(); base::Variable &contactsLoaded() { return _contactsLoaded; } base::Variable &allChatsLoaded() { return _allChatsLoaded; } base::Observable &moreChatsLoaded() { return _moreChatsLoaded; } base::Observable &pendingHistoryResize() { return _pendingHistoryResize; } struct ItemVisibilityQuery { not_null item; not_null isVisible; }; base::Observable &queryItemVisibility() { return _queryItemVisibility; } struct IdChange { not_null item; MsgId oldId = 0; }; void registerItemView(not_null view); void unregisterItemView(not_null view); template void enumerateItemViews(not_null item, Method method) { if (const auto i = _views.find(item); i != _views.end()) { for (const auto view : i->second) { method(view); } } } void markItemIdChange(IdChange event); rpl::producer itemIdChanged() const; void markItemLayoutChange(not_null item); rpl::producer> itemLayoutChanged() const; void markViewLayoutChange(not_null view); rpl::producer> viewLayoutChanged() const; void requestItemRepaint(not_null item); rpl::producer> itemRepaintRequest() const; void requestViewRepaint(not_null view); rpl::producer> viewRepaintRequest() const; void requestItemViewResize(not_null item); rpl::producer> itemViewResizeRequest() const; void requestViewResize(not_null view); rpl::producer> viewResizeRequest() const; void requestItemViewRefresh(not_null item); rpl::producer> itemViewRefreshRequest() const; void requestItemPlayInline(not_null item); rpl::producer> itemPlayInlineRequest() const; void markItemRemoved(not_null item); rpl::producer> itemRemoved() const; void markHistoryUnloaded(not_null history); rpl::producer> historyUnloaded() const; void markHistoryCleared(not_null history); rpl::producer> historyCleared() const; using MegagroupParticipant = std::tuple< not_null, not_null>; void removeMegagroupParticipant( not_null channel, not_null user); rpl::producer megagroupParticipantRemoved() const; rpl::producer> megagroupParticipantRemoved( not_null channel) const; void addNewMegagroupParticipant( not_null channel, not_null user); rpl::producer megagroupParticipantAdded() const; rpl::producer> megagroupParticipantAdded( not_null channel) const; void markStickersUpdated(); rpl::producer<> stickersUpdated() const; void markSavedGifsUpdated(); rpl::producer<> savedGifsUpdated() const; bool stickersUpdateNeeded(TimeMs now) const { return stickersUpdateNeeded(_lastStickersUpdate, now); } void setLastStickersUpdate(TimeMs update) { _lastStickersUpdate = update; } bool recentStickersUpdateNeeded(TimeMs now) const { return stickersUpdateNeeded(_lastRecentStickersUpdate, now); } void setLastRecentStickersUpdate(TimeMs update) { _lastRecentStickersUpdate = update; } bool favedStickersUpdateNeeded(TimeMs now) const { return stickersUpdateNeeded(_lastFavedStickersUpdate, now); } void setLastFavedStickersUpdate(TimeMs update) { _lastFavedStickersUpdate = update; } bool featuredStickersUpdateNeeded(TimeMs now) const { return stickersUpdateNeeded(_lastFeaturedStickersUpdate, now); } void setLastFeaturedStickersUpdate(TimeMs update) { _lastFeaturedStickersUpdate = update; } bool savedGifsUpdateNeeded(TimeMs now) const { return stickersUpdateNeeded(_lastSavedGifsUpdate, now); } void setLastSavedGifsUpdate(TimeMs update) { _lastSavedGifsUpdate = update; } int featuredStickerSetsUnreadCount() const { return _featuredStickerSetsUnreadCount.current(); } void setFeaturedStickerSetsUnreadCount(int count) { _featuredStickerSetsUnreadCount = count; } rpl::producer featuredStickerSetsUnreadCountValue() const { return _featuredStickerSetsUnreadCount.value(); } const Stickers::Sets &stickerSets() const { return _stickerSets; } Stickers::Sets &stickerSetsRef() { return _stickerSets; } const Stickers::Order &stickerSetsOrder() const { return _stickerSetsOrder; } Stickers::Order &stickerSetsOrderRef() { return _stickerSetsOrder; } const Stickers::Order &featuredStickerSetsOrder() const { return _featuredStickerSetsOrder; } Stickers::Order &featuredStickerSetsOrderRef() { return _featuredStickerSetsOrder; } const Stickers::Order &archivedStickerSetsOrder() const { return _archivedStickerSetsOrder; } Stickers::Order &archivedStickerSetsOrderRef() { return _archivedStickerSetsOrder; } const Stickers::SavedGifs &savedGifs() const { return _savedGifs; } Stickers::SavedGifs &savedGifsRef() { return _savedGifs; } HistoryItemsList idsToItems(const MessageIdsList &ids) const; MessageIdsList itemsToIds(const HistoryItemsList &items) const; MessageIdsList itemOrItsGroup(not_null item) const; int pinnedDialogsCount() const; const std::deque &pinnedDialogsOrder() const; void setPinnedDialog(const Dialogs::Key &key, bool pinned); void applyPinnedDialogs(const QVector &list); void applyPinnedDialogs(const QVector &list); void reorderTwoPinnedDialogs( const Dialogs::Key &key1, const Dialogs::Key &key2); not_null feed(FeedId id); Data::Feed *feedLoaded(FeedId id); void setMimeForwardIds(MessageIdsList &&list); MessageIdsList takeMimeForwardIds(); Groups &groups() { return _groups; } const Groups &groups() const { return _groups; } private: bool stickersUpdateNeeded(TimeMs lastUpdate, TimeMs now) const { constexpr auto kStickersUpdateTimeout = TimeMs(3600'000); return (lastUpdate == 0) || (now >= lastUpdate + kStickersUpdateTimeout); } void userIsContactUpdated(not_null user); void clearPinnedDialogs(); void setIsPinned(const Dialogs::Key &key, bool pinned); base::Variable _contactsLoaded = { false }; base::Variable _allChatsLoaded = { false }; base::Observable _moreChatsLoaded; base::Observable _pendingHistoryResize; base::Observable _queryItemVisibility; rpl::event_stream _itemIdChanges; rpl::event_stream> _itemLayoutChanges; rpl::event_stream> _viewLayoutChanges; rpl::event_stream> _itemRepaintRequest; rpl::event_stream> _viewRepaintRequest; rpl::event_stream> _itemViewResizeRequest; rpl::event_stream> _viewResizeRequest; rpl::event_stream> _itemViewRefreshRequest; rpl::event_stream> _itemPlayInlineRequest; rpl::event_stream> _itemRemoved; rpl::event_stream> _historyUnloaded; rpl::event_stream> _historyCleared; rpl::event_stream _megagroupParticipantRemoved; rpl::event_stream _megagroupParticipantAdded; rpl::event_stream<> _stickersUpdated; rpl::event_stream<> _savedGifsUpdated; TimeMs _lastStickersUpdate = 0; TimeMs _lastRecentStickersUpdate = 0; TimeMs _lastFavedStickersUpdate = 0; TimeMs _lastFeaturedStickersUpdate = 0; TimeMs _lastSavedGifsUpdate = 0; rpl::variable _featuredStickerSetsUnreadCount = 0; Stickers::Sets _stickerSets; Stickers::Order _stickerSetsOrder; Stickers::Order _featuredStickerSetsOrder; Stickers::Order _archivedStickerSetsOrder; Stickers::SavedGifs _savedGifs; std::deque _pinnedDialogs; base::flat_map> _feeds; Groups _groups; std::map< not_null, std::vector>> _views; MessageIdsList _mimeForwardIds; rpl::lifetime _lifetime; }; } // namespace Data