diff --git a/td/telegram/DraftMessage.cpp b/td/telegram/DraftMessage.cpp index 55a68566c..de600bc24 100644 --- a/td/telegram/DraftMessage.cpp +++ b/td/telegram/DraftMessage.cpp @@ -66,7 +66,7 @@ unique_ptr get_draft_message(ContactsManager *contacts_manager, } } -Result> get_draft_message(ContactsManager *contacts_manager, DialogId dialog_id, +Result> get_draft_message(Td *td, DialogId dialog_id, td_api::object_ptr &&draft_message) { if (draft_message == nullptr) { return nullptr; @@ -85,7 +85,7 @@ Result> get_draft_message(ContactsManager *contacts_man return Status::Error(400, "Input message content type must be InputMessageText"); } TRY_RESULT(message_content, - process_input_message_text(contacts_manager, dialog_id, std::move(input_message_content), false, true)); + process_input_message_text(td, dialog_id, std::move(input_message_content), false, true)); result->input_message_text = std::move(message_content); } diff --git a/td/telegram/DraftMessage.h b/td/telegram/DraftMessage.h index 7caca5dc1..10c765718 100644 --- a/td/telegram/DraftMessage.h +++ b/td/telegram/DraftMessage.h @@ -18,6 +18,7 @@ namespace td { class ContactsManager; +class Td; class DraftMessage { public: @@ -31,7 +32,7 @@ td_api::object_ptr get_draft_message_object(const unique_p unique_ptr get_draft_message(ContactsManager *contacts_manager, telegram_api::object_ptr &&draft_message_ptr); -Result> get_draft_message(ContactsManager *contacts_manager, DialogId dialog_id, +Result> get_draft_message(Td *td, DialogId dialog_id, td_api::object_ptr &&draft_message); } // namespace td diff --git a/td/telegram/InlineQueriesManager.cpp b/td/telegram/InlineQueriesManager.cpp index 2da51a5a3..d38382705 100644 --- a/td/telegram/InlineQueriesManager.cpp +++ b/td/telegram/InlineQueriesManager.cpp @@ -353,8 +353,7 @@ Result> InlineQueriesManager: auto constructor_id = input_message_content->get_id(); if (constructor_id == td_api::inputMessageText::ID) { - TRY_RESULT(input_message_text, process_input_message_text(td_->contacts_manager_.get(), DialogId(), - std::move(input_message_content), true)); + TRY_RESULT(input_message_text, process_input_message_text(td_, DialogId(), std::move(input_message_content), true)); int32 flags = 0; if (input_reply_markup != nullptr) { flags |= telegram_api::inputBotInlineMessageText::REPLY_MARKUP_MASK; diff --git a/td/telegram/InputMessageText.cpp b/td/telegram/InputMessageText.cpp index 5ce5d3970..b26576fa7 100644 --- a/td/telegram/InputMessageText.cpp +++ b/td/telegram/InputMessageText.cpp @@ -9,6 +9,7 @@ #include "td/telegram/ConfigShared.h" #include "td/telegram/Global.h" #include "td/telegram/MessageEntity.h" +#include "td/telegram/Td.h" #include "td/utils/common.h" @@ -23,7 +24,7 @@ bool operator!=(const InputMessageText &lhs, const InputMessageText &rhs) { return !(lhs == rhs); } -Result process_input_message_text(const ContactsManager *contacts_manager, DialogId dialog_id, +Result process_input_message_text(const Td *td, DialogId dialog_id, tl_object_ptr &&input_message_content, bool is_bot, bool for_draft) { CHECK(input_message_content != nullptr); @@ -38,8 +39,9 @@ Result process_input_message_text(const ContactsManager *conta return Status::Error(400, "Message text can't be empty"); } - TRY_RESULT(entities, get_message_entities(contacts_manager, std::move(input_message_text->text_->entities_))); - auto need_skip_bot_commands = need_always_skip_bot_commands(contacts_manager, dialog_id, is_bot); + TRY_RESULT(entities, + get_message_entities(td->contacts_manager_.get(), std::move(input_message_text->text_->entities_))); + auto need_skip_bot_commands = need_always_skip_bot_commands(td->contacts_manager_.get(), dialog_id, is_bot); bool parse_markdown = G()->shared_config().get_option_boolean("always_parse_markdown"); TRY_STATUS(fix_formatted_text(input_message_text->text_->text_, entities, for_draft, parse_markdown, need_skip_bot_commands, is_bot || for_draft || parse_markdown, for_draft)); @@ -51,7 +53,7 @@ Result process_input_message_text(const ContactsManager *conta is_bot || for_draft, for_draft) .ensure(); } - remove_unallowed_entities(result.text, dialog_id.get_type() == DialogType::SecretChat); + remove_unallowed_entities(td->stickers_manager_.get(), result.text, dialog_id.get_type() == DialogType::SecretChat); return std::move(result); } diff --git a/td/telegram/InputMessageText.h b/td/telegram/InputMessageText.h index 8d225d496..208792258 100644 --- a/td/telegram/InputMessageText.h +++ b/td/telegram/InputMessageText.h @@ -14,7 +14,7 @@ namespace td { -class ContactsManager; +class Td; class InputMessageText { public: @@ -30,7 +30,7 @@ class InputMessageText { bool operator==(const InputMessageText &lhs, const InputMessageText &rhs); bool operator!=(const InputMessageText &lhs, const InputMessageText &rhs); -Result process_input_message_text(const ContactsManager *contacts_manager, DialogId dialog_id, +Result process_input_message_text(const Td *td, DialogId dialog_id, tl_object_ptr &&input_message_content, bool is_bot, bool for_draft = false) TD_WARN_UNUSED_RESULT; diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index c6ee12521..97a136768 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -1761,8 +1761,8 @@ static Result create_input_message_content( bool is_bot = td->auth_manager_->is_bot(); switch (input_message_content->get_id()) { case td_api::inputMessageText::ID: { - TRY_RESULT(input_message_text, process_input_message_text(td->contacts_manager_.get(), dialog_id, - std::move(input_message_content), is_bot)); + TRY_RESULT(input_message_text, + process_input_message_text(td, dialog_id, std::move(input_message_content), is_bot)); disable_web_page_preview = input_message_text.disable_web_page_preview; clear_draft = input_message_text.clear_draft; @@ -4663,7 +4663,7 @@ unique_ptr dup_message_content(Td *td, DialogId dialog_id, const case MessageContentType::Text: { auto result = make_unique(*static_cast(content)); if (type == MessageContentDupType::Copy || type == MessageContentDupType::ServerCopy) { - remove_unallowed_entities(result->text, to_secret); + remove_unallowed_entities(td->stickers_manager_.get(), result->text, to_secret); } return result; } diff --git a/td/telegram/MessageEntity.cpp b/td/telegram/MessageEntity.cpp index 837a970d6..199145f22 100644 --- a/td/telegram/MessageEntity.cpp +++ b/td/telegram/MessageEntity.cpp @@ -6,11 +6,13 @@ // #include "td/telegram/MessageEntity.h" +#include "td/telegram/ConfigShared.h" #include "td/telegram/ContactsManager.h" #include "td/telegram/Dependencies.h" #include "td/telegram/LinkManager.h" #include "td/telegram/misc.h" #include "td/telegram/SecretChatLayer.h" +#include "td/telegram/StickersManager.h" #include "td/utils/algorithm.h" #include "td/utils/format.h" @@ -209,11 +211,17 @@ td_api::object_ptr get_formatted_text_object(const Format text.text, get_text_entities_object(text.entities, skip_bot_commands, max_media_timestamp)); } -void remove_unallowed_entities(FormattedText &text, bool to_secret) { +void remove_unallowed_entities(const StickersManager *stickers_manager, FormattedText &text, bool to_secret) { if (to_secret) { td::remove_if(text.entities, [](const MessageEntity &entity) { return entity.type == MessageEntity::Type::Spoiler || entity.type == MessageEntity::Type::CustomEmoji; }); + } else if (!G()->shared_config().get_option_boolean("is_premium")) { + // remove premium custom emoji + td::remove_if(text.entities, [stickers_manager](const MessageEntity &entity) { + return entity.type == MessageEntity::Type::CustomEmoji && + stickers_manager->is_premium_custom_emoji(entity.document_id); + }); } } diff --git a/td/telegram/MessageEntity.h b/td/telegram/MessageEntity.h index 2d54d3e6d..b5feeb779 100644 --- a/td/telegram/MessageEntity.h +++ b/td/telegram/MessageEntity.h @@ -24,6 +24,7 @@ namespace td { class ContactsManager; class Dependencies; +class StickersManager; class MessageEntity { public: @@ -150,7 +151,7 @@ vector> get_text_entities_object(const vector< td_api::object_ptr get_formatted_text_object(const FormattedText &text, bool skip_bot_commands, int32 max_media_timestamp); -void remove_unallowed_entities(FormattedText &text, bool to_secret); +void remove_unallowed_entities(const StickersManager *stickers_manager, FormattedText &text, bool to_secret); vector find_entities(Slice text, bool skip_bot_commands, bool skip_media_timestamps); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 4a098c861..5c3fd6779 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -19748,7 +19748,7 @@ Status MessagesManager::set_dialog_draft_message(DialogId dialog_id, MessageId t } TRY_STATUS(can_send_message(dialog_id)); - TRY_RESULT(new_draft_message, get_draft_message(td_->contacts_manager_.get(), dialog_id, std::move(draft_message))); + TRY_RESULT(new_draft_message, get_draft_message(td_, dialog_id, std::move(draft_message))); if (new_draft_message != nullptr) { new_draft_message->reply_to_message_id = get_reply_to_message_id(d, top_thread_message_id, new_draft_message->reply_to_message_id, true); @@ -26906,8 +26906,8 @@ void MessagesManager::edit_message_text(FullMessageId full_message_id, return promise.set_error(Status::Error(400, "There is no text in the message to edit")); } - auto r_input_message_text = process_input_message_text( - td_->contacts_manager_.get(), dialog_id, std::move(input_message_content), td_->auth_manager_->is_bot()); + auto r_input_message_text = + process_input_message_text(td_, dialog_id, std::move(input_message_content), td_->auth_manager_->is_bot()); if (r_input_message_text.is_error()) { return promise.set_error(r_input_message_text.move_as_error()); } @@ -27272,8 +27272,8 @@ void MessagesManager::edit_inline_message_text(const string &inline_message_id, return promise.set_error(Status::Error(400, "Input message content type must be InputMessageText")); } - auto r_input_message_text = process_input_message_text( - td_->contacts_manager_.get(), DialogId(), std::move(input_message_content), td_->auth_manager_->is_bot()); + auto r_input_message_text = + process_input_message_text(td_, DialogId(), std::move(input_message_content), td_->auth_manager_->is_bot()); if (r_input_message_text.is_error()) { return promise.set_error(r_input_message_text.move_as_error()); } diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 8d19d1733..99c8fc6ba 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -1692,6 +1692,11 @@ StickerType StickersManager::get_sticker_type(FileId file_id) const { return sticker->type; } +bool StickersManager::is_premium_custom_emoji(int64 custom_emoji_id) const { + // TODO + return false; +} + vector> StickersManager::get_sticker_minithumbnail( CSlice path, StickerSetId sticker_set_id, int64 document_id, double zoom) { if (path.empty()) { diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index a2387b19d..1f992345e 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -61,6 +61,8 @@ class StickersManager final : public Actor { StickerType get_sticker_type(FileId file_id) const; + bool is_premium_custom_emoji(int64 custom_emoji_id) const; + tl_object_ptr get_sticker_object(FileId file_id, bool for_animated_emoji = false, bool for_clicked_animated_emoji = false) const;