2024-02-21 18:43:55 +01:00
|
|
|
//
|
|
|
|
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2023
|
|
|
|
//
|
|
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
//
|
|
|
|
#pragma once
|
|
|
|
|
2024-02-21 20:06:07 +01:00
|
|
|
#include "td/telegram/DialogId.h"
|
|
|
|
#include "td/telegram/MessageId.h"
|
2024-02-24 01:16:56 +01:00
|
|
|
#include "td/telegram/QuickReplyShortcutId.h"
|
2024-02-21 20:06:07 +01:00
|
|
|
#include "td/telegram/td_api.h"
|
|
|
|
#include "td/telegram/UserId.h"
|
|
|
|
|
2024-02-21 18:43:55 +01:00
|
|
|
#include "td/actor/actor.h"
|
|
|
|
|
|
|
|
#include "td/utils/common.h"
|
2024-02-24 01:06:20 +01:00
|
|
|
#include "td/utils/FlatHashSet.h"
|
|
|
|
#include "td/utils/Promise.h"
|
2024-02-21 18:43:55 +01:00
|
|
|
|
2024-02-22 19:44:13 +01:00
|
|
|
#include <utility>
|
|
|
|
|
2024-02-21 18:43:55 +01:00
|
|
|
namespace td {
|
|
|
|
|
2024-02-21 20:06:07 +01:00
|
|
|
class Dependencies;
|
|
|
|
class MessageContent;
|
|
|
|
class MessageForwardInfo;
|
2024-02-21 18:43:55 +01:00
|
|
|
class Td;
|
|
|
|
|
|
|
|
class QuickReplyManager final : public Actor {
|
|
|
|
public:
|
|
|
|
QuickReplyManager(Td *td, ActorShared<> parent);
|
|
|
|
|
2024-02-22 21:04:36 +01:00
|
|
|
void get_quick_reply_shortcuts(Promise<Unit> &&promise);
|
2024-02-22 15:32:12 +01:00
|
|
|
|
2024-02-24 01:02:42 +01:00
|
|
|
void delete_quick_reply_shortcut(const string &name, Promise<Unit> &&promise);
|
|
|
|
|
2024-02-24 12:40:25 +01:00
|
|
|
void reorder_quick_reply_shortcuts(const vector<string> &names, Promise<Unit> &&promise);
|
|
|
|
|
2024-02-22 15:32:12 +01:00
|
|
|
void reload_quick_reply_shortcuts();
|
|
|
|
|
2024-02-22 19:26:17 +01:00
|
|
|
void get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const;
|
|
|
|
|
2024-02-21 18:43:55 +01:00
|
|
|
private:
|
2024-02-21 20:06:07 +01:00
|
|
|
struct QuickReplyMessage {
|
2024-02-22 15:32:12 +01:00
|
|
|
QuickReplyMessage() = default;
|
|
|
|
QuickReplyMessage(const QuickReplyMessage &) = delete;
|
|
|
|
QuickReplyMessage &operator=(const QuickReplyMessage &) = delete;
|
|
|
|
QuickReplyMessage(QuickReplyMessage &&) = delete;
|
|
|
|
QuickReplyMessage &operator=(QuickReplyMessage &&) = delete;
|
|
|
|
~QuickReplyMessage();
|
|
|
|
|
2024-02-21 20:06:07 +01:00
|
|
|
MessageId message_id;
|
2024-02-24 01:16:56 +01:00
|
|
|
QuickReplyShortcutId shortcut_id;
|
2024-02-21 20:06:07 +01:00
|
|
|
int32 sending_id = 0; // for yet unsent messages
|
2024-02-22 19:40:07 +01:00
|
|
|
int32 edit_date = 0;
|
2024-02-21 20:06:07 +01:00
|
|
|
|
|
|
|
int64 random_id = 0; // for send_message
|
|
|
|
|
|
|
|
unique_ptr<MessageForwardInfo> forward_info;
|
|
|
|
|
2024-02-21 20:27:46 +01:00
|
|
|
MessageId reply_to_message_id;
|
2024-02-21 20:06:07 +01:00
|
|
|
|
2024-02-21 20:27:46 +01:00
|
|
|
string send_emoji; // for send_message
|
2024-02-21 20:06:07 +01:00
|
|
|
|
|
|
|
UserId via_bot_user_id;
|
|
|
|
|
|
|
|
bool is_failed_to_send = false;
|
|
|
|
bool disable_notification = false;
|
|
|
|
bool noforwards = false;
|
|
|
|
bool invert_media = false;
|
|
|
|
|
|
|
|
bool is_copy = false; // for send_message
|
|
|
|
bool from_background = false; // for send_message
|
|
|
|
bool disable_web_page_preview = false; // for send_message
|
|
|
|
bool hide_via_bot = false; // for resend_message
|
|
|
|
|
|
|
|
DialogId real_forward_from_dialog_id; // for resend_message
|
|
|
|
MessageId real_forward_from_message_id; // for resend_message
|
|
|
|
|
|
|
|
int32 legacy_layer = 0;
|
|
|
|
|
|
|
|
int32 send_error_code = 0;
|
|
|
|
string send_error_message;
|
|
|
|
double try_resend_at = 0;
|
|
|
|
|
|
|
|
int64 media_album_id = 0;
|
|
|
|
|
|
|
|
unique_ptr<MessageContent> content;
|
|
|
|
|
|
|
|
mutable uint64 send_message_log_event_id = 0;
|
2024-02-23 14:17:37 +01:00
|
|
|
|
|
|
|
template <class StorerT>
|
|
|
|
void store(StorerT &storer) const;
|
|
|
|
|
|
|
|
template <class ParserT>
|
|
|
|
void parse(ParserT &parser);
|
2024-02-22 15:32:12 +01:00
|
|
|
};
|
2024-02-21 20:06:07 +01:00
|
|
|
|
2024-02-22 15:32:12 +01:00
|
|
|
struct Shortcut {
|
|
|
|
Shortcut() = default;
|
|
|
|
Shortcut(const Shortcut &) = delete;
|
|
|
|
Shortcut &operator=(const Shortcut &) = delete;
|
|
|
|
Shortcut(Shortcut &&) = delete;
|
|
|
|
Shortcut &operator=(Shortcut &&) = delete;
|
|
|
|
~Shortcut();
|
|
|
|
|
|
|
|
string name_;
|
2024-02-24 01:16:56 +01:00
|
|
|
QuickReplyShortcutId shortcut_id_;
|
2024-02-22 21:08:38 +01:00
|
|
|
int32 server_total_count_ = 0;
|
|
|
|
int32 local_total_count_ = 0;
|
2024-02-22 15:32:12 +01:00
|
|
|
vector<unique_ptr<QuickReplyMessage>> messages_;
|
2024-02-23 14:17:37 +01:00
|
|
|
|
|
|
|
template <class StorerT>
|
|
|
|
void store(StorerT &storer) const;
|
|
|
|
|
|
|
|
template <class ParserT>
|
|
|
|
void parse(ParserT &parser);
|
2024-02-22 15:32:12 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
struct Shortcuts {
|
|
|
|
vector<unique_ptr<Shortcut>> shortcuts_;
|
|
|
|
bool are_inited_ = false;
|
|
|
|
|
2024-02-22 21:04:36 +01:00
|
|
|
vector<Promise<Unit>> load_queries_;
|
2024-02-23 14:17:37 +01:00
|
|
|
|
|
|
|
template <class StorerT>
|
|
|
|
void store(StorerT &storer) const;
|
|
|
|
|
|
|
|
template <class ParserT>
|
|
|
|
void parse(ParserT &parser);
|
2024-02-21 20:06:07 +01:00
|
|
|
};
|
|
|
|
|
2024-02-21 18:43:55 +01:00
|
|
|
void tear_down() final;
|
|
|
|
|
2024-02-21 20:06:07 +01:00
|
|
|
void add_quick_reply_message_dependencies(Dependencies &dependencies, const QuickReplyMessage *m) const;
|
|
|
|
|
|
|
|
unique_ptr<QuickReplyMessage> create_message(telegram_api::object_ptr<telegram_api::Message> message_ptr,
|
|
|
|
const char *source) const;
|
|
|
|
|
2024-02-23 18:22:33 +01:00
|
|
|
bool can_edit_quick_reply_message(const QuickReplyMessage *m) const;
|
|
|
|
|
|
|
|
bool can_resend_quick_reply_message(const QuickReplyMessage *m) const;
|
2024-02-21 20:43:29 +01:00
|
|
|
|
|
|
|
td_api::object_ptr<td_api::MessageSendingState> get_message_sending_state_object(const QuickReplyMessage *m) const;
|
|
|
|
|
|
|
|
td_api::object_ptr<td_api::MessageContent> get_quick_reply_message_message_content_object(
|
|
|
|
const QuickReplyMessage *m) const;
|
|
|
|
|
|
|
|
td_api::object_ptr<td_api::quickReplyMessage> get_quick_reply_message_object(const QuickReplyMessage *m,
|
|
|
|
const char *source) const;
|
|
|
|
|
2024-02-22 15:32:12 +01:00
|
|
|
td_api::object_ptr<td_api::quickReplyShortcut> get_quick_reply_shortcut_object(const Shortcut *s,
|
|
|
|
const char *source) const;
|
|
|
|
|
2024-02-22 17:45:49 +01:00
|
|
|
static int32 get_shortcut_message_count(const Shortcut *s);
|
|
|
|
|
2024-02-22 21:04:36 +01:00
|
|
|
void load_quick_reply_shortcuts(Promise<Unit> &&promise);
|
2024-02-22 15:32:12 +01:00
|
|
|
|
|
|
|
void on_reload_quick_reply_shortcuts(
|
|
|
|
Result<telegram_api::object_ptr<telegram_api::messages_QuickReplies>> r_shortcuts);
|
|
|
|
|
|
|
|
void on_load_quick_reply_success();
|
|
|
|
|
|
|
|
void on_load_quick_reply_fail(Status error);
|
|
|
|
|
2024-02-23 12:49:29 +01:00
|
|
|
int64 get_shortcuts_hash() const;
|
|
|
|
|
2024-02-24 01:16:56 +01:00
|
|
|
Shortcut *get_shortcut(QuickReplyShortcutId shortcut_id);
|
2024-02-22 17:45:49 +01:00
|
|
|
|
2024-02-24 01:02:42 +01:00
|
|
|
Shortcut *get_shortcut(const string &name);
|
|
|
|
|
2024-02-24 11:37:02 +01:00
|
|
|
vector<unique_ptr<Shortcut>>::iterator get_shortcut_it(const string &name);
|
|
|
|
|
2024-02-24 12:22:01 +01:00
|
|
|
bool is_shortcut_list_changed(const vector<unique_ptr<Shortcut>> &new_shortcuts) const;
|
|
|
|
|
2024-02-24 12:40:25 +01:00
|
|
|
vector<QuickReplyShortcutId> get_server_shortcut_ids() const;
|
|
|
|
|
2024-02-22 17:45:49 +01:00
|
|
|
static void sort_quick_reply_messages(vector<unique_ptr<QuickReplyMessage>> &messages);
|
|
|
|
|
2024-02-22 19:44:13 +01:00
|
|
|
using QuickReplyMessageUniqueId = std::pair<MessageId, int32>;
|
|
|
|
|
2024-02-22 19:47:34 +01:00
|
|
|
static QuickReplyMessageUniqueId get_quick_reply_unique_id(const QuickReplyMessage *m);
|
|
|
|
|
2024-02-22 19:44:13 +01:00
|
|
|
static vector<QuickReplyMessageUniqueId> get_quick_reply_unique_ids(
|
2024-02-22 19:40:07 +01:00
|
|
|
const vector<unique_ptr<QuickReplyMessage>> &messages);
|
2024-02-22 17:45:49 +01:00
|
|
|
|
2024-02-22 19:44:13 +01:00
|
|
|
static vector<QuickReplyMessageUniqueId> get_server_quick_reply_unique_ids(
|
2024-02-22 19:40:07 +01:00
|
|
|
const vector<unique_ptr<QuickReplyMessage>> &messages);
|
2024-02-22 17:45:49 +01:00
|
|
|
|
2024-02-22 19:57:43 +01:00
|
|
|
static bool update_shortcut_from(Shortcut *new_shortcut, Shortcut *old_shortcut, bool is_partial,
|
|
|
|
bool *is_object_changed);
|
2024-02-22 17:45:49 +01:00
|
|
|
|
2024-02-22 19:23:19 +01:00
|
|
|
td_api::object_ptr<td_api::updateQuickReplyShortcut> get_update_quick_reply_shortcut_object(const Shortcut *s,
|
|
|
|
const char *source) const;
|
|
|
|
|
|
|
|
void send_update_quick_reply_shortcut(const Shortcut *s, const char *source);
|
|
|
|
|
|
|
|
td_api::object_ptr<td_api::updateQuickReplyShortcutDeleted> get_update_quick_reply_shortcut_deleted_object(
|
|
|
|
const Shortcut *s) const;
|
|
|
|
|
|
|
|
void send_update_quick_reply_shortcut_deleted(const Shortcut *s);
|
|
|
|
|
2024-02-22 20:55:09 +01:00
|
|
|
td_api::object_ptr<td_api::updateQuickReplyShortcuts> get_update_quick_reply_shortcuts_object() const;
|
|
|
|
|
|
|
|
void send_update_quick_reply_shortcuts();
|
|
|
|
|
2024-02-24 01:28:55 +01:00
|
|
|
void delete_quick_reply_shortcut_from_server(QuickReplyShortcutId shortcut_id, Promise<Unit> &&promise);
|
|
|
|
|
2024-02-24 12:40:25 +01:00
|
|
|
void reorder_quick_reply_shortcuts_on_server(vector<QuickReplyShortcutId> shortcut_ids, Promise<Unit> &&promise);
|
|
|
|
|
2024-02-22 15:32:12 +01:00
|
|
|
Shortcuts shortcuts_;
|
|
|
|
|
2024-02-24 01:16:56 +01:00
|
|
|
FlatHashSet<QuickReplyShortcutId, QuickReplyShortcutIdHash> deleted_shortcut_ids_;
|
2024-02-24 01:06:20 +01:00
|
|
|
|
2024-02-21 18:43:55 +01:00
|
|
|
Td *td_;
|
|
|
|
ActorShared<> parent_;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace td
|