1 // 2 // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2021 3 // 4 // Distributed under the Boost Software License, Version 1.0. (See accompanying 5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 // 7 #pragma once 8 9 #include "td/telegram/DialogFilterId.h" 10 #include "td/telegram/InputDialogId.h" 11 #include "td/telegram/td_api.h" 12 #include "td/telegram/telegram_api.h" 13 14 #include "td/utils/common.h" 15 #include "td/utils/Status.h" 16 #include "td/utils/StringBuilder.h" 17 18 #include <unordered_map> 19 20 namespace td { 21 22 class DialogFilter { 23 public: 24 static constexpr int32 MAX_INCLUDED_FILTER_DIALOGS = 100; // server side limit 25 26 DialogFilterId dialog_filter_id; 27 string title; 28 string emoji; 29 vector<InputDialogId> pinned_dialog_ids; 30 vector<InputDialogId> included_dialog_ids; 31 vector<InputDialogId> excluded_dialog_ids; 32 bool exclude_muted = false; 33 bool exclude_read = false; 34 bool exclude_archived = false; 35 bool include_contacts = false; 36 bool include_non_contacts = false; 37 bool include_bots = false; 38 bool include_groups = false; 39 bool include_channels = false; 40 41 template <class StorerT> 42 void store(StorerT &storer) const; 43 44 template <class ParserT> 45 void parse(ParserT &parser); 46 47 static unique_ptr<DialogFilter> get_dialog_filter(telegram_api::object_ptr<telegram_api::dialogFilter> filter, 48 bool with_id); 49 50 void remove_secret_chat_dialog_ids(); 51 52 bool is_empty(bool for_server) const; 53 54 Status check_limits() const; 55 56 static string get_emoji_by_icon_name(const string &icon_name); 57 58 string get_icon_name() const; 59 60 static string get_default_icon_name(const td_api::chatFilter *filter); 61 62 telegram_api::object_ptr<telegram_api::dialogFilter> get_input_dialog_filter() const; 63 64 td_api::object_ptr<td_api::chatFilterInfo> get_chat_filter_info_object() const; 65 66 // merges changes from old_server_filter to new_server_filter in old_filter 67 static unique_ptr<DialogFilter> merge_dialog_filter_changes(const DialogFilter *old_filter, 68 const DialogFilter *old_server_filter, 69 const DialogFilter *new_server_filter); 70 71 static bool are_similar(const DialogFilter &lhs, const DialogFilter &rhs); 72 73 static bool are_equivalent(const DialogFilter &lhs, const DialogFilter &rhs); 74 75 static bool are_flags_equal(const DialogFilter &lhs, const DialogFilter &rhs); 76 77 private: 78 static std::unordered_map<string, string> emoji_to_icon_name_; 79 static std::unordered_map<string, string> icon_name_to_emoji_; 80 81 static void init_icon_names(); 82 }; 83 84 inline bool operator==(const DialogFilter &lhs, const DialogFilter &rhs) { 85 return lhs.dialog_filter_id == rhs.dialog_filter_id && lhs.title == rhs.title && lhs.emoji == rhs.emoji && 86 lhs.pinned_dialog_ids == rhs.pinned_dialog_ids && lhs.included_dialog_ids == rhs.included_dialog_ids && 87 lhs.excluded_dialog_ids == rhs.excluded_dialog_ids && DialogFilter::are_flags_equal(lhs, rhs); 88 } 89 90 inline bool operator!=(const DialogFilter &lhs, const DialogFilter &rhs) { 91 return !(lhs == rhs); 92 } 93 94 inline bool operator==(const unique_ptr<DialogFilter> &lhs, const unique_ptr<DialogFilter> &rhs) { 95 return *lhs == *rhs; 96 } 97 98 inline bool operator!=(const unique_ptr<DialogFilter> &lhs, const unique_ptr<DialogFilter> &rhs) { 99 return !(lhs == rhs); 100 } 101 102 StringBuilder &operator<<(StringBuilder &string_builder, const DialogFilter &filter); 103 104 } // namespace td 105