/* 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 "dialogs/dialogs_entry.h" #include "data/data_messages.h" class ChannelData; namespace Data { class Session; class Feed; enum class FeedUpdateFlag { Channels, ChannelPhoto, }; struct FeedUpdate { not_null<Data::Feed*> feed; FeedUpdateFlag flag; }; //MessagePosition FeedPositionFromMTP(const MTPFeedPosition &position); // #feed class Feed : public Dialogs::Entry { public: static constexpr auto kId = 1; static constexpr auto kChannelsLimit = 1000; Feed(FeedId id, not_null<Data::Session*> parent); FeedId id() const; void registerOne(not_null<ChannelData*> channel); void unregisterOne(not_null<ChannelData*> channel); void updateLastMessage(not_null<HistoryItem*> item); void messageRemoved(not_null<HistoryItem*> item); void historyCleared(not_null<History*> history); //void applyDialog(const MTPDdialogFeed &data); // #feed void setUnreadCounts(int unreadNonMutedCount, int unreadMutedCount); void setUnreadPosition(const MessagePosition &position); void unreadCountChanged( int unreadCountDelta, int mutedCountDelta); rpl::producer<int> unreadCountValue() const; MessagePosition unreadPosition() const; rpl::producer<MessagePosition> unreadPositionChanges() const; HistoryItem *lastMessage() const; bool lastMessageKnown() const; int unreadCount() const; bool unreadCountKnown() const; bool useProxyPromotion() const override; bool toImportant() const override; bool shouldBeInChatList() const override; int chatListUnreadCount() const override; bool chatListUnreadMark() const override; bool chatListMutedBadge() const override; HistoryItem *chatsListItem() const override; const QString &chatsListName() const override; const base::flat_set<QString> &chatsListNameWords() const override; const base::flat_set<QChar> &chatsListFirstLetters() const override; void changedInChatListHook(Dialogs::Mode list, bool added) override; void loadUserpic() override; void paintUserpic( Painter &p, int x, int y, int size) const override; const std::vector<not_null<History*>> &channels() const; int32 channelsHash() const; bool channelsLoaded() const; void setChannelsLoaded(bool loaded); void setChannels(std::vector<not_null<ChannelData*>> channels); private: void indexNameParts(); void recountLastMessage(); void setLastMessageFromChannels(); bool justUpdateLastMessage(not_null<HistoryItem*> item); void updateChatsListDate(); void changeChannelsList( const std::vector<not_null<ChannelData*>> &add, const std::vector<not_null<ChannelData*>> &remove); FeedId _id = 0; not_null<Data::Session*> _parent; std::vector<not_null<History*>> _channels; bool _settingChannels = false; bool _channelsLoaded = false; QString _name; base::flat_set<QString> _nameWords; base::flat_set<QChar> _nameFirstLetters; std::optional<HistoryItem*> _lastMessage; rpl::variable<MessagePosition> _unreadPosition; std::optional<int> _unreadCount; rpl::event_stream<int> _unreadCountChanges; int _unreadMutedCount = 0; }; } // namespace Data