Skip to content

Commit

Permalink
Exclude DDNet servery by type
Browse files Browse the repository at this point in the history
  • Loading branch information
def- committed Dec 14, 2014
1 parent 3b0f768 commit 8d945fe
Show file tree
Hide file tree
Showing 5 changed files with 244 additions and 90 deletions.
116 changes: 82 additions & 34 deletions src/engine/client/serverbrowser.cpp
Expand Up @@ -561,17 +561,21 @@ void CServerBrowser::Refresh(int Type)

// remove unknown elements of exclude list
DDNetCountryFilterClean();

DDNetTypeFilterClean();

for(int i = 0; i < m_NumDDNetCountries; i++)
{
CDDNetCountry *pCntr = &m_aDDNetCountries[i];

// check for filter
if (DDNetCountryFiltered(pCntr->m_aName))
if(DDNetFiltered(g_Config.m_BrFilterExcludeCountries, pCntr->m_aName))
continue;

for(int g = 0; g < pCntr->m_NumServers; g++)
Set(pCntr->m_aServers[g], IServerBrowser::SET_DDNET_ADD, -1, 0);
{
if(!DDNetFiltered(g_Config.m_BrFilterExcludeTypes, pCntr->m_aTypes[g]))
Set(pCntr->m_aServers[g], IServerBrowser::SET_DDNET_ADD, -1, 0);
}
}
}
}
Expand Down Expand Up @@ -674,12 +678,12 @@ void CServerBrowser::Update(bool ForceResort)
Packet.m_Address = Addr;
m_pNetClient->Send(&Packet);
if(g_Config.m_Debug)
{
{
dbg_msg("client_srvbrowse", "Count-Request sent to %d", i);
}
}
}
}
}

