diff --git a/Telegram/SourceFiles/ayu/ui/message_history/history_item.cpp b/Telegram/SourceFiles/ayu/ui/message_history/history_item.cpp index 8770f059af..2a56ea23d1 100644 --- a/Telegram/SourceFiles/ayu/ui/message_history/history_item.cpp +++ b/Telegram/SourceFiles/ayu/ui/message_history/history_item.cpp @@ -9,6 +9,7 @@ #include "api/api_chat_participants.h" #include "api/api_text_entities.h" +#include "ayu/utils/ayu_mapper.h" #include "ayu/ui/message_history/history_inner.h" #include "base/unixtime.h" #include "core/application.h" @@ -118,7 +119,10 @@ void GenerateItems( }; const auto text = QString::fromStdString(message.text); - addSimpleTextMessage(Ui::Text::WithEntities(text)); + auto textAndEntities = Ui::Text::WithEntities(text); + const auto entities = AyuMapper::deserializeTextWithEntities(message.textEntities); + textAndEntities.entities = Api::EntitiesFromMTP(&history->session(), entities.v); + addSimpleTextMessage(std::move(textAndEntities)); } } // namespace MessageHistory diff --git a/Telegram/SourceFiles/ayu/utils/ayu_mapper.cpp b/Telegram/SourceFiles/ayu/utils/ayu_mapper.cpp index 2c1fc99c4c..a318571985 100644 --- a/Telegram/SourceFiles/ayu/utils/ayu_mapper.cpp +++ b/Telegram/SourceFiles/ayu/utils/ayu_mapper.cpp @@ -6,9 +6,14 @@ // Copyright @Radolyn, 2025 #include "ayu_mapper.h" +#include "apiwrap.h" +#include "api/api_text_entities.h" #include "history/history.h" #include "history/history_item.h" #include "history/history_item_components.h" +#include "main/main_session.h" +#include "mtproto/connection_abstract.h" +#include "mtproto/details/mtproto_dump_to_text.h" namespace AyuMapper { @@ -39,17 +44,57 @@ constexpr auto kMessageFlagHasTTL = 0x02000000; constexpr auto kMessageFlagInvertMedia = 0x08000000; constexpr auto kMessageFlagHasSavedPeer = 0x10000000; +template +std::vector serializeObject(MTPObject object) { + mtpBuffer buffer; + + object.write(buffer); + + auto from = reinterpret_cast(buffer.data()); + const auto end = from + buffer.size() * sizeof(mtpBuffer); + + std::vector entities(from, end); + return entities; +} + +template +MTPObject deserializeObject(std::vector serialized) { + gsl::span span(serialized.data(), serialized.size()); + + auto from = reinterpret_cast(span.data()); + const auto end = from + span.size() / sizeof(mtpPrime); + + MTPObject data; + if (!data.read(from, end)) { + LOG(("AyuMapper: Failed to deserialize object")); + } + return data; +} + std::pair> serializeTextWithEntities(not_null item) { if (item->emptyText()) { return std::make_pair("", std::vector()); } - auto textWithEntities = item->originalText(); - std::vector entities; // todo: implement writing to buffer + + + std::vector entities; + if (!textWithEntities.entities.empty()) { + const auto mtpEntities = Api::EntitiesToMTP( + &item->history()->session(), + textWithEntities.entities, + Api::ConvertOption::WithLocal); + + entities = serializeObject(mtpEntities); + } return std::make_pair(textWithEntities.text.toStdString(), entities); } +MTPVector deserializeTextWithEntities(std::vector serialized) { + return deserializeObject>(serialized); +} + int mapItemFlagsToMTPFlags(not_null item) { int flags = 0; diff --git a/Telegram/SourceFiles/ayu/utils/ayu_mapper.h b/Telegram/SourceFiles/ayu/utils/ayu_mapper.h index 9d6646bdfe..8bd8872d8f 100644 --- a/Telegram/SourceFiles/ayu/utils/ayu_mapper.h +++ b/Telegram/SourceFiles/ayu/utils/ayu_mapper.h @@ -8,7 +8,14 @@ namespace AyuMapper { +template +[[nodiscard]] MTPObject deserializeObject(std::vector serialized); + +template +[[nodiscard]] std::vector serializeObject(MTPObject object); + std::pair> serializeTextWithEntities(not_null item); +[[nodiscard]] MTPVector deserializeTextWithEntities(std::vector serialized); int mapItemFlagsToMTPFlags(not_null item); } // namespace AyuMapper