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/MessageContentType.h"
10 #include "td/telegram/secret_api.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/StringBuilder.h"
16 
17 namespace td {
18 
19 class DialogAction {
20   enum class Type : int32 {
21     Cancel,
22     Typing,
23     RecordingVideo,
24     UploadingVideo,
25     RecordingVoiceNote,
26     UploadingVoiceNote,
27     UploadingPhoto,
28     UploadingDocument,
29     ChoosingLocation,
30     ChoosingContact,
31     StartPlayingGame,
32     RecordingVideoNote,
33     UploadingVideoNote,
34     SpeakingInVoiceChat,
35     ImportingMessages,
36     ChoosingSticker,
37     WatchingAnimations,
38     ClickingAnimatedEmoji
39   };
40   Type type_ = Type::Cancel;
41   int32 progress_ = 0;
42   string emoji_;
43 
44   DialogAction(Type type, int32 progress);
45 
46   void init(Type type);
47 
48   void init(Type type, int32 progress);
49 
50   void init(Type type, string emoji);
51 
52   void init(Type type, int32 message_id, string emoji, const string &data);
53 
54   static bool is_valid_emoji(string &emoji);
55 
56  public:
57   DialogAction() = default;
58 
59   explicit DialogAction(td_api::object_ptr<td_api::ChatAction> &&action);
60 
61   explicit DialogAction(telegram_api::object_ptr<telegram_api::SendMessageAction> &&action);
62 
63   tl_object_ptr<telegram_api::SendMessageAction> get_input_send_message_action() const;
64 
65   tl_object_ptr<secret_api::SendMessageAction> get_secret_input_send_message_action() const;
66 
67   td_api::object_ptr<td_api::ChatAction> get_chat_action_object() const;
68 
69   bool is_canceled_by_message_of_type(MessageContentType message_content_type) const;
70 
71   static DialogAction get_uploading_action(MessageContentType message_content_type, int32 progress);
72 
73   static DialogAction get_typing_action();
74 
75   static DialogAction get_speaking_action();
76 
77   int32 get_importing_messages_action_progress() const;
78 
79   string get_watching_animations_emoji() const;
80 
81   struct ClickingAnimateEmojiInfo {
82     int32 message_id = 0;
83     string emoji;
84     string data;
85   };
86   ClickingAnimateEmojiInfo get_clicking_animated_emoji_action_info() const;
87 
88   friend bool operator==(const DialogAction &lhs, const DialogAction &rhs) {
89     return lhs.type_ == rhs.type_ && lhs.progress_ == rhs.progress_ && lhs.emoji_ == rhs.emoji_;
90   }
91 
92   friend StringBuilder &operator<<(StringBuilder &string_builder, const DialogAction &action);
93 };
94 
95 inline bool operator!=(const DialogAction &lhs, const DialogAction &rhs) {
96   return !(lhs == rhs);
97 }
98 
99 StringBuilder &operator<<(StringBuilder &string_builder, const DialogAction &action);
100 
101 }  // namespace td
102