diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index f3582829..31d5c7f0 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -924,6 +924,9 @@ textEntityTypeMention = TextEntityType; //@description A hashtag text, beginning with "#" textEntityTypeHashtag = TextEntityType; +//@description A cashtag text, beginning with "$" and consisting of capital english letters (i.e. "$USD") +textEntityTypeCashtag = TextEntityType; + //@description A bot command, beginning with "/". This shouldn't be highlighted if there are no bots in the chat textEntityTypeBotCommand = TextEntityType; diff --git a/td/generate/scheme/td_api.tlo b/td/generate/scheme/td_api.tlo index 764bb342..ee531d29 100644 Binary files a/td/generate/scheme/td_api.tlo and b/td/generate/scheme/td_api.tlo differ diff --git a/td/telegram/MessageEntity.cpp b/td/telegram/MessageEntity.cpp index aa275e4e..44cf0869 100644 --- a/td/telegram/MessageEntity.cpp +++ b/td/telegram/MessageEntity.cpp @@ -64,6 +64,9 @@ StringBuilder &operator<<(StringBuilder &string_builder, const MessageEntity &me case MessageEntity::Type::MentionName: string_builder << "MentionName"; break; + case MessageEntity::Type::Cashtag: + string_builder << "Cashtag"; + break; default: UNREACHABLE(); string_builder << "Impossible"; @@ -107,6 +110,8 @@ tl_object_ptr MessageEntity::get_text_entity_type_object return make_tl_object(argument); case MessageEntity::Type::MentionName: return make_tl_object(user_id.get()); + case MessageEntity::Type::Cashtag: + return make_tl_object(); default: UNREACHABLE(); return nullptr; @@ -1057,6 +1062,12 @@ vector find_entities(Slice text, bool skip_bot_commands, bool onl entities.emplace_back(MessageEntity::Type::Hashtag, narrow_cast(hashtag.begin() - text.begin()), narrow_cast(hashtag.size())); } + + auto cashtags = find_cashtags(text); + for (auto &cashtag : cashtags) { + entities.emplace_back(MessageEntity::Type::Cashtag, narrow_cast(cashtag.begin() - text.begin()), + narrow_cast(cashtag.size())); + } } auto urls = find_urls(text); @@ -1173,6 +1184,8 @@ string get_first_url(Slice text, const vector &entities) { return entity.argument; case MessageEntity::Type::MentionName: break; + case MessageEntity::Type::Cashtag: + break; default: UNREACHABLE(); } @@ -1591,6 +1604,7 @@ vector> get_input_message_entities(co case MessageEntity::Type::BotCommand: case MessageEntity::Type::Url: case MessageEntity::Type::EmailAddress: + case MessageEntity::Type::Cashtag: continue; case MessageEntity::Type::Bold: result.push_back(make_tl_object(entity.offset, entity.length)); @@ -1637,6 +1651,8 @@ vector> get_input_secret_message_entiti case MessageEntity::Type::Hashtag: result.push_back(make_tl_object(entity.offset, entity.length)); break; + case MessageEntity::Type::Cashtag: + break; case MessageEntity::Type::BotCommand: break; case MessageEntity::Type::Url: @@ -1688,6 +1704,7 @@ Result> get_message_entities(const ContactsManager *contac case td_api::textEntityTypeBotCommand::ID: case td_api::textEntityTypeUrl::ID: case td_api::textEntityTypeEmailAddress::ID: + case td_api::textEntityTypeCashtag::ID: break; case td_api::textEntityTypeBold::ID: entities.emplace_back(MessageEntity::Type::Bold, entity->offset_, entity->length_); @@ -1758,9 +1775,11 @@ vector get_message_entities(const ContactsManager *contacts_manag entities.emplace_back(MessageEntity::Type::Hashtag, entity_hashtag->offset_, entity_hashtag->length_); break; } - case telegram_api::messageEntityCashtag::ID: - // skip for now + case telegram_api::messageEntityCashtag::ID: { + auto entity_cashtag = static_cast(entity.get()); + entities.emplace_back(MessageEntity::Type::Cashtag, entity_cashtag->offset_, entity_cashtag->length_); break; + } case telegram_api::messageEntityPhone::ID: // skip for now break; @@ -1971,7 +1990,7 @@ Status fix_formatted_text(string &text, vector &entities, bool al in_entity = false; if (has_non_space_in_entity) { - // TODO check entities for validness, for example, that mention, hashtag and URLs are valid + // TODO check entities for validness, for example, that mentions, hashtags, cashtags and URLs are valid if (current_entity != left_entities) { entities[left_entities] = std::move(entities[current_entity]); } diff --git a/td/telegram/MessageEntity.h b/td/telegram/MessageEntity.h index 6a5e5001..c1ee6549 100644 --- a/td/telegram/MessageEntity.h +++ b/td/telegram/MessageEntity.h @@ -42,7 +42,8 @@ class MessageEntity { Pre, PreCode, TextUrl, - MentionName + MentionName, + Cashtag }; Type type; int32 offset;