Add class MessageEffectId.

This commit is contained in:
levlam 2024-06-05 17:01:11 +03:00
parent 65c6f3a23a
commit 8827ffbbd6
13 changed files with 148 additions and 66 deletions

View File

@ -753,6 +753,7 @@ set(TDLIB_SOURCE_PART2
td/telegram/MessageContentType.h td/telegram/MessageContentType.h
td/telegram/MessageCopyOptions.h td/telegram/MessageCopyOptions.h
td/telegram/MessageDb.h td/telegram/MessageDb.h
td/telegram/MessageEffectId.h
td/telegram/MessageEntity.h td/telegram/MessageEntity.h
td/telegram/MessageExtendedMedia.h td/telegram/MessageExtendedMedia.h
td/telegram/MessageForwardInfo.h td/telegram/MessageForwardInfo.h

View File

@ -369,6 +369,7 @@ function split_file($file, $chunks, $undo) {
'link_manager[_(-](?![.]get[(][)])|LinkManager' => 'LinkManager', 'link_manager[_(-](?![.]get[(][)])|LinkManager' => 'LinkManager',
'LogeventIdWithGeneration|add_log_event|delete_log_event|get_erase_log_event_promise|parse_time|store_time' => 'logevent/LogEventHelper', 'LogeventIdWithGeneration|add_log_event|delete_log_event|get_erase_log_event_promise|parse_time|store_time' => 'logevent/LogEventHelper',
'MessageCopyOptions' => 'MessageCopyOptions', 'MessageCopyOptions' => 'MessageCopyOptions',
'MessageEffectId' => 'MessageEffectId',
'MessageForwardInfo|LastForwardedMessageInfo|forward_info' => 'MessageForwardInfo', 'MessageForwardInfo|LastForwardedMessageInfo|forward_info' => 'MessageForwardInfo',
'MessageFullId' => 'MessageFullId', 'MessageFullId' => 'MessageFullId',
'MessageId' => 'MessageId', 'MessageId' => 'MessageId',

View File

@ -111,7 +111,7 @@ struct BusinessConnectionManager::PendingMessage {
unique_ptr<MessageContent> content_; unique_ptr<MessageContent> content_;
unique_ptr<ReplyMarkup> reply_markup_; unique_ptr<ReplyMarkup> reply_markup_;
int64 random_id_ = 0; int64 random_id_ = 0;
int64 effect_id_ = 0; MessageEffectId effect_id_;
bool noforwards_ = false; bool noforwards_ = false;
bool disable_notification_ = false; bool disable_notification_ = false;
bool invert_media_ = false; bool invert_media_ = false;
@ -140,7 +140,7 @@ class BusinessConnectionManager::SendBusinessMessageQuery final : public Td::Res
if (message_->noforwards_) { if (message_->noforwards_) {
flags |= telegram_api::messages_sendMessage::NOFORWARDS_MASK; flags |= telegram_api::messages_sendMessage::NOFORWARDS_MASK;
} }
if (message_->effect_id_) { if (message_->effect_id_.is_valid()) {
flags |= telegram_api::messages_sendMessage::EFFECT_MASK; flags |= telegram_api::messages_sendMessage::EFFECT_MASK;
} }
if (message_->invert_media_) { if (message_->invert_media_) {
@ -172,7 +172,7 @@ class BusinessConnectionManager::SendBusinessMessageQuery final : public Td::Res
flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/,
false /*ignored*/, false /*ignored*/, std::move(input_peer), std::move(reply_to), message_text->text, false /*ignored*/, false /*ignored*/, std::move(input_peer), std::move(reply_to), message_text->text,
message_->random_id_, get_input_reply_markup(td_->user_manager_.get(), message_->reply_markup_), message_->random_id_, get_input_reply_markup(td_->user_manager_.get(), message_->reply_markup_),
std::move(entities), 0, nullptr, nullptr, message_->effect_id_), std::move(entities), 0, nullptr, nullptr, message_->effect_id_.get()),
td_->business_connection_manager_->get_business_connection_dc_id(message_->business_connection_id_), td_->business_connection_manager_->get_business_connection_dc_id(message_->business_connection_id_),
{{message_->dialog_id_}})); {{message_->dialog_id_}}));
} }
@ -214,7 +214,7 @@ class BusinessConnectionManager::SendBusinessMediaQuery final : public Td::Resul
if (message_->noforwards_) { if (message_->noforwards_) {
flags |= telegram_api::messages_sendMedia::NOFORWARDS_MASK; flags |= telegram_api::messages_sendMedia::NOFORWARDS_MASK;
} }
if (message_->effect_id_) { if (message_->effect_id_.is_valid()) {
flags |= telegram_api::messages_sendMedia::EFFECT_MASK; flags |= telegram_api::messages_sendMedia::EFFECT_MASK;
} }
if (message_->invert_media_) { if (message_->invert_media_) {
@ -246,7 +246,7 @@ class BusinessConnectionManager::SendBusinessMediaQuery final : public Td::Resul
std::move(reply_to), std::move(input_media), std::move(reply_to), std::move(input_media),
message_text == nullptr ? string() : message_text->text, message_->random_id_, message_text == nullptr ? string() : message_text->text, message_->random_id_,
get_input_reply_markup(td_->user_manager_.get(), message_->reply_markup_), get_input_reply_markup(td_->user_manager_.get(), message_->reply_markup_),
std::move(entities), 0, nullptr, nullptr, message_->effect_id_), std::move(entities), 0, nullptr, nullptr, message_->effect_id_.get()),
td_->business_connection_manager_->get_business_connection_dc_id(message_->business_connection_id_), td_->business_connection_manager_->get_business_connection_dc_id(message_->business_connection_id_),
{{message_->dialog_id_}})); {{message_->dialog_id_}}));
} }
@ -289,7 +289,7 @@ class BusinessConnectionManager::SendBusinessMultiMediaQuery final : public Td::
if (messages_[0]->noforwards_) { if (messages_[0]->noforwards_) {
flags |= telegram_api::messages_sendMultiMedia::NOFORWARDS_MASK; flags |= telegram_api::messages_sendMultiMedia::NOFORWARDS_MASK;
} }
if (messages_[0]->effect_id_) { if (messages_[0]->effect_id_.is_valid()) {
flags |= telegram_api::messages_sendMultiMedia::EFFECT_MASK; flags |= telegram_api::messages_sendMultiMedia::EFFECT_MASK;
} }
if (messages_[0]->invert_media_) { if (messages_[0]->invert_media_) {
@ -309,7 +309,7 @@ class BusinessConnectionManager::SendBusinessMultiMediaQuery final : public Td::
telegram_api::messages_sendMultiMedia(flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, telegram_api::messages_sendMultiMedia(flags, false /*ignored*/, false /*ignored*/, false /*ignored*/,
false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/,
std::move(input_peer), std::move(reply_to), std::move(input_single_media), std::move(input_peer), std::move(reply_to), std::move(input_single_media),
0, nullptr, nullptr, messages_[0]->effect_id_), 0, nullptr, nullptr, messages_[0]->effect_id_.get()),
td_->business_connection_manager_->get_business_connection_dc_id(messages_[0]->business_connection_id_), td_->business_connection_manager_->get_business_connection_dc_id(messages_[0]->business_connection_id_),
{{messages_[0]->dialog_id_}})); {{messages_[0]->dialog_id_}}));
} }
@ -662,7 +662,7 @@ Result<InputMessageContent> BusinessConnectionManager::process_input_message_con
unique_ptr<BusinessConnectionManager::PendingMessage> BusinessConnectionManager::create_business_message_to_send( unique_ptr<BusinessConnectionManager::PendingMessage> BusinessConnectionManager::create_business_message_to_send(
BusinessConnectionId business_connection_id, DialogId dialog_id, MessageInputReplyTo &&input_reply_to, BusinessConnectionId business_connection_id, DialogId dialog_id, MessageInputReplyTo &&input_reply_to,
bool disable_notification, bool protect_content, int64 effect_id, unique_ptr<ReplyMarkup> &&reply_markup, bool disable_notification, bool protect_content, MessageEffectId effect_id, unique_ptr<ReplyMarkup> &&reply_markup,
InputMessageContent &&input_content) const { InputMessageContent &&input_content) const {
auto content = dup_message_content(td_, td_->dialog_manager_->get_my_dialog_id(), input_content.content.get(), auto content = dup_message_content(td_, td_->dialog_manager_->get_my_dialog_id(), input_content.content.get(),
MessageContentDupType::Send, MessageCopyOptions()); MessageContentDupType::Send, MessageCopyOptions());
@ -685,7 +685,7 @@ unique_ptr<BusinessConnectionManager::PendingMessage> BusinessConnectionManager:
void BusinessConnectionManager::send_message(BusinessConnectionId business_connection_id, DialogId dialog_id, void BusinessConnectionManager::send_message(BusinessConnectionId business_connection_id, DialogId dialog_id,
td_api::object_ptr<td_api::InputMessageReplyTo> &&reply_to, td_api::object_ptr<td_api::InputMessageReplyTo> &&reply_to,
bool disable_notification, bool protect_content, int64 effect_id, bool disable_notification, bool protect_content, MessageEffectId effect_id,
td_api::object_ptr<td_api::ReplyMarkup> &&reply_markup, td_api::object_ptr<td_api::ReplyMarkup> &&reply_markup,
td_api::object_ptr<td_api::InputMessageContent> &&input_message_content, td_api::object_ptr<td_api::InputMessageContent> &&input_message_content,
Promise<td_api::object_ptr<td_api::businessMessage>> &&promise) { Promise<td_api::object_ptr<td_api::businessMessage>> &&promise) {
@ -957,7 +957,7 @@ void BusinessConnectionManager::complete_upload_media(unique_ptr<PendingMessage>
void BusinessConnectionManager::send_message_album( void BusinessConnectionManager::send_message_album(
BusinessConnectionId business_connection_id, DialogId dialog_id, BusinessConnectionId business_connection_id, DialogId dialog_id,
td_api::object_ptr<td_api::InputMessageReplyTo> &&reply_to, bool disable_notification, bool protect_content, td_api::object_ptr<td_api::InputMessageReplyTo> &&reply_to, bool disable_notification, bool protect_content,
int64 effect_id, vector<td_api::object_ptr<td_api::InputMessageContent>> &&input_message_contents, MessageEffectId effect_id, vector<td_api::object_ptr<td_api::InputMessageContent>> &&input_message_contents,
Promise<td_api::object_ptr<td_api::businessMessages>> &&promise) { Promise<td_api::object_ptr<td_api::businessMessages>> &&promise) {
TRY_STATUS_PROMISE(promise, check_business_connection(business_connection_id, dialog_id)); TRY_STATUS_PROMISE(promise, check_business_connection(business_connection_id, dialog_id));

View File

@ -9,6 +9,7 @@
#include "td/telegram/BusinessConnectionId.h" #include "td/telegram/BusinessConnectionId.h"
#include "td/telegram/DialogId.h" #include "td/telegram/DialogId.h"
#include "td/telegram/files/FileId.h" #include "td/telegram/files/FileId.h"
#include "td/telegram/MessageEffectId.h"
#include "td/telegram/MessageInputReplyTo.h" #include "td/telegram/MessageInputReplyTo.h"
#include "td/telegram/net/DcId.h" #include "td/telegram/net/DcId.h"
#include "td/telegram/td_api.h" #include "td/telegram/td_api.h"
@ -61,13 +62,14 @@ class BusinessConnectionManager final : public Actor {
void send_message(BusinessConnectionId business_connection_id, DialogId dialog_id, void send_message(BusinessConnectionId business_connection_id, DialogId dialog_id,
td_api::object_ptr<td_api::InputMessageReplyTo> &&reply_to, bool disable_notification, td_api::object_ptr<td_api::InputMessageReplyTo> &&reply_to, bool disable_notification,
bool protect_content, int64 effect_id, td_api::object_ptr<td_api::ReplyMarkup> &&reply_markup, bool protect_content, MessageEffectId effect_id,
td_api::object_ptr<td_api::ReplyMarkup> &&reply_markup,
td_api::object_ptr<td_api::InputMessageContent> &&input_message_content, td_api::object_ptr<td_api::InputMessageContent> &&input_message_content,
Promise<td_api::object_ptr<td_api::businessMessage>> &&promise); Promise<td_api::object_ptr<td_api::businessMessage>> &&promise);
void send_message_album(BusinessConnectionId business_connection_id, DialogId dialog_id, void send_message_album(BusinessConnectionId business_connection_id, DialogId dialog_id,
td_api::object_ptr<td_api::InputMessageReplyTo> &&reply_to, bool disable_notification, td_api::object_ptr<td_api::InputMessageReplyTo> &&reply_to, bool disable_notification,
bool protect_content, int64 effect_id, bool protect_content, MessageEffectId effect_id,
vector<td_api::object_ptr<td_api::InputMessageContent>> &&input_message_contents, vector<td_api::object_ptr<td_api::InputMessageContent>> &&input_message_contents,
Promise<td_api::object_ptr<td_api::businessMessages>> &&promise); Promise<td_api::object_ptr<td_api::businessMessages>> &&promise);
@ -114,7 +116,8 @@ class BusinessConnectionManager final : public Actor {
unique_ptr<PendingMessage> create_business_message_to_send(BusinessConnectionId business_connection_id, unique_ptr<PendingMessage> create_business_message_to_send(BusinessConnectionId business_connection_id,
DialogId dialog_id, MessageInputReplyTo &&input_reply_to, DialogId dialog_id, MessageInputReplyTo &&input_reply_to,
bool disable_notification, bool protect_content, bool disable_notification, bool protect_content,
int64 effect_id, unique_ptr<ReplyMarkup> &&reply_markup, MessageEffectId effect_id,
unique_ptr<ReplyMarkup> &&reply_markup,
InputMessageContent &&input_content) const; InputMessageContent &&input_content) const;
void do_send_message(unique_ptr<PendingMessage> &&message, void do_send_message(unique_ptr<PendingMessage> &&message,

View File

@ -64,7 +64,7 @@ class SaveDraftMessageQuery final : public Td::ResultHandler {
if (media != nullptr) { if (media != nullptr) {
flags |= telegram_api::messages_saveDraft::MEDIA_MASK; flags |= telegram_api::messages_saveDraft::MEDIA_MASK;
} }
if (draft_message->message_effect_id_ != 0) { if (draft_message->message_effect_id_.is_valid()) {
flags |= telegram_api::messages_saveDraft::EFFECT_MASK; flags |= telegram_api::messages_saveDraft::EFFECT_MASK;
} }
} }
@ -72,7 +72,7 @@ class SaveDraftMessageQuery final : public Td::ResultHandler {
telegram_api::messages_saveDraft( telegram_api::messages_saveDraft(
flags, false /*ignored*/, false /*ignored*/, std::move(input_reply_to), std::move(input_peer), flags, false /*ignored*/, false /*ignored*/, std::move(input_reply_to), std::move(input_peer),
draft_message == nullptr ? string() : draft_message->input_message_text_.text.text, draft_message == nullptr ? string() : draft_message->input_message_text_.text.text,
std::move(input_message_entities), std::move(media), draft_message->message_effect_id_), std::move(input_message_entities), std::move(media), draft_message->message_effect_id_.get()),
{{dialog_id}})); {{dialog_id}}));
} }
@ -405,7 +405,7 @@ td_api::object_ptr<td_api::draftMessage> DraftMessage::get_draft_message_object(
input_message_content = input_message_text_.get_input_message_text_object(); input_message_content = input_message_text_.get_input_message_text_object();
} }
return td_api::make_object<td_api::draftMessage>(message_input_reply_to_.get_input_message_reply_to_object(td), date_, return td_api::make_object<td_api::draftMessage>(message_input_reply_to_.get_input_message_reply_to_object(td), date_,
std::move(input_message_content), message_effect_id_); std::move(input_message_content), message_effect_id_.get());
} }
DraftMessage::DraftMessage(Td *td, telegram_api::object_ptr<telegram_api::draftMessage> &&draft_message) { DraftMessage::DraftMessage(Td *td, telegram_api::object_ptr<telegram_api::draftMessage> &&draft_message) {
@ -432,7 +432,7 @@ DraftMessage::DraftMessage(Td *td, telegram_api::object_ptr<telegram_api::draftM
} }
input_message_text_ = InputMessageText(std::move(draft_text), std::move(web_page_url), draft_message->no_webpage_, input_message_text_ = InputMessageText(std::move(draft_text), std::move(web_page_url), draft_message->no_webpage_,
force_small_media, force_large_media, draft_message->invert_media_, false); force_small_media, force_large_media, draft_message->invert_media_, false);
message_effect_id_ = draft_message->effect_; message_effect_id_ = MessageEffectId(draft_message->effect_);
} }
Result<unique_ptr<DraftMessage>> DraftMessage::get_draft_message( Result<unique_ptr<DraftMessage>> DraftMessage::get_draft_message(
@ -445,7 +445,7 @@ Result<unique_ptr<DraftMessage>> DraftMessage::get_draft_message(
auto result = make_unique<DraftMessage>(); auto result = make_unique<DraftMessage>();
result->message_input_reply_to_ = td->messages_manager_->create_message_input_reply_to( result->message_input_reply_to_ = td->messages_manager_->create_message_input_reply_to(
dialog_id, top_thread_message_id, std::move(draft_message->reply_to_), true); dialog_id, top_thread_message_id, std::move(draft_message->reply_to_), true);
result->message_effect_id_ = draft_message->effect_id_; result->message_effect_id_ = MessageEffectId(draft_message->effect_id_);
auto input_message_content = std::move(draft_message->input_message_text_); auto input_message_content = std::move(draft_message->input_message_text_);
if (input_message_content != nullptr) { if (input_message_content != nullptr) {

View File

@ -10,6 +10,7 @@
#include "td/telegram/InputMessageText.h" #include "td/telegram/InputMessageText.h"
#include "td/telegram/logevent/LogEvent.h" #include "td/telegram/logevent/LogEvent.h"
#include "td/telegram/MessageContentType.h" #include "td/telegram/MessageContentType.h"
#include "td/telegram/MessageEffectId.h"
#include "td/telegram/MessageId.h" #include "td/telegram/MessageId.h"
#include "td/telegram/MessageInputReplyTo.h" #include "td/telegram/MessageInputReplyTo.h"
#include "td/telegram/td_api.h" #include "td/telegram/td_api.h"
@ -46,7 +47,7 @@ class DraftMessage {
MessageInputReplyTo message_input_reply_to_; MessageInputReplyTo message_input_reply_to_;
InputMessageText input_message_text_; InputMessageText input_message_text_;
unique_ptr<DraftMessageContent> local_content_; unique_ptr<DraftMessageContent> local_content_;
int64 message_effect_id_ = 0; MessageEffectId message_effect_id_;
friend class SaveDraftMessageQuery; friend class SaveDraftMessageQuery;

View File

@ -22,7 +22,7 @@ void DraftMessage::store(StorerT &storer) const {
bool has_input_message_text = !input_message_text_.is_empty(); bool has_input_message_text = !input_message_text_.is_empty();
bool has_message_input_reply_to = !message_input_reply_to_.is_empty(); bool has_message_input_reply_to = !message_input_reply_to_.is_empty();
bool has_local_content = local_content_ != nullptr; bool has_local_content = local_content_ != nullptr;
bool has_message_effect_id = message_effect_id_ != 0; bool has_message_effect_id = message_effect_id_.is_valid();
BEGIN_STORE_FLAGS(); BEGIN_STORE_FLAGS();
STORE_FLAG(has_input_message_text); STORE_FLAG(has_input_message_text);
STORE_FLAG(has_message_input_reply_to); STORE_FLAG(has_message_input_reply_to);

View File

@ -0,0 +1,65 @@
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024
//
// 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
#include "td/utils/common.h"
#include "td/utils/HashTableUtils.h"
#include "td/utils/StringBuilder.h"
#include <type_traits>
namespace td {
class MessageEffectId {
int64 id = 0;
public:
MessageEffectId() = default;
explicit constexpr MessageEffectId(int64 message_effect_id) : id(message_effect_id) {
}
template <class T, typename = std::enable_if_t<std::is_convertible<T, int64>::value>>
MessageEffectId(T message_effect_id) = delete;
bool is_valid() const {
return id != 0;
}
int64 get() const {
return id;
}
bool operator==(const MessageEffectId &other) const {
return id == other.id;
}
bool operator!=(const MessageEffectId &other) const {
return id != other.id;
}
template <class StorerT>
void store(StorerT &storer) const {
storer.store_long(id);
}
template <class ParserT>
void parse(ParserT &parser) {
id = parser.fetch_long();
}
};
struct MessageEffectIdHash {
uint32 operator()(MessageEffectId message_effect_id) const {
return Hash<int64>()(message_effect_id.get());
}
};
inline StringBuilder &operator<<(StringBuilder &string_builder, MessageEffectId message_effect_id) {
return string_builder << "message effect " << message_effect_id.get();
}
} // namespace td

View File

@ -2885,7 +2885,7 @@ class SendMessageQuery final : public Td::ResultHandler {
public: public:
void send(int32 flags, DialogId dialog_id, tl_object_ptr<telegram_api::InputPeer> as_input_peer, void send(int32 flags, DialogId dialog_id, tl_object_ptr<telegram_api::InputPeer> as_input_peer,
const MessageInputReplyTo &input_reply_to, MessageId top_thread_message_id, int32 schedule_date, const MessageInputReplyTo &input_reply_to, MessageId top_thread_message_id, int32 schedule_date,
int64 effect_id, tl_object_ptr<telegram_api::ReplyMarkup> &&reply_markup, MessageEffectId effect_id, tl_object_ptr<telegram_api::ReplyMarkup> &&reply_markup,
vector<tl_object_ptr<telegram_api::MessageEntity>> &&entities, const string &text, bool is_copy, vector<tl_object_ptr<telegram_api::MessageEntity>> &&entities, const string &text, bool is_copy,
int64 random_id, NetQueryRef *send_query_ref) { int64 random_id, NetQueryRef *send_query_ref) {
random_id_ = random_id; random_id_ = random_id;
@ -2909,10 +2909,11 @@ class SendMessageQuery final : public Td::ResultHandler {
} }
auto query = G()->net_query_creator().create( auto query = G()->net_query_creator().create(
telegram_api::messages_sendMessage( telegram_api::messages_sendMessage(flags, false /*ignored*/, false /*ignored*/, false /*ignored*/,
flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/,
false /*ignored*/, false /*ignored*/, std::move(input_peer), std::move(reply_to), text, random_id, std::move(input_peer), std::move(reply_to), text, random_id,
std::move(reply_markup), std::move(entities), schedule_date, std::move(as_input_peer), nullptr, effect_id), std::move(reply_markup), std::move(entities), schedule_date,
std::move(as_input_peer), nullptr, effect_id.get()),
{{dialog_id, MessageContentType::Text}, {{dialog_id, MessageContentType::Text},
{dialog_id, is_copy ? MessageContentType::Photo : MessageContentType::Text}}); {dialog_id, is_copy ? MessageContentType::Photo : MessageContentType::Text}});
if (td_->option_manager_->get_option_boolean("use_quick_ack")) { if (td_->option_manager_->get_option_boolean("use_quick_ack")) {
@ -3085,7 +3086,7 @@ class SendMultiMediaQuery final : public Td::ResultHandler {
public: public:
void send(int32 flags, DialogId dialog_id, tl_object_ptr<telegram_api::InputPeer> as_input_peer, void send(int32 flags, DialogId dialog_id, tl_object_ptr<telegram_api::InputPeer> as_input_peer,
const MessageInputReplyTo &input_reply_to, MessageId top_thread_message_id, int32 schedule_date, const MessageInputReplyTo &input_reply_to, MessageId top_thread_message_id, int32 schedule_date,
int64 effect_id, vector<FileId> &&file_ids, MessageEffectId effect_id, vector<FileId> &&file_ids,
vector<tl_object_ptr<telegram_api::inputSingleMedia>> &&input_single_media, bool is_copy) { vector<tl_object_ptr<telegram_api::inputSingleMedia>> &&input_single_media, bool is_copy) {
for (auto &single_media : input_single_media) { for (auto &single_media : input_single_media) {
random_ids_.push_back(single_media->random_id_); random_ids_.push_back(single_media->random_id_);
@ -3115,7 +3116,7 @@ class SendMultiMediaQuery final : public Td::ResultHandler {
telegram_api::messages_sendMultiMedia(flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, telegram_api::messages_sendMultiMedia(flags, false /*ignored*/, false /*ignored*/, false /*ignored*/,
false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/,
std::move(input_peer), std::move(reply_to), std::move(input_single_media), std::move(input_peer), std::move(reply_to), std::move(input_single_media),
schedule_date, std::move(as_input_peer), nullptr, effect_id), schedule_date, std::move(as_input_peer), nullptr, effect_id.get()),
{{dialog_id, is_copy ? MessageContentType::Text : MessageContentType::Photo}, {{dialog_id, is_copy ? MessageContentType::Text : MessageContentType::Photo},
{dialog_id, MessageContentType::Photo}})); {dialog_id, MessageContentType::Photo}}));
} }
@ -3203,7 +3204,7 @@ class SendMediaQuery final : public Td::ResultHandler {
public: public:
void send(FileId file_id, FileId thumbnail_file_id, int32 flags, DialogId dialog_id, void send(FileId file_id, FileId thumbnail_file_id, int32 flags, DialogId dialog_id,
tl_object_ptr<telegram_api::InputPeer> as_input_peer, const MessageInputReplyTo &input_reply_to, tl_object_ptr<telegram_api::InputPeer> as_input_peer, const MessageInputReplyTo &input_reply_to,
MessageId top_thread_message_id, int32 schedule_date, int64 effect_id, MessageId top_thread_message_id, int32 schedule_date, MessageEffectId effect_id,
tl_object_ptr<telegram_api::ReplyMarkup> &&reply_markup, tl_object_ptr<telegram_api::ReplyMarkup> &&reply_markup,
vector<tl_object_ptr<telegram_api::MessageEntity>> &&entities, const string &text, vector<tl_object_ptr<telegram_api::MessageEntity>> &&entities, const string &text,
tl_object_ptr<telegram_api::InputMedia> &&input_media, MessageContentType content_type, bool is_copy, tl_object_ptr<telegram_api::InputMedia> &&input_media, MessageContentType content_type, bool is_copy,
@ -3234,10 +3235,11 @@ class SendMediaQuery final : public Td::ResultHandler {
} }
auto query = G()->net_query_creator().create( auto query = G()->net_query_creator().create(
telegram_api::messages_sendMedia( telegram_api::messages_sendMedia(flags, false /*ignored*/, false /*ignored*/, false /*ignored*/,
flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, std::move(input_peer),
false /*ignored*/, std::move(input_peer), std::move(reply_to), std::move(input_media), text, random_id, std::move(reply_to), std::move(input_media), text, random_id,
std::move(reply_markup), std::move(entities), schedule_date, std::move(as_input_peer), nullptr, effect_id), std::move(reply_markup), std::move(entities), schedule_date,
std::move(as_input_peer), nullptr, effect_id.get()),
{{dialog_id, content_type}, {dialog_id, is_copy ? MessageContentType::Text : content_type}}); {{dialog_id, content_type}, {dialog_id, is_copy ? MessageContentType::Text : content_type}});
if (td_->option_manager_->get_option_boolean("use_quick_ack") && was_uploaded_) { if (td_->option_manager_->get_option_boolean("use_quick_ack") && was_uploaded_) {
query->quick_ack_promise_ = PromiseCreator::lambda([random_id](Result<Unit> result) { query->quick_ack_promise_ = PromiseCreator::lambda([random_id](Result<Unit> result) {
@ -4241,7 +4243,7 @@ void MessagesManager::Message::store(StorerT &storer) const {
bool has_initial_top_thread_message_id = !message_id.is_any_server() && initial_top_thread_message_id.is_valid(); bool has_initial_top_thread_message_id = !message_id.is_any_server() && initial_top_thread_message_id.is_valid();
bool has_sender_boost_count = sender_boost_count != 0; bool has_sender_boost_count = sender_boost_count != 0;
bool has_via_business_bot_user_id = via_business_bot_user_id.is_valid(); bool has_via_business_bot_user_id = via_business_bot_user_id.is_valid();
bool has_effect_id = effect_id != 0; bool has_effect_id = effect_id.is_valid();
bool has_fact_check = fact_check != nullptr; bool has_fact_check = fact_check != nullptr;
BEGIN_STORE_FLAGS(); BEGIN_STORE_FLAGS();
STORE_FLAG(is_channel_post); STORE_FLAG(is_channel_post);
@ -13240,7 +13242,7 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message(
message_info.has_mention = message->mentioned_; message_info.has_mention = message->mentioned_;
message_info.has_unread_content = message->media_unread_; message_info.has_unread_content = message->media_unread_;
message_info.invert_media = message->invert_media_; message_info.invert_media = message->invert_media_;
message_info.effect_id = message->effect_; message_info.effect_id = MessageEffectId(message->effect_);
bool is_content_read = true; bool is_content_read = true;
if (!td->auth_manager_->is_bot()) { if (!td->auth_manager_->is_bot()) {
@ -22748,8 +22750,8 @@ td_api::object_ptr<td_api::message> MessagesManager::get_business_message_messag
false, false, false, false, false, false, false, false, false, false, false, m->date, m->edit_date, false, false, false, false, false, false, false, false, false, false, false, m->date, m->edit_date,
std::move(forward_info), std::move(import_info), nullptr, Auto(), nullptr, std::move(reply_to), 0, 0, std::move(forward_info), std::move(import_info), nullptr, Auto(), nullptr, std::move(reply_to), 0, 0,
std::move(self_destruct_type), 0.0, 0.0, via_bot_user_id, via_business_bot_user_id, 0, string(), std::move(self_destruct_type), 0.0, 0.0, via_bot_user_id, via_business_bot_user_id, 0, string(),
m->media_album_id, m->effect_id, get_restriction_reason_description(m->restriction_reasons), std::move(content), m->media_album_id, m->effect_id.get(), get_restriction_reason_description(m->restriction_reasons),
std::move(reply_markup)); std::move(content), std::move(reply_markup));
} }
td_api::object_ptr<td_api::message> MessagesManager::get_message_object(MessageFullId message_full_id, td_api::object_ptr<td_api::message> MessagesManager::get_message_object(MessageFullId message_full_id,
@ -22867,7 +22869,7 @@ td_api::object_ptr<td_api::message> MessagesManager::get_message_object(DialogId
top_thread_message_id, top_thread_message_id,
td_->saved_messages_manager_->get_saved_messages_topic_id_object(m->saved_messages_topic_id), td_->saved_messages_manager_->get_saved_messages_topic_id_object(m->saved_messages_topic_id),
std::move(self_destruct_type), ttl_expires_in, auto_delete_in, via_bot_user_id, via_business_bot_user_id, std::move(self_destruct_type), ttl_expires_in, auto_delete_in, via_bot_user_id, via_business_bot_user_id,
m->sender_boost_count, m->author_signature, m->media_album_id, m->effect_id, m->sender_boost_count, m->author_signature, m->media_album_id, m->effect_id.get(),
get_restriction_reason_description(m->restriction_reasons), std::move(content), std::move(reply_markup)); get_restriction_reason_description(m->restriction_reasons), std::move(content), std::move(reply_markup));
} }
@ -23063,7 +23065,7 @@ unique_ptr<MessagesManager::Message> MessagesManager::create_message_to_send(
if (m->sender_user_id == my_id && dialog_type == DialogType::Channel) { if (m->sender_user_id == my_id && dialog_type == DialogType::Channel) {
m->sender_boost_count = td_->chat_manager_->get_channel_my_boost_count(dialog_id.get_channel_id()); m->sender_boost_count = td_->chat_manager_->get_channel_my_boost_count(dialog_id.get_channel_id());
} }
m->effect_id = options.effect_id; m->effect_id = MessageEffectId(options.effect_id);
m->content = std::move(content); m->content = std::move(content);
m->invert_media = invert_media; m->invert_media = invert_media;
m->forward_info = std::move(forward_info); m->forward_info = std::move(forward_info);
@ -23779,7 +23781,7 @@ Result<MessagesManager::MessageSendOptions> MessagesManager::process_message_sen
if (!allow_effect) { if (!allow_effect) {
return Status::Error(400, "Can't use message effects in the method"); return Status::Error(400, "Can't use message effects in the method");
} }
result.effect_id = options->effect_id_; result.effect_id = MessageEffectId(options->effect_id_);
} }
return std::move(result); return std::move(result);
@ -24367,7 +24369,7 @@ void MessagesManager::do_send_message_group(int64 media_album_id) {
MessageId top_thread_message_id; MessageId top_thread_message_id;
int32 flags = 0; int32 flags = 0;
int32 schedule_date = 0; int32 schedule_date = 0;
int64 effect_id = 0; MessageEffectId effect_id;
bool is_copy = false; bool is_copy = false;
for (size_t i = 0; i < request.message_ids.size(); i++) { for (size_t i = 0; i < request.message_ids.size(); i++) {
auto *m = get_message(d, request.message_ids[i]); auto *m = get_message(d, request.message_ids[i]);
@ -25803,7 +25805,7 @@ int32 MessagesManager::get_message_flags(const Message *m) {
if (m->invert_media) { if (m->invert_media) {
flags |= SEND_MESSAGE_FLAG_INVERT_MEDIA; flags |= SEND_MESSAGE_FLAG_INVERT_MEDIA;
} }
if (m->effect_id != 0) { if (m->effect_id.is_valid()) {
flags |= SEND_MESSAGE_FLAG_EFFECT; flags |= SEND_MESSAGE_FLAG_EFFECT;
} }
return flags; return flags;
@ -26540,7 +26542,7 @@ Result<td_api::object_ptr<td_api::messages>> MessagesManager::send_quick_reply_s
auto *d = get_dialog(dialog_id); auto *d = get_dialog(dialog_id);
CHECK(d != nullptr); CHECK(d != nullptr);
MessageSendOptions message_send_options(false, false, false, false, false, 0, sending_id, 0); MessageSendOptions message_send_options(false, false, false, false, false, 0, sending_id, MessageEffectId());
FlatHashMap<MessageId, MessageId, MessageIdHash> original_message_id_to_new_message_id; FlatHashMap<MessageId, MessageId, MessageIdHash> original_message_id_to_new_message_id;
vector<td_api::object_ptr<td_api::message>> result; vector<td_api::object_ptr<td_api::message>> result;
vector<Message *> sent_messages; vector<Message *> sent_messages;

View File

@ -29,6 +29,7 @@
#include "td/telegram/MessageContentType.h" #include "td/telegram/MessageContentType.h"
#include "td/telegram/MessageCopyOptions.h" #include "td/telegram/MessageCopyOptions.h"
#include "td/telegram/MessageDb.h" #include "td/telegram/MessageDb.h"
#include "td/telegram/MessageEffectId.h"
#include "td/telegram/MessageFullId.h" #include "td/telegram/MessageFullId.h"
#include "td/telegram/MessageId.h" #include "td/telegram/MessageId.h"
#include "td/telegram/MessageInputReplyTo.h" #include "td/telegram/MessageInputReplyTo.h"
@ -1003,7 +1004,7 @@ class MessagesManager final : public Actor {
vector<RestrictionReason> restriction_reasons; vector<RestrictionReason> restriction_reasons;
string author_signature; string author_signature;
int64 media_album_id = 0; int64 media_album_id = 0;
int64 effect_id = 0; MessageEffectId effect_id;
bool is_outgoing = false; bool is_outgoing = false;
bool is_silent = false; bool is_silent = false;
bool is_channel_post = false; bool is_channel_post = false;
@ -1120,7 +1121,7 @@ class MessagesManager final : public Actor {
double ttl_expires_at = 0; // only for TTL double ttl_expires_at = 0; // only for TTL
int64 media_album_id = 0; int64 media_album_id = 0;
int64 effect_id = 0; MessageEffectId effect_id;
unique_ptr<MessageContent> content; unique_ptr<MessageContent> content;
@ -1489,11 +1490,12 @@ class MessagesManager final : public Actor {
bool only_preview = false; bool only_preview = false;
int32 schedule_date = 0; int32 schedule_date = 0;
int32 sending_id = 0; int32 sending_id = 0;
int64 effect_id = 0; MessageEffectId effect_id;
MessageSendOptions() = default; MessageSendOptions() = default;
MessageSendOptions(bool disable_notification, bool from_background, bool update_stickersets_order, MessageSendOptions(bool disable_notification, bool from_background, bool update_stickersets_order,
bool protect_content, bool only_preview, int32 schedule_date, int32 sending_id, int64 effect_id) bool protect_content, bool only_preview, int32 schedule_date, int32 sending_id,
MessageEffectId effect_id)
: disable_notification(disable_notification) : disable_notification(disable_notification)
, from_background(from_background) , from_background(from_background)
, update_stickersets_order(update_stickersets_order) , update_stickersets_order(update_stickersets_order)

View File

@ -1211,12 +1211,12 @@ td_api::object_ptr<td_api::messageEffect> ReactionManager::get_message_effect_ob
td_->stickers_manager_->get_sticker_object(effect.effect_sticker_id_), td_->stickers_manager_->get_sticker_object(effect.effect_sticker_id_),
td_->stickers_manager_->get_sticker_object(effect.effect_animation_id_)); td_->stickers_manager_->get_sticker_object(effect.effect_animation_id_));
}(); }();
return td_api::make_object<td_api::messageEffect>(effect.id_, return td_api::make_object<td_api::messageEffect>(effect.id_.get(),
td_->stickers_manager_->get_sticker_object(effect.static_icon_id_), td_->stickers_manager_->get_sticker_object(effect.static_icon_id_),
effect.emoji_, effect.is_premium_, std::move(type)); effect.emoji_, effect.is_premium_, std::move(type));
} }
td_api::object_ptr<td_api::messageEffect> ReactionManager::get_message_effect_object(int64 effect_id) const { td_api::object_ptr<td_api::messageEffect> ReactionManager::get_message_effect_object(MessageEffectId effect_id) const {
for (auto &effect : message_effects_.effects_) { for (auto &effect : message_effects_.effects_) {
if (effect.id_ == effect_id) { if (effect.id_ == effect_id) {
return get_message_effect_object(effect); return get_message_effect_object(effect);
@ -1227,9 +1227,12 @@ td_api::object_ptr<td_api::messageEffect> ReactionManager::get_message_effect_ob
td_api::object_ptr<td_api::updateAvailableMessageEffects> ReactionManager::get_update_available_message_effects_object() td_api::object_ptr<td_api::updateAvailableMessageEffects> ReactionManager::get_update_available_message_effects_object()
const { const {
auto get_raw_effect_ids = [](const vector<MessageEffectId> &message_effect_ids) {
return transform(message_effect_ids, [](MessageEffectId effect_id) { return effect_id.get(); });
};
return td_api::make_object<td_api::updateAvailableMessageEffects>( return td_api::make_object<td_api::updateAvailableMessageEffects>(
vector<int64>(active_message_effects_.reaction_effects_), get_raw_effect_ids(active_message_effects_.reaction_effects_),
vector<int64>(active_message_effects_.sticker_effects_)); get_raw_effect_ids(active_message_effects_.sticker_effects_));
} }
void ReactionManager::reload_message_effects() { void ReactionManager::reload_message_effects() {
@ -1324,7 +1327,7 @@ void ReactionManager::on_get_message_effects(
bool have_invalid_order = false; bool have_invalid_order = false;
for (const auto &available_effect : effects->effects_) { for (const auto &available_effect : effects->effects_) {
Effect effect; Effect effect;
effect.id_ = available_effect->id_; effect.id_ = MessageEffectId(available_effect->id_);
effect.emoji_ = std::move(available_effect->emoticon_); effect.emoji_ = std::move(available_effect->emoticon_);
effect.is_premium_ = available_effect->premium_required_; effect.is_premium_ = available_effect->premium_required_;
if (available_effect->static_icon_id_ != 0) { if (available_effect->static_icon_id_ != 0) {
@ -1441,7 +1444,7 @@ void ReactionManager::update_active_message_effects() {
send_closure(G()->td(), &Td::send_update, get_update_available_message_effects_object()); send_closure(G()->td(), &Td::send_update, get_update_available_message_effects_object());
} }
void ReactionManager::get_message_effect(int64 effect_id, void ReactionManager::get_message_effect(MessageEffectId effect_id,
Promise<td_api::object_ptr<td_api::messageEffect>> &&promise) { Promise<td_api::object_ptr<td_api::messageEffect>> &&promise) {
load_message_effects(); load_message_effects();
if (message_effects_.effects_.empty() && message_effects_.are_being_reloaded_) { if (message_effects_.effects_.empty() && message_effects_.are_being_reloaded_) {

View File

@ -8,6 +8,7 @@
#include "td/telegram/ChatReactions.h" #include "td/telegram/ChatReactions.h"
#include "td/telegram/files/FileId.h" #include "td/telegram/files/FileId.h"
#include "td/telegram/MessageEffectId.h"
#include "td/telegram/ReactionListType.h" #include "td/telegram/ReactionListType.h"
#include "td/telegram/ReactionType.h" #include "td/telegram/ReactionType.h"
#include "td/telegram/ReactionUnavailabilityReason.h" #include "td/telegram/ReactionUnavailabilityReason.h"
@ -83,7 +84,7 @@ class ReactionManager final : public Actor {
void reload_message_effects(); void reload_message_effects();
void get_message_effect(int64 effect_id, Promise<td_api::object_ptr<td_api::messageEffect>> &&promise); void get_message_effect(MessageEffectId effect_id, Promise<td_api::object_ptr<td_api::messageEffect>> &&promise);
void get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const; void get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const;
@ -194,7 +195,7 @@ class ReactionManager final : public Actor {
}; };
struct Effect { struct Effect {
int64 id_ = 0; MessageEffectId id_;
string emoji_; string emoji_;
FileId static_icon_id_; FileId static_icon_id_;
FileId effect_sticker_id_; FileId effect_sticker_id_;
@ -202,7 +203,7 @@ class ReactionManager final : public Actor {
bool is_premium_ = false; bool is_premium_ = false;
bool is_valid() const { bool is_valid() const {
return id_ != 0 && effect_sticker_id_.is_valid(); return id_.is_valid() && effect_sticker_id_.is_valid();
} }
bool is_sticker() const { bool is_sticker() const {
@ -229,8 +230,8 @@ class ReactionManager final : public Actor {
}; };
struct ActiveEffects { struct ActiveEffects {
vector<int64> reaction_effects_; vector<MessageEffectId> reaction_effects_;
vector<int64> sticker_effects_; vector<MessageEffectId> sticker_effects_;
bool is_empty() const { bool is_empty() const {
return reaction_effects_.empty() && sticker_effects_.empty(); return reaction_effects_.empty() && sticker_effects_.empty();
@ -289,7 +290,7 @@ class ReactionManager final : public Actor {
td_api::object_ptr<td_api::messageEffect> get_message_effect_object(const Effect &effect) const; td_api::object_ptr<td_api::messageEffect> get_message_effect_object(const Effect &effect) const;
td_api::object_ptr<td_api::messageEffect> get_message_effect_object(int64 effect_id) const; td_api::object_ptr<td_api::messageEffect> get_message_effect_object(MessageEffectId effect_id) const;
td_api::object_ptr<td_api::updateAvailableMessageEffects> get_update_available_message_effects_object() const; td_api::object_ptr<td_api::updateAvailableMessageEffects> get_update_available_message_effects_object() const;
@ -331,7 +332,8 @@ class ReactionManager final : public Actor {
Effects message_effects_; Effects message_effects_;
ActiveEffects active_message_effects_; ActiveEffects active_message_effects_;
vector<std::pair<int64, Promise<td_api::object_ptr<td_api::messageEffect>>>> pending_get_message_effect_queries_; vector<std::pair<MessageEffectId, Promise<td_api::object_ptr<td_api::messageEffect>>>>
pending_get_message_effect_queries_;
}; };
} // namespace td } // namespace td

View File

@ -87,6 +87,7 @@
#include "td/telegram/Location.h" #include "td/telegram/Location.h"
#include "td/telegram/Logging.h" #include "td/telegram/Logging.h"
#include "td/telegram/MessageCopyOptions.h" #include "td/telegram/MessageCopyOptions.h"
#include "td/telegram/MessageEffectId.h"
#include "td/telegram/MessageEntity.h" #include "td/telegram/MessageEntity.h"
#include "td/telegram/MessageFullId.h" #include "td/telegram/MessageFullId.h"
#include "td/telegram/MessageId.h" #include "td/telegram/MessageId.h"
@ -5517,7 +5518,7 @@ void Td::on_request(uint64 id, td_api::setSavedMessagesTagLabel &request) {
void Td::on_request(uint64 id, const td_api::getMessageEffect &request) { void Td::on_request(uint64 id, const td_api::getMessageEffect &request) {
CHECK_IS_USER(); CHECK_IS_USER();
CREATE_REQUEST_PROMISE(); CREATE_REQUEST_PROMISE();
reaction_manager_->get_message_effect(request.effect_id_, std::move(promise)); reaction_manager_->get_message_effect(MessageEffectId(request.effect_id_), std::move(promise));
} }
void Td::on_request(uint64 id, td_api::getMessagePublicForwards &request) { void Td::on_request(uint64 id, td_api::getMessagePublicForwards &request) {
@ -5773,10 +5774,11 @@ void Td::on_request(uint64 id, td_api::setMessageFactCheck &request) {
void Td::on_request(uint64 id, td_api::sendBusinessMessage &request) { void Td::on_request(uint64 id, td_api::sendBusinessMessage &request) {
CHECK_IS_BOT(); CHECK_IS_BOT();
CREATE_REQUEST_PROMISE(); CREATE_REQUEST_PROMISE();
business_connection_manager_->send_message( business_connection_manager_->send_message(BusinessConnectionId(std::move(request.business_connection_id_)),
BusinessConnectionId(std::move(request.business_connection_id_)), DialogId(request.chat_id_), DialogId(request.chat_id_), std::move(request.reply_to_),
std::move(request.reply_to_), request.disable_notification_, request.protect_content_, request.effect_id_, request.disable_notification_, request.protect_content_,
std::move(request.reply_markup_), std::move(request.input_message_content_), std::move(promise)); MessageEffectId(request.effect_id_), std::move(request.reply_markup_),
std::move(request.input_message_content_), std::move(promise));
} }
void Td::on_request(uint64 id, td_api::sendBusinessMessageAlbum &request) { void Td::on_request(uint64 id, td_api::sendBusinessMessageAlbum &request) {
@ -5784,8 +5786,8 @@ void Td::on_request(uint64 id, td_api::sendBusinessMessageAlbum &request) {
CREATE_REQUEST_PROMISE(); CREATE_REQUEST_PROMISE();
business_connection_manager_->send_message_album( business_connection_manager_->send_message_album(
BusinessConnectionId(std::move(request.business_connection_id_)), DialogId(request.chat_id_), BusinessConnectionId(std::move(request.business_connection_id_)), DialogId(request.chat_id_),
std::move(request.reply_to_), request.disable_notification_, request.protect_content_, request.effect_id_, std::move(request.reply_to_), request.disable_notification_, request.protect_content_,
std::move(request.input_message_contents_), std::move(promise)); MessageEffectId(request.effect_id_), std::move(request.input_message_contents_), std::move(promise));
} }
void Td::on_request(uint64 id, const td_api::loadQuickReplyShortcuts &request) { void Td::on_request(uint64 id, const td_api::loadQuickReplyShortcuts &request) {