From 34993a11eecb208b32ed797ef614f9e997db42cf Mon Sep 17 00:00:00 2001 From: Ka3dr Date: Tue, 6 Oct 2026 09:56:55 +0300 Subject: [PATCH] Fix Legit points mode separation --- .../components/bestclient/show_points.cpp | 66 +++++++++++++++---- .../components/bestclient/show_points.h | 5 +- 2 files changed, 58 insertions(+), 13 deletions(-) diff --git a/src/game/client/components/bestclient/show_points.cpp b/src/game/client/components/bestclient/show_points.cpp index 2e5d987be..8d092acf9 100644 --- a/src/game/client/components/bestclient/show_points.cpp +++ b/src/game/client/components/bestclient/show_points.cpp @@ -20,12 +20,25 @@ bool IsJsonObject(const json_value *pValue) return pValue && pValue != &json_value_none && pValue->type == json_object; } +CShowPoints::EProvider LegitProviderFromGameType(const char *pGameType) +{ + if(!pGameType || !pGameType[0]) + return CShowPoints::EProvider::None; + if(str_find_nocase(pGameType, "ddrace") != nullptr) + return CShowPoints::EProvider::LegitDdrace; + if(str_find_nocase(pGameType, "gores") != nullptr) + return CShowPoints::EProvider::LegitGores; + return CShowPoints::EProvider::None; +} + bool ParsePoints(CShowPoints::EProvider Provider, const json_value *pRoot, int *pPoints) { if(!IsJsonObject(pRoot) || !pPoints) return false; - if(Provider == CShowPoints::EProvider::Ego || Provider == CShowPoints::EProvider::Legit) + if(Provider == CShowPoints::EProvider::Ego || + Provider == CShowPoints::EProvider::LegitGores || + Provider == CShowPoints::EProvider::LegitDdrace) { const json_value *pPointsVal = json_object_get(pRoot, "points"); if(pPointsVal == &json_value_none) @@ -71,10 +84,18 @@ bool CShowPoints::Enabled() const int CShowPoints::ProviderIndex(EProvider Provider) { - if(Provider == EProvider::Ego) + switch(Provider) + { + case EProvider::Ego: return 1; - if(Provider == EProvider::Legit) + case EProvider::LegitGores: return 2; + case EProvider::LegitDdrace: + return 3; + case EProvider::None: + case EProvider::Ddnet: + return 0; + } return 0; } @@ -111,6 +132,8 @@ CShowPoints::EProvider CShowPoints::CurrentProvider() const if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) return EProvider::None; + const CServerInfo &ServerInfo = Client()->ServerInfo(); + const IServerBrowser::CServerEntry *pEntry = ServerBrowser()->Find(Client()->ServerAddress()); const char *pCommunityId = CurrentCommunityId(); if(pCommunityId[0] != '\0') { @@ -120,7 +143,6 @@ CShowPoints::EProvider CShowPoints::CurrentProvider() const return EProvider::Ego; } - const CServerInfo &ServerInfo = Client()->ServerInfo(); if(str_find_nocase(ServerInfo.m_aName, "EGO |") || str_find_nocase(ServerInfo.m_aName, "eternal-gores") || str_find_nocase(ServerInfo.m_aName, "eternal gores")) @@ -128,9 +150,34 @@ CShowPoints::EProvider CShowPoints::CurrentProvider() const return EProvider::Ego; } - if(str_find_nocase(ServerInfo.m_aName, "Legit Network")) + const bool IsLegit = str_comp_nocase(pCommunityId, "legit") == 0 || + str_find_nocase(ServerInfo.m_aName, "Legit Network") != nullptr; + if(IsLegit) { - return EProvider::Legit; + EProvider Provider = LegitProviderFromGameType(ServerInfo.m_aGameType); + if(Provider != EProvider::None) + return Provider; + + if(GameClient()->m_ConnectServerInfo.has_value()) + { + Provider = LegitProviderFromGameType(GameClient()->m_ConnectServerInfo->m_aGameType); + if(Provider != EProvider::None) + return Provider; + } + + if(pEntry) + { + Provider = LegitProviderFromGameType(pEntry->m_Info.m_aGameType); + if(Provider != EProvider::None) + return Provider; + } + + Provider = LegitProviderFromGameType(GameClient()->m_GameInfo.m_aGameType); + if(Provider != EProvider::None) + return Provider; + + if(str_find_nocase(ServerInfo.m_aName, "Gores") != nullptr) + return EProvider::LegitGores; } return EProvider::None; @@ -242,14 +289,11 @@ void CShowPoints::StartRequest(const std::string &Name, EProvider Provider) EscapeUrl(aEscaped, sizeof(aEscaped), Name.c_str()); str_format(aUrl, sizeof(aUrl), "https://eternal-gores.com/api/profiles/by-nick/%s", aEscaped); } - else if(Provider == EProvider::Legit) + else if(Provider == EProvider::LegitGores || Provider == EProvider::LegitDdrace) { - const CServerInfo &ServerInfo = Client()->ServerInfo(); - const bool IsDDraceMode = str_find_nocase(ServerInfo.m_aGameType, "DDraceNetwork") != nullptr; - char aEscaped[256]; EscapeUrl(aEscaped, sizeof(aEscaped), Name.c_str()); - str_format(aUrl, sizeof(aUrl), "https://legit.tw/api_points.php?name=%s&mode=%s", aEscaped, IsDDraceMode ? "ddrace" : "gores"); + str_format(aUrl, sizeof(aUrl), "https://legit.tw/api_points.php?name=%s&mode=%s", aEscaped, Provider == EProvider::LegitDdrace ? "ddrace" : "gores"); } else { diff --git a/src/game/client/components/bestclient/show_points.h b/src/game/client/components/bestclient/show_points.h index b7c5f4b70..c5dbefb7e 100644 --- a/src/game/client/components/bestclient/show_points.h +++ b/src/game/client/components/bestclient/show_points.h @@ -20,7 +20,8 @@ class CShowPoints : public CComponent None = 0, Ddnet, Ego, - Legit, + LegitGores, + LegitDdrace, }; int Sizeof() const override { return sizeof(*this); } @@ -39,7 +40,7 @@ class CShowPoints : public CComponent private: enum { - PROVIDER_COUNT = 3, // Ddnet, Ego, Legit + PROVIDER_COUNT = 4, // Ddnet, Ego, Legit Gores, Legit DDRace MAX_CONCURRENT = 3, MAX_QUEUE = 64, SUCCESS_TTL_MS = 10 * 60 * 1000,