Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 55 additions & 11 deletions src/game/client/components/bestclient/show_points.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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')
{
Expand All @@ -120,17 +143,41 @@ 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"))
{
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;
Expand Down Expand Up @@ -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
{
Expand Down
5 changes: 3 additions & 2 deletions src/game/client/components/bestclient/show_points.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ class CShowPoints : public CComponent
None = 0,
Ddnet,
Ego,
Legit,
LegitGores,
LegitDdrace,
};

int Sizeof() const override { return sizeof(*this); }
Expand All @@ -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,
Expand Down
Loading