//Check if all server counts arrived
if(m_MasterServerCount == -1)
{
Expand Down Expand Up @@ -882,7 +886,8 @@ void CServerBrowser::RemoveFavorite(const NETADDR &Addr)
void CServerBrowser::LoadDDNet()
{
// reset servers / countries
m_NumDDNetCountries = 0;
m_NumDDNetCountries = 0;
m_NumDDNetTypes = 0;

// load ddnet server list
IStorage *pStorage = Kernel()->RequestInterface<IStorage>();
Expand All @@ -906,12 +911,15 @@ void CServerBrowser::LoadDDNet()
{
// pSrv - { name, flagId, servers }
const json_value *pSrv = json_array_get(pCountries, i);
const json_value *pAddrs = json_object_get(pSrv, "servers");
const json_value *pTypes = json_object_get(pSrv, "servers");
const json_value *pName = json_object_get(pSrv, "name");
const json_value *pFlagID = json_object_get(pSrv, "flagId");

if (pSrv->type != json_object || pAddrs->type != json_array || pName->type != json_string || pFlagID->type != json_integer)
continue; // invalid attributes
if (pSrv->type != json_object || pTypes->type != json_object || pName->type != json_string || pFlagID->type != json_integer)
{
dbg_msg("client_srvbrowse", "Invalid attributes");
continue;
}

// build structure
CDDNetCountry *pCntr = &m_aDDNetCountries[m_NumDDNetCountries];
Expand All @@ -921,14 +929,36 @@ void CServerBrowser::LoadDDNet()
str_copy(pCntr->m_aName, json_string_get(pName), sizeof(pCntr->m_aName));
pCntr->m_FlagID = json_int_get(pFlagID);

// add addresses
for (int g = 0; g < json_array_length(pAddrs); g++)
// add country
for (unsigned int t = 0; t < pTypes->u.object.length; t++)
{
const json_value *pAddr = json_array_get(pAddrs, g);
const char *pStr = json_string_get(pAddr);
const char *pType = pTypes->u.object.values[t].name;
const json_value *pAddrs = pTypes->u.object.values[t].value;

net_addr_from_str(&pCntr->m_aServers[g], pStr);
pCntr->m_NumServers++;
// add type
if(json_array_length(pAddrs) > 0 && m_NumDDNetTypes < MAX_DDNET_TYPES)
{
int pos;
for(pos = 0; pos < m_NumDDNetTypes; pos++)
{
if(!str_comp(m_aDDNetTypes[pos], pType))
break;
}
if(pos == m_NumDDNetTypes)
{
str_copy(m_aDDNetTypes[m_NumDDNetTypes], pType, sizeof(m_aDDNetTypes[m_NumDDNetTypes]));
m_NumDDNetTypes++;
}
}

// add addresses
for (int g = 0; g < json_array_length(pAddrs); g++, pCntr->m_NumServers++)
{
const json_value *pAddr = json_array_get(pAddrs, g);
const char* pStr = json_string_get(pAddr);
net_addr_from_str(&pCntr->m_aServers[pCntr->m_NumServers], pStr);
str_copy(pCntr->m_aTypes[pCntr->m_NumServers], pType, sizeof(pCntr->m_aTypes[pCntr->m_NumServers]));
}
}

m_NumDDNetCountries++;
Expand Down Expand Up @@ -976,49 +1006,49 @@ void CServerBrowser::ConfigSaveCallback(IConfig *pConfig, void *pUserData)
}
}

void CServerBrowser::DDNetCountryFilterAdd(const char *pName)
void CServerBrowser::DDNetFilterAdd(char *pFilter, const char *pName)
{
if (DDNetCountryFiltered(pName))
if (DDNetFiltered(pFilter, pName))
return;

char aBuf[256];
char aBuf[128];
str_format(aBuf, sizeof(aBuf), ",%s", pName);
str_append(g_Config.m_BrFilterExcludeCountries, aBuf, sizeof(g_Config.m_BrFilterExcludeCountries));
str_append(pFilter, aBuf, 128);
}

void CServerBrowser::DDNetCountryFilterRem(const char *pName)
void CServerBrowser::DDNetFilterRem(char *pFilter, const char *pName)
{
if (!DDNetCountryFiltered(pName))
if (!DDNetFiltered(pFilter, pName))
return;

// rewrite exclude/filter list
char aBuf[256];
char aBuf[128];
char *p;

str_copy(aBuf, g_Config.m_BrFilterExcludeCountries, sizeof(aBuf));
g_Config.m_BrFilterExcludeCountries[0] = '\0';
str_copy(aBuf, pFilter, sizeof(aBuf));
pFilter[0] = '\0';

p = strtok(aBuf, ",");

while(p)
{
if(str_comp_nocase(pName, p) != 0)
{
char aBuf2[256];
char aBuf2[128];
str_format(aBuf2, sizeof(aBuf2), ",%s", p);
str_append(g_Config.m_BrFilterExcludeCountries, aBuf2, sizeof(g_Config.m_BrFilterExcludeCountries));
str_append(pFilter, aBuf2, 128);
}

p = strtok(NULL, ",");
}
}

bool CServerBrowser::DDNetCountryFiltered(const char *pName)
bool CServerBrowser::DDNetFiltered(char *pFilter, const char *pName)
{
char aBuf[256];
char aBuf[128];
char *p;

str_copy(aBuf, g_Config.m_BrFilterExcludeCountries, sizeof(aBuf));
str_copy(aBuf, pFilter, sizeof(aBuf));

p = strtok(aBuf, ",");

Expand All @@ -1035,18 +1065,36 @@ bool CServerBrowser::DDNetCountryFiltered(const char *pName)

void CServerBrowser::DDNetCountryFilterClean()
{
char aNewList[256];
char aNewList[128];

for(int i = 0; i < m_NumDDNetCountries; i++)
{
const char *pName = m_aDDNetCountries[i].m_aName;
if(DDNetCountryFiltered(pName))
if(DDNetFiltered(g_Config.m_BrFilterExcludeCountries, pName))
{
char aBuf[256];
char aBuf[128];
str_format(aBuf, sizeof(aBuf), ",%s", pName);
str_append(aNewList, aBuf, sizeof(aNewList));
}
}

str_copy(g_Config.m_BrFilterExcludeCountries, aNewList, sizeof(g_Config.m_BrFilterExcludeCountries));
}

void CServerBrowser::DDNetTypeFilterClean()
{
char aNewList[128];

for(int i = 0; i < m_NumDDNetTypes; i++)
{
const char *pName = m_aDDNetTypes[i];
if(DDNetFiltered(g_Config.m_BrFilterExcludeTypes, pName))
{
char aBuf[128];
str_format(aBuf, sizeof(aBuf), ",%s", pName);
str_append(aNewList, aBuf, sizeof(aNewList));
}
}

str_copy(g_Config.m_BrFilterExcludeTypes, aNewList, sizeof(g_Config.m_BrFilterExcludeTypes));
}
27 changes: 22 additions & 5 deletions src/engine/client/serverbrowser.h
Expand Up @@ -34,16 +34,25 @@ class CServerBrowser : public IServerBrowser
char m_aName[256];
int m_FlagID;
NETADDR m_aServers[MAX_SERVERS];
char m_aTypes[MAX_SERVERS][32];
int m_NumServers;

void Reset() { m_NumServers = 0; m_FlagID = -1; m_aName[0] = '\0'; };
void Add(NETADDR Addr) { if (m_NumServers < MAX_SERVERS) m_aServers[m_NumServers++] = Addr; };
/*void Add(NETADDR Addr, char* pType) {
if (m_NumServers < MAX_SERVERS)
{
m_aServers[m_NumServers] = Addr;
str_copy(m_aTypes[m_NumServers], pType, sizeof(m_aTypes[0]));
m_NumServers++;
}
};*/
};

enum
{
MAX_FAVORITES=2048,
MAX_DDNET_COUNTRIES=16,
MAX_DDNET_TYPES=32,
};

CServerBrowser();
Expand All @@ -67,11 +76,16 @@ class CServerBrowser : public IServerBrowser
int NumDDNetCountries() { return m_NumDDNetCountries; };
int GetDDNetCountryFlag(int Index) { return m_aDDNetCountries[Index].m_FlagID; };
const char *GetDDNetCountryName(int Index) { return m_aDDNetCountries[Index].m_aName; };
void DDNetCountryFilterAdd(const char *pName);
void DDNetCountryFilterRem(const char *pName);
bool DDNetCountryFiltered(const char *pName);

int NumDDNetTypes() { return m_NumDDNetTypes; };
const char *GetDDNetType(int Index) { return m_aDDNetTypes[Index]; };

void DDNetFilterAdd(char *pFilter, const char *pName);
void DDNetFilterRem(char *pFilter, const char *pName);
bool DDNetFiltered(char *pFilter, const char *pName);
void DDNetCountryFilterClean();

void DDNetTypeFilterClean();

//
void Update(bool ForceResort);
void Set(const NETADDR &Addr, int Type, int Token, const CServerInfo *pInfo);
Expand Down Expand Up @@ -100,6 +114,9 @@ class CServerBrowser : public IServerBrowser
CDDNetCountry m_aDDNetCountries[MAX_DDNET_COUNTRIES];
int m_NumDDNetCountries;

char m_aDDNetTypes[MAX_DDNET_TYPES][32];
int m_NumDDNetTypes;

CServerEntry *m_aServerlistIp[256]; // ip hash list

CServerEntry *m_pFirstReqServer; // request list
Expand Down
10 changes: 7 additions & 3 deletions src/engine/serverbrowser.h
Expand Up @@ -107,9 +107,13 @@ class IServerBrowser : public IInterface
virtual int NumDDNetCountries() = 0;
virtual int GetDDNetCountryFlag(int Index) = 0;
virtual const char *GetDDNetCountryName(int Index) = 0;
virtual void DDNetCountryFilterAdd(const char *pName) = 0;
virtual void DDNetCountryFilterRem(const char *pName) = 0;
virtual bool DDNetCountryFiltered(const char *pName) = 0;

virtual int NumDDNetTypes() = 0;
virtual const char *GetDDNetType(int Index) = 0;

virtual void DDNetFilterAdd(char *pFilter, const char *pName) = 0;
virtual void DDNetFilterRem(char *pFilter, const char *pName) = 0;
virtual bool DDNetFiltered(char *pFilter, const char *pName) = 0;
};

#endif
1 change: 1 addition & 0 deletions src/engine/shared/config_variables.h
Expand Up @@ -55,6 +55,7 @@ MACRO_CONFIG_INT(BrFilterPureMap, br_filter_pure_map, 0, 0, 1, CFGFLAG_SAVE|CFGF
MACRO_CONFIG_INT(BrFilterCompatversion, br_filter_compatversion, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-compatible servers in browser")

MACRO_CONFIG_STR(BrFilterExcludeCountries, br_filter_exclude_countries, 128, "", CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out ddnet servers by country")
MACRO_CONFIG_STR(BrFilterExcludeTypes, br_filter_exclude_types, 128, "", CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out ddnet servers by type (mod)")

MACRO_CONFIG_INT(BrSort, br_sort, 1, 0, 256, CFGFLAG_SAVE|CFGFLAG_CLIENT, "")
MACRO_CONFIG_INT(BrSortOrder, br_sort_order, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "")
Expand Down

0 comments on commit 8d945fe

Please sign in to comment.