From e4323ecd26f9bcabae3181f957a13b524766d5af Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 14 May 2024 07:07:59 +0300 Subject: [PATCH] Slightly improved code style in processing of api text entities. --- .../SourceFiles/api/api_text_entities.cpp | 308 +++++++++++++----- 1 file changed, 227 insertions(+), 81 deletions(-) diff --git a/Telegram/SourceFiles/api/api_text_entities.cpp b/Telegram/SourceFiles/api/api_text_entities.cpp index 6c434bc9b..44a689ff4 100644 --- a/Telegram/SourceFiles/api/api_text_entities.cpp +++ b/Telegram/SourceFiles/api/api_text_entities.cpp @@ -7,12 +7,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "api/api_text_entities.h" -#include "main/main_session.h" +#include "data/data_document.h" +#include "data/data_session.h" +#include "data/data_user.h" #include "data/stickers/data_custom_emoji.h" #include "data/stickers/data_stickers_set.h" -#include "data/data_session.h" -#include "data/data_document.h" -#include "data/data_user.h" +#include "main/main_session.h" namespace Api { namespace { @@ -62,67 +62,163 @@ using namespace TextUtilities; EntitiesInText EntitiesFromMTP( Main::Session *session, const QVector &entities) { + if (entities.isEmpty()) { + return {}; + } auto result = EntitiesInText(); - if (!entities.isEmpty()) { - result.reserve(entities.size()); - for (const auto &entity : entities) { - switch (entity.type()) { - case mtpc_messageEntityUrl: { auto &d = entity.c_messageEntityUrl(); result.push_back({ EntityType::Url, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityTextUrl: { auto &d = entity.c_messageEntityTextUrl(); result.push_back({ EntityType::CustomUrl, d.voffset().v, d.vlength().v, qs(d.vurl()) }); } break; - case mtpc_messageEntityEmail: { auto &d = entity.c_messageEntityEmail(); result.push_back({ EntityType::Email, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityHashtag: { auto &d = entity.c_messageEntityHashtag(); result.push_back({ EntityType::Hashtag, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityCashtag: { auto &d = entity.c_messageEntityCashtag(); result.push_back({ EntityType::Cashtag, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityPhone: break; // Skipping phones. - case mtpc_messageEntityMention: { auto &d = entity.c_messageEntityMention(); result.push_back({ EntityType::Mention, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityMentionName: if (session) { - const auto &d = entity.c_messageEntityMentionName(); - const auto userId = UserId(d.vuser_id()); - const auto user = session->data().userLoaded(userId); - const auto data = MentionNameDataFromFields({ - .selfId = session->userId().bare, - .userId = userId.bare, - .accessHash = user ? user->accessHash() : 0, - }); - result.push_back({ EntityType::MentionName, d.voffset().v, d.vlength().v, data }); - } break; - case mtpc_inputMessageEntityMentionName: if (session) { - const auto &d = entity.c_inputMessageEntityMentionName(); - const auto data = d.vuser_id().match([&]( - const MTPDinputUserSelf &) { - return MentionNameDataFromFields({ - .selfId = session->userId().bare, - .userId = session->userId().bare, - .accessHash = session->user()->accessHash(), - }); - }, [&](const MTPDinputUser &data) { - return MentionNameDataFromFields({ - .selfId = session->userId().bare, - .userId = UserId(data.vuser_id()).bare, - .accessHash = data.vaccess_hash().v, - }); - }, [&](const auto &) { - return QString(); - }); - if (!data.isEmpty()) { - result.push_back({ EntityType::MentionName, d.voffset().v, d.vlength().v, data }); - } - } break; - case mtpc_messageEntityBotCommand: { auto &d = entity.c_messageEntityBotCommand(); result.push_back({ EntityType::BotCommand, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityBold: { auto &d = entity.c_messageEntityBold(); result.push_back({ EntityType::Bold, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityItalic: { auto &d = entity.c_messageEntityItalic(); result.push_back({ EntityType::Italic, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityUnderline: { auto &d = entity.c_messageEntityUnderline(); result.push_back({ EntityType::Underline, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityStrike: { auto &d = entity.c_messageEntityStrike(); result.push_back({ EntityType::StrikeOut, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityCode: { auto &d = entity.c_messageEntityCode(); result.push_back({ EntityType::Code, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityPre: { auto &d = entity.c_messageEntityPre(); result.push_back({ EntityType::Pre, d.voffset().v, d.vlength().v, qs(d.vlanguage()) }); } break; - case mtpc_messageEntityBlockquote: { auto &d = entity.c_messageEntityBlockquote(); result.push_back({ EntityType::Blockquote, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityBankCard: break; // Skipping cards. // #TODO entities - case mtpc_messageEntitySpoiler: { auto &d = entity.c_messageEntitySpoiler(); result.push_back({ EntityType::Spoiler, d.voffset().v, d.vlength().v }); } break; - case mtpc_messageEntityCustomEmoji: { - const auto &d = entity.c_messageEntityCustomEmoji(); - result.push_back({ EntityType::CustomEmoji, d.voffset().v, d.vlength().v, CustomEmojiEntityData(d) }); - } break; + result.reserve(entities.size()); + + for (const auto &entity : entities) { + entity.match([&](const MTPDmessageEntityUnknown &d) { + }, [&](const MTPDmessageEntityMention &d) { + result.push_back({ + EntityType::Mention, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityHashtag &d) { + result.push_back({ + EntityType::Hashtag, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityBotCommand &d) { + result.push_back({ + EntityType::BotCommand, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityUrl &d) { + result.push_back({ + EntityType::Url, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityEmail &d) { + result.push_back({ + EntityType::Email, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityBold &d) { + result.push_back({ + EntityType::Bold, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityItalic &d) { + result.push_back({ + EntityType::Italic, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityCode &d) { + result.push_back({ + EntityType::Code, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityPre &d) { + result.push_back({ + EntityType::Pre, + d.voffset().v, + d.vlength().v, + qs(d.vlanguage()), + }); + }, [&](const MTPDmessageEntityTextUrl &d) { + result.push_back({ + EntityType::CustomUrl, + d.voffset().v, + d.vlength().v, + qs(d.vurl()), + }); + }, [&](const MTPDmessageEntityMentionName &d) { + if (!session) { + return; } - } + const auto userId = UserId(d.vuser_id()); + const auto user = session->data().userLoaded(userId); + const auto data = MentionNameDataFromFields({ + .selfId = session->userId().bare, + .userId = userId.bare, + .accessHash = user ? user->accessHash() : 0, + }); + result.push_back({ + EntityType::MentionName, + d.voffset().v, + d.vlength().v, + data, + }); + }, [&](const MTPDinputMessageEntityMentionName &d) { + if (!session) { + return; + } + const auto data = d.vuser_id().match([&]( + const MTPDinputUserSelf &) { + return MentionNameDataFromFields({ + .selfId = session->userId().bare, + .userId = session->userId().bare, + .accessHash = session->user()->accessHash(), + }); + }, [&](const MTPDinputUser &data) { + return MentionNameDataFromFields({ + .selfId = session->userId().bare, + .userId = UserId(data.vuser_id()).bare, + .accessHash = data.vaccess_hash().v, + }); + }, [](const auto &) { + return QString(); + }); + if (!data.isEmpty()) { + result.push_back({ + EntityType::MentionName, + d.voffset().v, + d.vlength().v, + data, + }); + } + }, [&](const MTPDmessageEntityPhone &d) { + // Skipping phones. + }, [&](const MTPDmessageEntityCashtag &d) { + result.push_back({ + EntityType::Cashtag, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityUnderline &d) { + result.push_back({ + EntityType::Underline, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityStrike &d) { + result.push_back({ + EntityType::StrikeOut, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityBankCard &d) { + // Skipping cards. // #TODO entities + }, [&](const MTPDmessageEntitySpoiler &d) { + result.push_back({ + EntityType::Spoiler, + d.voffset().v, + d.vlength().v, + }); + }, [&](const MTPDmessageEntityCustomEmoji &d) { + result.push_back({ + EntityType::CustomEmoji, + d.voffset().v, + d.vlength().v, + CustomEmojiEntityData(d), + }); + }, [&](const MTPDmessageEntityBlockquote &d) { + result.push_back({ + EntityType::Blockquote, + d.voffset().v, + d.vlength().v, + }); + }); } return result; } @@ -134,7 +230,9 @@ MTPVector EntitiesToMTP( auto v = QVector(); v.reserve(entities.size()); for (const auto &entity : entities) { - if (entity.length() <= 0) continue; + if (entity.length() <= 0) { + continue; + } if (option == ConvertOption::SkipLocal && entity.type() != EntityType::Bold //&& entity.type() != EntityType::Semibold // Not in API. @@ -154,28 +252,76 @@ MTPVector EntitiesToMTP( auto offset = MTP_int(entity.offset()); auto length = MTP_int(entity.length()); switch (entity.type()) { - case EntityType::Url: v.push_back(MTP_messageEntityUrl(offset, length)); break; - case EntityType::CustomUrl: v.push_back(MTP_messageEntityTextUrl(offset, length, MTP_string(entity.data()))); break; - case EntityType::Email: v.push_back(MTP_messageEntityEmail(offset, length)); break; - case EntityType::Hashtag: v.push_back(MTP_messageEntityHashtag(offset, length)); break; - case EntityType::Cashtag: v.push_back(MTP_messageEntityCashtag(offset, length)); break; - case EntityType::Mention: v.push_back(MTP_messageEntityMention(offset, length)); break; + case EntityType::Url: { + v.push_back(MTP_messageEntityUrl(offset, length)); + } break; + case EntityType::CustomUrl: { + v.push_back( + MTP_messageEntityTextUrl( + offset, + length, + MTP_string(entity.data()))); + } break; + case EntityType::Email: { + v.push_back(MTP_messageEntityEmail(offset, length)); + } break; + case EntityType::Hashtag: { + v.push_back(MTP_messageEntityHashtag(offset, length)); + } break; + case EntityType::Cashtag: { + v.push_back(MTP_messageEntityCashtag(offset, length)); + } break; + case EntityType::Mention: { + v.push_back(MTP_messageEntityMention(offset, length)); + } break; case EntityType::MentionName: { - if (const auto valid = MentionNameEntity(session, offset, length, entity.data())) { + const auto valid = MentionNameEntity( + session, + offset, + length, + entity.data()); + if (valid) { v.push_back(*valid); } } break; - case EntityType::BotCommand: v.push_back(MTP_messageEntityBotCommand(offset, length)); break; - case EntityType::Bold: v.push_back(MTP_messageEntityBold(offset, length)); break; - case EntityType::Italic: v.push_back(MTP_messageEntityItalic(offset, length)); break; - case EntityType::Underline: v.push_back(MTP_messageEntityUnderline(offset, length)); break; - case EntityType::StrikeOut: v.push_back(MTP_messageEntityStrike(offset, length)); break; - case EntityType::Code: v.push_back(MTP_messageEntityCode(offset, length)); break; // #TODO entities - case EntityType::Pre: v.push_back(MTP_messageEntityPre(offset, length, MTP_string(entity.data()))); break; - case EntityType::Blockquote: v.push_back(MTP_messageEntityBlockquote(offset, length)); break; - case EntityType::Spoiler: v.push_back(MTP_messageEntitySpoiler(offset, length)); break; + case EntityType::BotCommand: { + v.push_back(MTP_messageEntityBotCommand(offset, length)); + } break; + case EntityType::Bold: { + v.push_back(MTP_messageEntityBold(offset, length)); + } break; + case EntityType::Italic: { + v.push_back(MTP_messageEntityItalic(offset, length)); + } break; + case EntityType::Underline: { + v.push_back(MTP_messageEntityUnderline(offset, length)); + } break; + case EntityType::StrikeOut: { + v.push_back(MTP_messageEntityStrike(offset, length)); + } break; + case EntityType::Code: { + // #TODO entities. + v.push_back(MTP_messageEntityCode(offset, length)); + } break; + case EntityType::Pre: { + v.push_back( + MTP_messageEntityPre( + offset, + length, + MTP_string(entity.data()))); + } break; + case EntityType::Blockquote: { + v.push_back(MTP_messageEntityBlockquote(offset, length)); + } break; + case EntityType::Spoiler: { + v.push_back(MTP_messageEntitySpoiler(offset, length)); + } break; case EntityType::CustomEmoji: { - if (const auto valid = CustomEmojiEntity(offset, length, entity.data())) { + const auto valid = CustomEmojiEntity( + offset, + length, + entity.data()); + if (valid) { v.push_back(*valid); } } break;