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