diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index 131d1ddb..9119aa4a 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -27,6 +27,7 @@ #include "td/telegram/Game.h" #include "td/telegram/Game.hpp" #include "td/telegram/Global.h" +#include "td/telegram/HashtagHints.h" #include "td/telegram/InputMessageText.h" #include "td/telegram/Location.h" #include "td/telegram/MessageEntity.h" @@ -5189,4 +5190,35 @@ void on_dialog_used(TopDialogCategory category, DialogId dialog_id, int32 date) send_closure(G()->top_dialog_manager(), &TopDialogManager::on_dialog_used, category, dialog_id, date); } +void update_used_hashtags(Td *td, const MessageContent *content) { + const FormattedText *text = get_message_content_text(content); + if (text == nullptr || text->text.empty()) { + return; + } + + const unsigned char *ptr = Slice(text->text).ubegin(); + const unsigned char *end = Slice(text->text).uend(); + int32 utf16_pos = 0; + for (auto &entity : text->entities) { + if (entity.type != MessageEntity::Type::Hashtag) { + continue; + } + while (utf16_pos < entity.offset && ptr < end) { + utf16_pos += 1 + (ptr[0] >= 0xf0); + ptr = next_utf8_unsafe(ptr, nullptr, "update_used_hashtags"); + } + CHECK(utf16_pos == entity.offset); + auto from = ptr; + + while (utf16_pos < entity.offset + entity.length && ptr < end) { + utf16_pos += 1 + (ptr[0] >= 0xf0); + ptr = next_utf8_unsafe(ptr, nullptr, "update_used_hashtags 2"); + } + CHECK(utf16_pos == entity.offset + entity.length); + auto to = ptr; + + send_closure(td->hashtag_hints_, &HashtagHints::hashtag_used, Slice(from + 1, to).str()); + } +} + } // namespace td diff --git a/td/telegram/MessageContent.h b/td/telegram/MessageContent.h index 277b9d4e..d8a27e6d 100644 --- a/td/telegram/MessageContent.h +++ b/td/telegram/MessageContent.h @@ -268,4 +268,6 @@ StickerSetId add_sticker_set(Td *td, tl_object_ptrvia_bot_user_id.is_valid() || m->hide_via_bot || m->forward_info != nullptr || m->had_forward_info) { return; } - const FormattedText *text = get_message_content_text(m->content.get()); - if (text == nullptr || text->text.empty()) { - return; - } - const unsigned char *ptr = Slice(text->text).ubegin(); - const unsigned char *end = Slice(text->text).uend(); - int32 utf16_pos = 0; - for (auto &entity : text->entities) { - if (entity.type != MessageEntity::Type::Hashtag) { - continue; - } - while (utf16_pos < entity.offset && ptr < end) { - utf16_pos += 1 + (ptr[0] >= 0xf0); - ptr = next_utf8_unsafe(ptr, nullptr, "update_used_hashtags"); - } - CHECK(utf16_pos == entity.offset); - auto from = ptr; - while (utf16_pos < entity.offset + entity.length && ptr < end) { - utf16_pos += 1 + (ptr[0] >= 0xf0); - ptr = next_utf8_unsafe(ptr, nullptr, "update_used_hashtags 2"); - } - CHECK(utf16_pos == entity.offset + entity.length); - auto to = ptr; - - send_closure(td_->hashtag_hints_, &HashtagHints::hashtag_used, Slice(from + 1, to).str()); - } + ::td::update_used_hashtags(td_, m->content.get()); } void MessagesManager::update_top_dialogs(DialogId dialog_id, const Message *m) {