/* 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 "base/flags.h" class History; namespace Data { class Session; class ChatFilter final { public: enum class Flag : uchar { Contacts = 0x01, NonContacts = 0x02, Groups = 0x04, Broadcasts = 0x08, Bots = 0x10, NoMuted = 0x20, NoRead = 0x40, NoArchive = 0x80, }; friend constexpr inline bool is_flag_type(Flag) { return true; }; using Flags = base::flags; ChatFilter() = default; ChatFilter( FilterId id, const QString &title, Flags flags, base::flat_set> always, base::flat_set> never); [[nodiscard]] static ChatFilter FromTL( const MTPDialogFilter &data, not_null owner); [[nodiscard]] MTPDialogFilter tl() const; [[nodiscard]] FilterId id() const; [[nodiscard]] QString title() const; [[nodiscard]] Flags flags() const; [[nodiscard]] const base::flat_set> &always() const; [[nodiscard]] const base::flat_set> &never() const; [[nodiscard]] bool contains(not_null history) const; private: FilterId _id = 0; QString _title; base::flat_set> _always; base::flat_set> _never; Flags _flags; }; class ChatFilters final { public: explicit ChatFilters(not_null owner); void load(); void apply(const MTPUpdate &update); void set(ChatFilter filter); void remove(FilterId id); [[nodiscard]] const std::vector &list() const; [[nodiscard]] rpl::producer<> changed() const; void refreshHistory(not_null history); [[nodiscard]] auto refreshHistoryRequests() const -> rpl::producer>; private: void load(bool force); bool applyOrder(const QVector &order); bool applyChange(ChatFilter &filter, ChatFilter &&updated); void applyInsert(ChatFilter filter, int position); void applyRemove(int position); const not_null _owner; std::vector _list; rpl::event_stream<> _listChanged; rpl::event_stream> _refreshHistoryRequests; mtpRequestId _loadRequestId = 0; }; } // namespace Data