Preload and check all custom emoji in secret chats.

This commit is contained in:
levlam 2022-07-27 23:47:16 +03:00
parent 36c6b84ec8
commit a5da79327d
5 changed files with 37 additions and 14 deletions

View File

@ -4146,7 +4146,7 @@ unique_ptr<MessageContent> get_secret_message_content(
message_text = message_text + "\n\n" + caption;
}
auto entities = get_message_entities(td, std::move(secret_entities), is_premium);
auto entities = get_message_entities(td, std::move(secret_entities), is_premium, load_data_multipromise);
auto status = fix_formatted_text(message_text, entities, true, false, true, td->auth_manager_->is_bot(), false);
if (status.is_error()) {
LOG(WARNING) << "Receive error " << status << " while parsing secret message \"" << message_text

View File

@ -39,11 +39,10 @@ namespace td {
class Dependencies;
class DialogAction;
class Game;
class MultiPromiseActor;
struct Photo;
class Td;
class MultiPromiseActor;
// Do not forget to update merge_message_contents when one of the inheritors of this class changes
class MessageContent {
public:

View File

@ -15,6 +15,8 @@
#include "td/telegram/StickersManager.h"
#include "td/telegram/Td.h"
#include "td/actor/MultiPromise.h"
#include "td/utils/algorithm.h"
#include "td/utils/format.h"
#include "td/utils/logging.h"
@ -3545,11 +3547,13 @@ vector<MessageEntity> get_message_entities(const ContactsManager *contacts_manag
return entities;
}
vector<MessageEntity> get_message_entities(const Td *td,
vector<tl_object_ptr<secret_api::MessageEntity>> &&secret_entities,
bool is_premium) {
vector<MessageEntity> get_message_entities(Td *td, vector<tl_object_ptr<secret_api::MessageEntity>> &&secret_entities,
bool is_premium, MultiPromiseActor &load_data_multipromise) {
constexpr size_t MAX_SECRET_CHAT_ENTITIES = 1000;
constexpr size_t MAX_CUSTOM_EMOJI_ENTITIES = 100;
vector<MessageEntity> entities;
entities.reserve(secret_entities.size());
vector<int64> document_ids;
for (auto &secret_entity : secret_entities) {
switch (secret_entity->get_id()) {
case secret_api::messageEntityUnknown::ID:
@ -3653,20 +3657,33 @@ vector<MessageEntity> get_message_entities(const Td *td,
case secret_api::messageEntityCustomEmoji::ID: {
auto entity = static_cast<const secret_api::messageEntityCustomEmoji *>(secret_entity.get());
if (is_premium || !td->stickers_manager_->is_premium_custom_emoji(entity->document_id_, false)) {
entities.emplace_back(MessageEntity::Type::CustomEmoji, entity->offset_, entity->length_,
entity->document_id_);
if (document_ids.size() < MAX_CUSTOM_EMOJI_ENTITIES) {
entities.emplace_back(MessageEntity::Type::CustomEmoji, entity->offset_, entity->length_,
entity->document_id_);
document_ids.push_back(entity->document_id_);
}
}
break;
}
default:
UNREACHABLE();
}
if (entities.size() >= MAX_SECRET_CHAT_ENTITIES) {
break;
}
}
constexpr size_t MAX_SECRET_CHAT_ENTITIES = 1000;
if (entities.size() >= MAX_SECRET_CHAT_ENTITIES) {
entities.resize(MAX_SECRET_CHAT_ENTITIES);
if (!document_ids.empty() && !is_premium) {
// preload custom emoji to check that they aren't premium
td->stickers_manager_->get_custom_emoji_stickers(
std::move(document_ids), true,
PromiseCreator::lambda(
[promise = load_data_multipromise.get_promise()](td_api::object_ptr<td_api::stickers> result) mutable {
promise.set_value(Unit());
}));
}
return entities;
}

View File

@ -24,6 +24,7 @@ namespace td {
class ContactsManager;
class Dependencies;
class MultiPromiseActor;
class Td;
class MessageEntity {
@ -194,9 +195,8 @@ vector<MessageEntity> get_message_entities(const ContactsManager *contacts_manag
vector<tl_object_ptr<telegram_api::MessageEntity>> &&server_entities,
const char *source);
vector<MessageEntity> get_message_entities(const Td *td,
vector<tl_object_ptr<secret_api::MessageEntity>> &&secret_entities,
bool is_premium);
vector<MessageEntity> get_message_entities(Td *td, vector<tl_object_ptr<secret_api::MessageEntity>> &&secret_entities,
bool is_premium, MultiPromiseActor &load_data_multipromise);
// like clean_input_string but also validates entities
Status fix_formatted_text(string &text, vector<MessageEntity> &entities, bool allow_empty, bool skip_new_entities,

View File

@ -14088,6 +14088,13 @@ void MessagesManager::finish_add_secret_message(unique_ptr<PendingSecretMessage>
<< " received earlier with " << message_id << " and random_id " << random_id;
}
} else {
if (!td_->contacts_manager_->is_user_premium(pending_secret_message->message_info.sender_user_id)) {
auto message_text = get_message_content_text_mutable(pending_secret_message->message_info.content.get());
if (message_text != nullptr) {
remove_premium_custom_emoji_entities(td_, message_text->entities, true);
}
}
on_get_message(std::move(pending_secret_message->message_info), true, false, true, true,
"finish add secret message");
}