From fb0689545de1bfb1182ff33d75f203d79e6077b5 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 18 Jul 2022 01:03:58 +0300 Subject: [PATCH] Add textEntityTypeCustomEmoji. --- td/generate/scheme/td_api.tl | 3 ++ td/telegram/MessageEntity.cpp | 52 +++++++++++++++++++++++++++++------ td/telegram/MessageEntity.h | 6 ++++ td/telegram/MessageEntity.hpp | 6 ++++ td/telegram/cli.cpp | 13 +++++++++ 5 files changed, 71 insertions(+), 9 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 94132200c..fa07f1402 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -2086,6 +2086,9 @@ textEntityTypeTextUrl url:string = TextEntityType; //@description A text shows instead of a raw mention of the user (e.g., when the user has no username) @user_id Identifier of the mentioned user textEntityTypeMentionName user_id:int53 = TextEntityType; +//@description A custom emoji. The text behind a custom emoji must be an emoji. Only premium users can use premium custom emoji @custom_emoji_id Unique identifier of the custom emoji +textEntityTypeCustomEmoji custom_emoji_id:int64 = TextEntityType; + //@description A media timestamp @media_timestamp Timestamp from which a video/audio/video note/voice note playing must start, in seconds. The media can be in the content or the web page preview of the current message, or in the same places in the replied message textEntityTypeMediaTimestamp media_timestamp:int32 = TextEntityType; diff --git a/td/telegram/MessageEntity.cpp b/td/telegram/MessageEntity.cpp index 32c0297b8..0fc50de30 100644 --- a/td/telegram/MessageEntity.cpp +++ b/td/telegram/MessageEntity.cpp @@ -29,12 +29,27 @@ namespace td { int MessageEntity::get_type_priority(Type type) { - static const int priorities[] = { - 50 /*Mention*/, 50 /*Hashtag*/, 50 /*BotCommand*/, 50 /*Url*/, - 50 /*EmailAddress*/, 90 /*Bold*/, 91 /*Italic*/, 20 /*Code*/, - 11 /*Pre*/, 10 /*PreCode*/, 49 /*TextUrl*/, 49 /*MentionName*/, - 50 /*Cashtag*/, 50 /*PhoneNumber*/, 92 /*Underline*/, 93 /*Strikethrough*/, - 0 /*BlockQuote*/, 50 /*BankCardNumber*/, 50 /*MediaTimestamp*/, 94 /*Spoiler*/}; + static const int priorities[] = {50 /*Mention*/, + 50 /*Hashtag*/, + 50 /*BotCommand*/, + 50 /*Url*/, + 50 /*EmailAddress*/, + 90 /*Bold*/, + 91 /*Italic*/, + 20 /*Code*/, + 11 /*Pre*/, + 10 /*PreCode*/, + 49 /*TextUrl*/, + 49 /*MentionName*/, + 50 /*Cashtag*/, + 50 /*PhoneNumber*/, + 92 /*Underline*/, + 93 /*Strikethrough*/, + 0 /*BlockQuote*/, + 50 /*BankCardNumber*/, + 50 /*MediaTimestamp*/, + 94 /*Spoiler*/, + 99 /*CustomEmoji*/}; static_assert(sizeof(priorities) / sizeof(priorities[0]) == static_cast(MessageEntity::Type::Size), ""); return priorities[static_cast(type)]; } @@ -81,6 +96,8 @@ StringBuilder &operator<<(StringBuilder &string_builder, const MessageEntity::Ty return string_builder << "MediaTimestamp"; case MessageEntity::Type::Spoiler: return string_builder << "Spoiler"; + case MessageEntity::Type::CustomEmoji: + return string_builder << "CustomEmoji"; default: UNREACHABLE(); return string_builder << "Impossible"; @@ -146,6 +163,8 @@ tl_object_ptr MessageEntity::get_text_entity_type_object return make_tl_object(media_timestamp); case MessageEntity::Type::Spoiler: return make_tl_object(); + case MessageEntity::Type::CustomEmoji: + return make_tl_object(document_id); default: UNREACHABLE(); return nullptr; @@ -1423,7 +1442,8 @@ static constexpr int32 get_continuous_entities_mask() { get_entity_type_mask(MessageEntity::Type::MentionName) | get_entity_type_mask(MessageEntity::Type::Cashtag) | get_entity_type_mask(MessageEntity::Type::PhoneNumber) | get_entity_type_mask(MessageEntity::Type::BankCardNumber) | - get_entity_type_mask(MessageEntity::Type::MediaTimestamp); + get_entity_type_mask(MessageEntity::Type::MediaTimestamp) | + get_entity_type_mask(MessageEntity::Type::CustomEmoji); } static constexpr int32 get_pre_entities_mask() { @@ -1434,7 +1454,7 @@ static constexpr int32 get_pre_entities_mask() { static constexpr int32 get_user_entities_mask() { return get_splittable_entities_mask() | get_blockquote_entities_mask() | get_entity_type_mask(MessageEntity::Type::TextUrl) | get_entity_type_mask(MessageEntity::Type::MentionName) | - get_pre_entities_mask(); + get_entity_type_mask(MessageEntity::Type::CustomEmoji) | get_pre_entities_mask(); } static int32 is_splittable_entity(MessageEntity::Type type) { @@ -1782,6 +1802,8 @@ string get_first_url(Slice text, const vector &entities) { break; case MessageEntity::Type::Spoiler: break; + case MessageEntity::Type::CustomEmoji: + break; default: UNREACHABLE(); } @@ -3312,6 +3334,11 @@ Result> get_message_entities(const ContactsManager *contac case td_api::textEntityTypeSpoiler::ID: entities.emplace_back(MessageEntity::Type::Spoiler, offset, length); break; + case td_api::textEntityTypeCustomEmoji::ID: { + auto entity = static_cast(input_entity->type_.get()); + entities.emplace_back(MessageEntity::Type::CustomEmoji, offset, length, entity->custom_emoji_id_); + break; + } default: UNREACHABLE(); } @@ -3446,8 +3473,11 @@ vector get_message_entities(const ContactsManager *contacts_manag entities.emplace_back(entity->offset_, entity->length_, user_id); break; } - case telegram_api::messageEntityCustomEmoji::ID: + case telegram_api::messageEntityCustomEmoji::ID: { + auto entity = static_cast(server_entity.get()); + entities.emplace_back(MessageEntity::Type::CustomEmoji, entity->offset_, entity->length_, entity->document_id_); break; + } default: UNREACHABLE(); } @@ -4253,6 +4283,10 @@ vector> get_input_message_entities(co r_input_user.move_as_ok())); break; } + case MessageEntity::Type::CustomEmoji: + result.push_back( + make_tl_object(entity.offset, entity.length, entity.document_id)); + break; default: UNREACHABLE(); } diff --git a/td/telegram/MessageEntity.h b/td/telegram/MessageEntity.h index 4a0ec6e29..8f13d5af1 100644 --- a/td/telegram/MessageEntity.h +++ b/td/telegram/MessageEntity.h @@ -49,6 +49,7 @@ class MessageEntity { BankCardNumber, MediaTimestamp, Spoiler, + CustomEmoji, Size }; Type type = Type::Size; @@ -57,6 +58,7 @@ class MessageEntity { int32 media_timestamp = -1; string argument; UserId user_id; + int64 document_id = 0; MessageEntity() = default; @@ -70,6 +72,10 @@ class MessageEntity { : type(type), offset(offset), length(length), media_timestamp(media_timestamp) { CHECK(type == Type::MediaTimestamp); } + MessageEntity(Type type, int32 offset, int32 length, int64 document_id) + : type(type), offset(offset), length(length), document_id(document_id) { + CHECK(type == Type::CustomEmoji); + } tl_object_ptr get_text_entity_object() const; diff --git a/td/telegram/MessageEntity.hpp b/td/telegram/MessageEntity.hpp index 0ebcf0374..3d8a8214d 100644 --- a/td/telegram/MessageEntity.hpp +++ b/td/telegram/MessageEntity.hpp @@ -27,6 +27,9 @@ void MessageEntity::store(StorerT &storer) const { if (type == Type::MediaTimestamp) { store(media_timestamp, storer); } + if (type == Type::CustomEmoji) { + store(document_id, storer); + } } template @@ -44,6 +47,9 @@ void MessageEntity::parse(ParserT &parser) { if (type == Type::MediaTimestamp) { parse(media_timestamp, parser); } + if (type == Type::CustomEmoji) { + parse(document_id, parser); + } } template diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 367a8c153..a67b30ab6 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -3628,6 +3628,19 @@ class CliClient final : public Actor { } send_message(chat_id, td_api::make_object(as_formatted_text(message), false, true), op == "sms", false, reply_to_message_id); + } else if (op == "smce") { + ChatId chat_id; + get_args(args, chat_id); + vector> entities; + entities.push_back( + td_api::make_object(0, 2, td_api::make_object(1))); + entities.push_back( + td_api::make_object(3, 2, td_api::make_object(2))); + entities.push_back( + td_api::make_object(6, 5, td_api::make_object(3))); + auto text = as_formatted_text("👍 😉 🧑‍🚒", std::move(entities)); + send_message(chat_id, td_api::make_object(std::move(text), false, true), false, false, + 0); } else if (op == "alm" || op == "almr") { ChatId chat_id; string sender_id;