Preload and check all custom emoji in secret chats.
This commit is contained in:
parent
36c6b84ec8
commit
a5da79327d
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue