diff options
Diffstat (limited to 'src/CompositeChat.cpp')
-rw-r--r-- | src/CompositeChat.cpp | 266 |
1 files changed, 143 insertions, 123 deletions
diff --git a/src/CompositeChat.cpp b/src/CompositeChat.cpp index 94ed78197..3a676c23b 100644 --- a/src/CompositeChat.cpp +++ b/src/CompositeChat.cpp @@ -45,16 +45,20 @@ void cCompositeChat::Clear(void) void cCompositeChat::AddTextPart(const AString & a_Message, const AString & a_Style) { - m_Parts.push_back(TextPart{{ a_Message, a_Style, {} } }); + m_Parts.push_back(TextPart {{a_Message, a_Style, {}}}); } -void cCompositeChat::AddClientTranslatedPart(const AString & a_TranslationID, const AStringVector & a_Parameters, const AString & a_Style) +void cCompositeChat::AddClientTranslatedPart( + const AString & a_TranslationID, + const AStringVector & a_Parameters, + const AString & a_Style +) { - m_Parts.push_back(ClientTranslatedPart{{ a_TranslationID, a_Style, {} }, a_Parameters }); + m_Parts.push_back(ClientTranslatedPart {{a_TranslationID, a_Style, {}}, a_Parameters}); } @@ -63,7 +67,7 @@ void cCompositeChat::AddClientTranslatedPart(const AString & a_TranslationID, co void cCompositeChat::AddUrlPart(const AString & a_Text, const AString & a_Url, const AString & a_Style) { - m_Parts.push_back(UrlPart{{ a_Text, a_Style, {} }, a_Url }); + m_Parts.push_back(UrlPart {{a_Text, a_Style, {}}, a_Url}); } @@ -72,38 +76,46 @@ void cCompositeChat::AddUrlPart(const AString & a_Text, const AString & a_Url, c void cCompositeChat::AddRunCommandPart(const AString & a_Text, const AString & a_Command, const AString & a_Style) { - m_Parts.push_back(RunCommandPart{{{ a_Text, a_Style, {} }, a_Command } }); + m_Parts.push_back(RunCommandPart {{{a_Text, a_Style, {}}, a_Command}}); } -void cCompositeChat::AddSuggestCommandPart(const AString & a_Text, const AString & a_SuggestedCommand, const AString & a_Style) +void cCompositeChat::AddSuggestCommandPart( + const AString & a_Text, + const AString & a_SuggestedCommand, + const AString & a_Style +) { - m_Parts.push_back(SuggestCommandPart{{{ a_Text, a_Style, {} }, a_SuggestedCommand } }); + m_Parts.push_back(SuggestCommandPart {{{a_Text, a_Style, {}}, a_SuggestedCommand}}); } -void cCompositeChat::AddShowAchievementPart(const AString & a_PlayerName, const AString & a_Achievement, const AString & a_Style) +void cCompositeChat::AddShowAchievementPart( + const AString & a_PlayerName, + const AString & a_Achievement, + const AString & a_Style +) { - m_Parts.push_back(ShowAchievementPart{{ a_Achievement, a_Style, {} }, a_PlayerName }); + m_Parts.push_back(ShowAchievementPart {{a_Achievement, a_Style, {}}, a_PlayerName}); } /** -* Parse the input message to add colors or link then add it to the object. -* -* It detects every & of the message and the next character for it to colorize. -* It detect : in the text to detect link structures. -* -* @param a_ParseText The input text to parse -*/ + * Parse the input message to add colors or link then add it to the object. + * + * It detects every & of the message and the next character for it to colorize. + * It detect : in the text to detect link structures. + * + * @param a_ParseText The input text to parse + */ void cCompositeChat::ParseText(const AString & a_ParseText) { size_t len = a_ParseText.length(); @@ -117,7 +129,7 @@ void cCompositeChat::ParseText(const AString & a_ParseText) { case '&': //< Color code { - if ((i != 0) && (a_ParseText[i-1] == '\\')) + if ((i != 0) && (a_ParseText[i - 1] == '\\')) { CurrentText.append(a_ParseText, cursor, i - cursor - 1).append("&"); AddTextPart(CurrentText, CurrentStyle); @@ -148,26 +160,20 @@ void cCompositeChat::ParseText(const AString & a_ParseText) case ':': { - static const constexpr std::array<std::string_view, 2> LinkPrefixes = - { - { - "http", - "https" - } - }; + static const constexpr std::array<std::string_view, 2> LinkPrefixes = {{"http", "https"}}; for (const auto & Prefix : LinkPrefixes) { size_t PrefixLen = Prefix.size(); - if ( - (i >= cursor + PrefixLen) && // There is enough space in front of the colon for the prefix - (std::string_view(a_ParseText).substr(i - PrefixLen, PrefixLen) == Prefix) // the prefix matches + if ((i >= cursor + PrefixLen) && // There is enough space in front of the colon for the prefix + (std::string_view(a_ParseText).substr(i - PrefixLen, PrefixLen) == Prefix + ) // the prefix matches ) { // Add everything before this as a text part: - if (i > cursor+ PrefixLen) + if (i > cursor + PrefixLen) { CurrentText.append(a_ParseText.c_str() + cursor, i - cursor - PrefixLen); - cursor= i - PrefixLen; + cursor = i - PrefixLen; } if (!CurrentText.empty()) { @@ -183,7 +189,11 @@ void cCompositeChat::ParseText(const AString & a_ParseText) break; } } - AddUrlPart(a_ParseText.substr(cursor, i - cursor), a_ParseText.substr(cursor, i - cursor), CurrentStyle); + AddUrlPart( + a_ParseText.substr(cursor, i - cursor), + a_ParseText.substr(cursor, i - cursor), + CurrentStyle + ); cursor = i; break; } @@ -218,15 +228,17 @@ void cCompositeChat::UnderlineUrls(void) { for (auto & Part : m_Parts) { - std::visit(OverloadedVariantAccess - { - [](TextPart & a_Part) { }, - [](ClientTranslatedPart & a_Part) { }, - [](UrlPart & a_Part) { a_Part.Style += 'n'; }, - [](RunCommandPart & a_Part) { }, - [](SuggestCommandPart & a_Part) { }, - [](ShowAchievementPart & a_Part) { }, - }, Part); + std::visit( + OverloadedVariantAccess { + [](TextPart & a_Part) {}, + [](ClientTranslatedPart & a_Part) {}, + [](UrlPart & a_Part) { a_Part.Style += 'n'; }, + [](RunCommandPart & a_Part) {}, + [](SuggestCommandPart & a_Part) {}, + [](ShowAchievementPart & a_Part) {}, + }, + Part + ); } } @@ -239,15 +251,17 @@ AString cCompositeChat::ExtractText(void) const AString Msg; for (const auto & Part : m_Parts) { - std::visit(OverloadedVariantAccess - { - [&Msg](const TextPart & a_Part) { Msg.append(a_Part.Text); }, - [&Msg](const ClientTranslatedPart & a_Part) { Msg.append(a_Part.Text); }, - [&Msg](const UrlPart & a_Part) { Msg.append(a_Part.Url); }, - [&Msg](const RunCommandPart & a_Part) { Msg.append(a_Part.Text); }, - [&Msg](const SuggestCommandPart & a_Part) { Msg.append(a_Part.Text); }, - [ ](const ShowAchievementPart & a_Part) { }, - }, Part); + std::visit( + OverloadedVariantAccess { + [&Msg](const TextPart & a_Part) { Msg.append(a_Part.Text); }, + [&Msg](const ClientTranslatedPart & a_Part) { Msg.append(a_Part.Text); }, + [&Msg](const UrlPart & a_Part) { Msg.append(a_Part.Url); }, + [&Msg](const RunCommandPart & a_Part) { Msg.append(a_Part.Text); }, + [&Msg](const SuggestCommandPart & a_Part) { Msg.append(a_Part.Text); }, + [](const ShowAchievementPart & a_Part) {}, + }, + Part + ); } return Msg; } @@ -270,7 +284,7 @@ eLogLevel cCompositeChat::MessageTypeToLogLevel(eMessageType a_MessageType) case mtPrivateMessage: return eLogLevel::Regular; case mtJoin: return eLogLevel::Regular; case mtLeave: return eLogLevel::Regular; - case mtMaxPlusOne: break; + case mtMaxPlusOne: break; } ASSERT(!"Unhandled MessageType"); return eLogLevel::Error; @@ -283,95 +297,101 @@ eLogLevel cCompositeChat::MessageTypeToLogLevel(eMessageType a_MessageType) AString cCompositeChat::CreateJsonString(bool a_ShouldUseChatPrefixes) const { Json::Value Message; - Message["text"] = cClientHandle::FormatMessageType(a_ShouldUseChatPrefixes, GetMessageType(), GetAdditionalMessageTypeData()); // The client crashes without this field being present + Message["text"] = cClientHandle::FormatMessageType( + a_ShouldUseChatPrefixes, + GetMessageType(), + GetAdditionalMessageTypeData() + ); // The client crashes without this field being present for (const auto & Part : m_Parts) { Json::Value JsonPart; - std::visit(OverloadedVariantAccess - { - [this, &JsonPart](const TextPart & a_Part) - { - JsonPart["text"] = a_Part.Text; - AddChatPartStyle(JsonPart, a_Part.Style); - }, - [this, &JsonPart](const ClientTranslatedPart & a_Part) - { - JsonPart["translate"] = a_Part.Text; - Json::Value With; - for (const auto & Parameter : a_Part.Parameters) + std::visit( + OverloadedVariantAccess { + [this, &JsonPart](const TextPart & a_Part) { - With.append(Parameter); - } - if (!a_Part.Parameters.empty()) + JsonPart["text"] = a_Part.Text; + AddChatPartStyle(JsonPart, a_Part.Style); + }, + [this, &JsonPart](const ClientTranslatedPart & a_Part) { - JsonPart["with"] = With; - } - AddChatPartStyle(JsonPart, a_Part.Style); - }, - [this, &JsonPart](const UrlPart & a_Part) - { - JsonPart["text"] = a_Part.Text; - Json::Value Url; - Url["action"] = "open_url"; - Url["value"] = a_Part.Url; - JsonPart["clickEvent"] = Url; - AddChatPartStyle(JsonPart, a_Part.Style); - }, - [this, &JsonPart](const RunCommandPart & a_Part) - { - JsonPart["text"] = a_Part.Text; - Json::Value Cmd; - Cmd["action"] = "run_command"; - Cmd["value"] = a_Part.Command; - JsonPart["clickEvent"] = Cmd; - AddChatPartStyle(JsonPart, a_Part.Style); - }, - [this, &JsonPart](const SuggestCommandPart & a_Part) - { - JsonPart["text"] = a_Part.Text; - Json::Value Cmd; - Cmd["action"] = "suggest_command"; - Cmd["value"] = a_Part.Command; - JsonPart["clickEvent"] = Cmd; - AddChatPartStyle(JsonPart, a_Part.Style); - }, - [this, &JsonPart](const ShowAchievementPart & a_Part) - { - JsonPart["translate"] = "chat.type.achievement"; + JsonPart["translate"] = a_Part.Text; + Json::Value With; + for (const auto & Parameter : a_Part.Parameters) + { + With.append(Parameter); + } + if (!a_Part.Parameters.empty()) + { + JsonPart["with"] = With; + } + AddChatPartStyle(JsonPart, a_Part.Style); + }, + [this, &JsonPart](const UrlPart & a_Part) + { + JsonPart["text"] = a_Part.Text; + Json::Value Url; + Url["action"] = "open_url"; + Url["value"] = a_Part.Url; + JsonPart["clickEvent"] = Url; + AddChatPartStyle(JsonPart, a_Part.Style); + }, + [this, &JsonPart](const RunCommandPart & a_Part) + { + JsonPart["text"] = a_Part.Text; + Json::Value Cmd; + Cmd["action"] = "run_command"; + Cmd["value"] = a_Part.Command; + JsonPart["clickEvent"] = Cmd; + AddChatPartStyle(JsonPart, a_Part.Style); + }, + [this, &JsonPart](const SuggestCommandPart & a_Part) + { + JsonPart["text"] = a_Part.Text; + Json::Value Cmd; + Cmd["action"] = "suggest_command"; + Cmd["value"] = a_Part.Command; + JsonPart["clickEvent"] = Cmd; + AddChatPartStyle(JsonPart, a_Part.Style); + }, + [this, &JsonPart](const ShowAchievementPart & a_Part) + { + JsonPart["translate"] = "chat.type.achievement"; - Json::Value Ach; - Ach["action"] = "show_achievement"; - Ach["value"] = a_Part.Text; + Json::Value Ach; + Ach["action"] = "show_achievement"; + Ach["value"] = a_Part.Text; - Json::Value AchColourAndName; - AchColourAndName["color"] = "green"; - AchColourAndName["translate"] = a_Part.Text; - AchColourAndName["hoverEvent"] = Ach; + Json::Value AchColourAndName; + AchColourAndName["color"] = "green"; + AchColourAndName["translate"] = a_Part.Text; + AchColourAndName["hoverEvent"] = Ach; - Json::Value Extra; - Extra.append(AchColourAndName); + Json::Value Extra; + Extra.append(AchColourAndName); - Json::Value Name; - Name["text"] = a_Part.PlayerName; + Json::Value Name; + Name["text"] = a_Part.PlayerName; - Json::Value With; - With.append(Name); - With.append(Extra); + Json::Value With; + With.append(Name); + With.append(Extra); - JsonPart["with"] = With; - AddChatPartStyle(JsonPart, a_Part.Style); + JsonPart["with"] = With; + AddChatPartStyle(JsonPart, a_Part.Style); + }, }, - }, Part); + Part + ); Message["extra"].append(JsonPart); } // for itr - Parts[] - #if 1 - // Serialize as machine-readable string (no whitespace): - return JsonUtils::WriteFastString(Message); - #else - // Serialize as human-readable string (pretty-printed): - return JsonUtils::WriteStyledString(msg); - #endif +#if 1 + // Serialize as machine-readable string (no whitespace): + return JsonUtils::WriteFastString(Message); +#else + // Serialize as human-readable string (pretty-printed): + return JsonUtils::WriteStyledString(msg); +#endif } |