DDNet documentation
Loading...
Searching...
No Matches
serverbrowser.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#ifndef ENGINE_SERVERBROWSER_H
4#define ENGINE_SERVERBROWSER_H
5
6#include "kernel.h"
7
8#include <base/color.h>
9#include <base/hash.h>
10#include <base/str.h>
11
12#include <engine/map.h>
14
15#include <generated/protocol7.h>
16
17#include <optional>
18#include <unordered_set>
19#include <vector>
20
21static constexpr const char *DDNET_INFO_FILE = "ddnet-info.json";
22static constexpr const char *DDNET_INFO_URL = "https://info.ddnet.org/info";
23
24class CUIElement;
25
27{
28public:
29 enum
30 {
38 // Special case China because it has an exceptionally bad
39 // connection to the outside due to the Great Firewall of
40 // China:
41 // https://en.wikipedia.org/w/index.php?title=Great_Firewall&oldid=1019589632
44 };
45
53
60
61 enum
62 {
66 };
67
91
93
94 int m_Type;
96
99
103
117 int m_Latency; // in ms
119 char m_aGameType[16];
121 char m_aName[64];
125 char m_aVersion[32];
127 std::vector<CClient> m_vClients;
130
131 static int EstimateLatency(int Loc1, int Loc2);
132 static bool ParseLocation(int *pResult, const char *pString);
133 static ColorRGBA GametypeColor(const char *pGametype);
134};
135
137{
140
141public:
142 CCommunityCountryServer(NETADDR Address, const char *pTypeName) :
144 {
145 str_copy(m_aTypeName, pTypeName);
146 }
147
148 NETADDR Address() const { return m_Address; }
149 const char *TypeName() const { return m_aTypeName; }
150};
151
153{
154 friend class CServerBrowser;
155
161 std::vector<CCommunityCountryServer> m_vServers;
162
163public:
164 CCommunityCountry(const char *pName, int FlagId) :
166 {
167 str_copy(m_aName, pName);
168 }
169
170 const char *Name() const { return m_aName; }
171 int FlagId() const { return m_FlagId; }
172 const std::vector<CCommunityCountryServer> &Servers() const { return m_vServers; }
173};
174
176{
178
179public:
180 CCommunityType(const char *pName)
181 {
182 str_copy(m_aName, pName);
183 }
184
185 const char *Name() const { return m_aName; }
186};
187
189{
191
192public:
193 CCommunityMap(const char *pName)
194 {
195 str_copy(m_aName, pName);
196 }
197
198 const char *Name() const { return m_aName; }
199
200 bool operator==(const CCommunityMap &Other) const
201 {
202 return str_comp(Name(), Other.Name()) == 0;
203 }
204
205 bool operator!=(const CCommunityMap &Other) const
206 {
207 return !(*this == Other);
208 }
209
210 struct SHash
211 {
212 size_t operator()(const CCommunityMap &Map) const
213 {
214 return str_quickhash(Map.Name());
215 }
216 };
217};
218
220{
221 friend class CServerBrowser;
222
224 char m_aName[64];
225 std::optional<SHA256_DIGEST> m_IconSha256;
226 char m_aIconUrl[128];
227 std::vector<CCommunityCountry> m_vCountries;
228 std::vector<CCommunityType> m_vTypes;
230 bool m_HasFinishes = false;
231 std::unordered_set<CCommunityMap, CCommunityMap::SHash> m_FinishedMaps;
232
233public:
234 CCommunity(const char *pId, const char *pName, std::optional<SHA256_DIGEST> IconSha256, const char *pIconUrl) :
236 {
237 str_copy(m_aId, pId);
238 str_copy(m_aName, pName);
239 str_copy(m_aIconUrl, pIconUrl);
240 }
241
242 const char *Id() const { return m_aId; }
243 const char *Name() const { return m_aName; }
244 const char *IconUrl() const { return m_aIconUrl; }
245 const std::optional<SHA256_DIGEST> &IconSha256() const { return m_IconSha256; }
246 const std::vector<CCommunityCountry> &Countries() const { return m_vCountries; }
247 const std::vector<CCommunityType> &Types() const { return m_vTypes; }
248 bool HasCountry(const char *pCountryName) const;
249 bool HasType(const char *pTypeName) const;
250 bool HasRanks() const { return m_HasFinishes; }
251 CServerInfo::ERankState HasRank(const char *pMap) const;
252 int NumPlayers() const { return m_NumPlayers; }
253};
254
256{
257public:
258 virtual ~IFilterList() = default;
259 virtual void Add(const char *pElement) = 0;
260 virtual void Remove(const char *pElement) = 0;
261 virtual void Clear() = 0;
262 virtual bool Empty() const = 0;
263 virtual bool Filtered(const char *pElement) const = 0;
264};
265
267{
268public:
269 virtual ~ICommunityCache() = default;
270 virtual void Update(bool Force) = 0;
271 virtual const std::vector<const CCommunity *> &SelectedCommunities() const = 0;
272 virtual const std::vector<const CCommunityCountry *> &SelectableCountries() const = 0;
273 virtual const std::vector<const CCommunityType *> &SelectableTypes() const = 0;
274 virtual bool AnyRanksAvailable() const = 0;
275 virtual bool CountriesTypesFilterAvailable() const = 0;
276 virtual const char *CountryTypeFilterKey() const = 0;
277};
278
280{
281 MACRO_INTERFACE("serverbrowser")
282public:
283 /* Constants: Server Browser Sorting
284 SORT_NAME - Sort by name.
285 SORT_PING - Sort by ping.
286 SORT_MAP - Sort by map.
287 SORT_GAMETYPE - Sort by game type. DM, TDM etc.
288 SORT_NUMPLAYERS - Sort after how many players there are on the server.
289 SORT_NUMFRIENDS - Sort after how many friends there are on the server.
290 SORT_FAVORITES - Sort by favorite status, number of players and then ping.
291 */
292 enum
293 {
301 };
302
303 enum
304 {
308 };
309
310 enum
311 {
321 };
322
323 enum
324 {
327 };
328
340
341 static constexpr const char *COMMUNITY_DDNET = "ddnet";
342 static constexpr const char *COMMUNITY_NONE = "none";
343
344 static constexpr const char *COMMUNITY_COUNTRY_NONE = "none";
345 static constexpr const char *COMMUNITY_TYPE_NONE = "None";
350 static constexpr const char *COMMUNITY_ALL = "all";
351
352 static constexpr const char *SEARCH_EXCLUDE_TOKEN = ";";
353
354 virtual void Refresh(int Type, bool Force = false) = 0;
355 virtual bool IsRefreshing() const = 0;
356 virtual bool IsGettingServerlist() const = 0;
357 virtual bool IsServerlistError() const = 0;
358 virtual int LoadingProgression() const = 0;
359
360 virtual int NumServers() const = 0;
361 virtual const CServerInfo *Get(int Index) const = 0;
362
363 virtual int Players(const CServerInfo &Item) const = 0;
364 virtual int Max(const CServerInfo &Item) const = 0;
365
366 virtual int NumSortedServers() const = 0;
367 virtual int NumSortedPlayers() const = 0;
368 virtual const CServerInfo *SortedGet(int Index) const = 0;
369
370 virtual const std::vector<CCommunity> &Communities() const = 0;
371 virtual const CCommunity *Community(const char *pCommunityId) const = 0;
372 virtual std::vector<const CCommunity *> SelectedCommunities() const = 0;
373 virtual std::vector<const CCommunity *> FavoriteCommunities() const = 0;
374 virtual std::vector<const CCommunity *> CurrentCommunities() const = 0;
375 virtual unsigned CurrentCommunitiesHash() const = 0;
376
377 virtual bool DDNetInfoAvailable() const = 0;
378 virtual std::optional<SHA256_DIGEST> DDNetInfoSha256() const = 0;
379
381 virtual const ICommunityCache &CommunityCache() const = 0;
385 virtual IFilterList &TypesFilter() = 0;
386 virtual const IFilterList &FavoriteCommunitiesFilter() const = 0;
387 virtual const IFilterList &CommunitiesFilter() const = 0;
388 virtual const IFilterList &CountriesFilter() const = 0;
389 virtual const IFilterList &TypesFilter() const = 0;
390 virtual void CleanFilters() = 0;
391
392 virtual CServerEntry *Find(const NETADDR &Addr) = 0;
393 virtual int GetCurrentType() = 0;
394 virtual const char *GetTutorialServer() = 0;
395};
396
397#endif
const char * TypeName() const
Definition serverbrowser.h:149
NETADDR m_Address
Definition serverbrowser.h:138
char m_aTypeName[CServerInfo::MAX_COMMUNITY_TYPE_LENGTH]
Definition serverbrowser.h:139
CCommunityCountryServer(NETADDR Address, const char *pTypeName)
Definition serverbrowser.h:142
NETADDR Address() const
Definition serverbrowser.h:148
const char * Name() const
Definition serverbrowser.h:170
const std::vector< CCommunityCountryServer > & Servers() const
Definition serverbrowser.h:172
std::vector< CCommunityCountryServer > m_vServers
Definition serverbrowser.h:161
int m_FlagId
Definition serverbrowser.h:160
int FlagId() const
Definition serverbrowser.h:171
friend class CServerBrowser
Definition serverbrowser.h:154
char m_aName[CServerInfo::MAX_COMMUNITY_COUNTRY_LENGTH]
Definition serverbrowser.h:156
CCommunityCountry(const char *pName, int FlagId)
Definition serverbrowser.h:164
CCommunityMap(const char *pName)
Definition serverbrowser.h:193
bool operator==(const CCommunityMap &Other) const
Definition serverbrowser.h:200
char m_aName[MAX_MAP_LENGTH]
Definition serverbrowser.h:190
const char * Name() const
Definition serverbrowser.h:198
bool operator!=(const CCommunityMap &Other) const
Definition serverbrowser.h:205
const char * Name() const
Definition serverbrowser.h:185
char m_aName[CServerInfo::MAX_COMMUNITY_TYPE_LENGTH]
Definition serverbrowser.h:177
CCommunityType(const char *pName)
Definition serverbrowser.h:180
Definition serverbrowser.h:220
bool HasType(const char *pTypeName) const
Definition serverbrowser.cpp:1799
char m_aIconUrl[128]
Definition serverbrowser.h:226
const char * Name() const
Definition serverbrowser.h:243
CServerInfo::ERankState HasRank(const char *pMap) const
Definition serverbrowser.cpp:1806
char m_aId[CServerInfo::MAX_COMMUNITY_ID_LENGTH]
Definition serverbrowser.h:223
const std::vector< CCommunityType > & Types() const
Definition serverbrowser.h:247
std::optional< SHA256_DIGEST > m_IconSha256
Definition serverbrowser.h:225
const std::vector< CCommunityCountry > & Countries() const
Definition serverbrowser.h:246
std::unordered_set< CCommunityMap, CCommunityMap::SHash > m_FinishedMaps
Definition serverbrowser.h:231
int m_NumPlayers
Definition serverbrowser.h:229
bool HasCountry(const char *pCountryName) const
Definition serverbrowser.cpp:1792
CCommunity(const char *pId, const char *pName, std::optional< SHA256_DIGEST > IconSha256, const char *pIconUrl)
Definition serverbrowser.h:234
std::vector< CCommunityType > m_vTypes
Definition serverbrowser.h:228
const char * Id() const
Definition serverbrowser.h:242
bool HasRanks() const
Definition serverbrowser.h:250
friend class CServerBrowser
Definition serverbrowser.h:221
std::vector< CCommunityCountry > m_vCountries
Definition serverbrowser.h:227
const char * IconUrl() const
Definition serverbrowser.h:244
bool m_HasFinishes
Definition serverbrowser.h:230
const std::optional< SHA256_DIGEST > & IconSha256() const
Definition serverbrowser.h:245
char m_aName[64]
Definition serverbrowser.h:224
int NumPlayers() const
Definition serverbrowser.h:252
Definition serverbrowser.h:69
int m_aCustomSkinColor7[protocol7::NUM_SKINPARTS]
Definition serverbrowser.h:89
int m_CustomSkinColorFeet
Definition serverbrowser.h:85
bool m_aUseCustomSkinColor7[protocol7::NUM_SKINPARTS]
Definition serverbrowser.h:88
int m_Country
Definition serverbrowser.h:76
char m_aaSkin7[protocol7::NUM_SKINPARTS][protocol7::MAX_SKIN_LENGTH]
Definition serverbrowser.h:87
int m_CustomSkinColorBody
Definition serverbrowser.h:84
char m_aSkin[MAX_SKIN_LENGTH]
Definition serverbrowser.h:82
bool m_Player
Definition serverbrowser.h:78
int m_Score
Definition serverbrowser.h:77
char m_aName[MAX_NAME_LENGTH]
Definition serverbrowser.h:71
bool m_CustomSkinColors
Definition serverbrowser.h:83
int m_FriendState
Definition serverbrowser.h:80
char m_aClan[MAX_CLAN_LENGTH]
Definition serverbrowser.h:72
bool m_Afk
Definition serverbrowser.h:79
Definition serverbrowser.h:27
bool m_RequiresLogin
Definition serverbrowser.h:129
int m_Location
Definition serverbrowser.h:115
int m_QuickSearchHit
Definition serverbrowser.h:100
@ MAX_COMMUNITY_ID_LENGTH
Definition serverbrowser.h:63
@ MAX_COMMUNITY_TYPE_LENGTH
Definition serverbrowser.h:65
@ MAX_COMMUNITY_COUNTRY_LENGTH
Definition serverbrowser.h:64
int m_MapSize
Definition serverbrowser.h:124
char m_aMap[MAX_MAP_LENGTH]
Definition serverbrowser.h:122
uint64_t m_ReceivedPackets
Definition serverbrowser.h:95
bool m_LatencyIsEstimated
Definition serverbrowser.h:116
std::vector< CClient > m_vClients
Definition serverbrowser.h:127
@ LOC_AUSTRALIA
Definition serverbrowser.h:34
@ LOC_EUROPE
Definition serverbrowser.h:35
@ LOC_NORTH_AMERICA
Definition serverbrowser.h:36
@ LOC_SOUTH_AMERICA
Definition serverbrowser.h:37
@ LOC_UNKNOWN
Definition serverbrowser.h:31
@ LOC_AFRICA
Definition serverbrowser.h:32
@ LOC_ASIA
Definition serverbrowser.h:33
@ LOC_CHINA
Definition serverbrowser.h:42
@ NUM_LOCS
Definition serverbrowser.h:43
int m_MaxClients
Definition serverbrowser.h:104
char m_aAddress[MAX_SERVER_ADDRESSES *NETADDR_MAXSTRSIZE]
Definition serverbrowser.h:126
int m_NumAddresses
Definition serverbrowser.h:97
EClientScoreKind m_ClientScoreKind
Definition serverbrowser.h:109
char m_aCommunityId[MAX_COMMUNITY_ID_LENGTH]
Definition serverbrowser.h:112
int m_NumPlayers
Definition serverbrowser.h:107
static ColorRGBA GametypeColor(const char *pGametype)
Definition serverbrowser.cpp:2451
NETADDR m_aAddresses[MAX_SERVER_ADDRESSES]
Definition serverbrowser.h:98
ERankState m_HasRank
Definition serverbrowser.h:118
static int EstimateLatency(int Loc1, int Loc2)
Definition serverbrowser.cpp:2438
int m_Flags
Definition serverbrowser.h:108
int m_ServerIndex
Definition serverbrowser.h:92
char m_aGameType[16]
Definition serverbrowser.h:119
char m_aCommunityCountry[MAX_COMMUNITY_COUNTRY_LENGTH]
Definition serverbrowser.h:113
char m_aName[64]
Definition serverbrowser.h:121
char m_aVersion[32]
Definition serverbrowser.h:125
int m_NumFilteredPlayers
Definition serverbrowser.h:128
int m_MapCrc
Definition serverbrowser.h:123
int m_FriendState
Definition serverbrowser.h:101
static bool ParseLocation(int *pResult, const char *pString)
Definition serverbrowser.cpp:2486
int m_Latency
Definition serverbrowser.h:117
int m_MaxPlayers
Definition serverbrowser.h:106
EClientScoreKind
Definition serverbrowser.h:47
@ CLIENT_SCORE_KIND_UNSPECIFIED
Definition serverbrowser.h:48
@ CLIENT_SCORE_KIND_TIME
Definition serverbrowser.h:50
@ CLIENT_SCORE_KIND_POINTS
Definition serverbrowser.h:49
@ CLIENT_SCORE_KIND_TIME_BACKCOMPAT
Definition serverbrowser.h:51
char m_aCommunityType[MAX_COMMUNITY_TYPE_LENGTH]
Definition serverbrowser.h:114
int m_NumClients
Definition serverbrowser.h:105
ERankState
Definition serverbrowser.h:55
@ RANK_UNAVAILABLE
Definition serverbrowser.h:56
@ RANK_UNRANKED
Definition serverbrowser.h:58
@ RANK_RANKED
Definition serverbrowser.h:57
TRISTATE m_Favorite
Definition serverbrowser.h:110
int m_Type
Definition serverbrowser.h:94
ColorRGBA m_GametypeColor
Definition serverbrowser.h:120
TRISTATE m_FavoriteAllowPing
Definition serverbrowser.h:111
int m_FriendNum
Definition serverbrowser.h:102
Definition ui.h:150
Definition color.h:183
Definition serverbrowser.h:267
virtual const std::vector< const CCommunity * > & SelectedCommunities() const =0
virtual const std::vector< const CCommunityCountry * > & SelectableCountries() const =0
virtual void Update(bool Force)=0
virtual ~ICommunityCache()=default
virtual const char * CountryTypeFilterKey() const =0
virtual bool CountriesTypesFilterAvailable() const =0
virtual bool AnyRanksAvailable() const =0
virtual const std::vector< const CCommunityType * > & SelectableTypes() const =0
Definition serverbrowser.h:256
virtual bool Empty() const =0
virtual void Remove(const char *pElement)=0
virtual ~IFilterList()=default
virtual void Clear()=0
virtual void Add(const char *pElement)=0
virtual bool Filtered(const char *pElement) const =0
IInterface()
Definition kernel.h:19
Definition serverbrowser.h:330
CServerEntry * m_pPrevReq
Definition serverbrowser.h:337
int m_GotInfo
Definition serverbrowser.h:334
int64_t m_RequestTime
Definition serverbrowser.h:332
CServerEntry * m_pNextReq
Definition serverbrowser.h:338
CServerInfo m_Info
Definition serverbrowser.h:335
bool m_RequestIgnoreInfo
Definition serverbrowser.h:333
Definition serverbrowser.h:280
virtual bool IsGettingServerlist() const =0
@ QUICK_MAPNAME
Definition serverbrowser.h:307
@ QUICK_SERVERNAME
Definition serverbrowser.h:305
@ QUICK_PLAYER
Definition serverbrowser.h:306
virtual int Max(const CServerInfo &Item) const =0
virtual void CleanFilters()=0
virtual std::vector< const CCommunity * > SelectedCommunities() const =0
virtual bool IsRefreshing() const =0
virtual std::vector< const CCommunity * > FavoriteCommunities() const =0
virtual const CCommunity * Community(const char *pCommunityId) const =0
virtual void Refresh(int Type, bool Force=false)=0
virtual bool IsServerlistError() const =0
static constexpr const char * COMMUNITY_TYPE_NONE
Definition serverbrowser.h:345
virtual unsigned CurrentCommunitiesHash() const =0
virtual int NumSortedServers() const =0
virtual ICommunityCache & CommunityCache()=0
static constexpr const char * COMMUNITY_ALL
Definition serverbrowser.h:350
@ LAN_PORT_END
Definition serverbrowser.h:326
@ LAN_PORT_BEGIN
Definition serverbrowser.h:325
virtual IFilterList & CountriesFilter()=0
static constexpr const char * COMMUNITY_DDNET
Definition serverbrowser.h:341
virtual IFilterList & CommunitiesFilter()=0
virtual int Players(const CServerInfo &Item) const =0
virtual const IFilterList & CommunitiesFilter() const =0
virtual int NumSortedPlayers() const =0
virtual const CServerInfo * SortedGet(int Index) const =0
virtual IFilterList & TypesFilter()=0
virtual const IFilterList & FavoriteCommunitiesFilter() const =0
virtual const CServerInfo * Get(int Index) const =0
@ TYPE_INTERNET
Definition serverbrowser.h:312
@ TYPE_LAN
Definition serverbrowser.h:313
@ TYPE_FAVORITES
Definition serverbrowser.h:314
@ TYPE_FAVORITE_COMMUNITY_2
Definition serverbrowser.h:316
@ TYPE_FAVORITE_COMMUNITY_5
Definition serverbrowser.h:319
@ TYPE_FAVORITE_COMMUNITY_1
Definition serverbrowser.h:315
@ TYPE_FAVORITE_COMMUNITY_3
Definition serverbrowser.h:317
@ NUM_TYPES
Definition serverbrowser.h:320
@ TYPE_FAVORITE_COMMUNITY_4
Definition serverbrowser.h:318
static constexpr const char * COMMUNITY_COUNTRY_NONE
Definition serverbrowser.h:344
virtual std::optional< SHA256_DIGEST > DDNetInfoSha256() const =0
virtual const ICommunityCache & CommunityCache() const =0
virtual int GetCurrentType()=0
virtual std::vector< const CCommunity * > CurrentCommunities() const =0
virtual CServerEntry * Find(const NETADDR &Addr)=0
virtual bool DDNetInfoAvailable() const =0
virtual const char * GetTutorialServer()=0
virtual int NumServers() const =0
virtual int LoadingProgression() const =0
static constexpr const char * SEARCH_EXCLUDE_TOKEN
Definition serverbrowser.h:352
@ SORT_NUMFRIENDS
Definition serverbrowser.h:299
@ SORT_GAMETYPE
Definition serverbrowser.h:297
@ SORT_MAP
Definition serverbrowser.h:296
@ SORT_NAME
Definition serverbrowser.h:294
@ SORT_NUMPLAYERS
Definition serverbrowser.h:298
@ SORT_FAVORITES
Definition serverbrowser.h:300
@ SORT_PING
Definition serverbrowser.h:295
virtual const IFilterList & TypesFilter() const =0
virtual const std::vector< CCommunity > & Communities() const =0
virtual const IFilterList & CountriesFilter() const =0
static constexpr const char * COMMUNITY_NONE
Definition serverbrowser.h:342
virtual IFilterList & FavoriteCommunitiesFilter()=0
@ MAX_MAP_LENGTH
Definition map.h:16
@ MAX_SERVER_ADDRESSES
Definition protocol.h:87
@ MAX_CLAN_LENGTH
Definition protocol.h:109
@ MAX_SKIN_LENGTH
Definition protocol.h:110
@ MAX_NAME_LENGTH
Definition protocol.h:108
constexpr auto NETADDR_MAXSTRSIZE
Definition types.h:162
int str_comp(const char *a, const char *b)
Definition str.cpp:368
int str_copy(char *dst, const char *src, int dst_size)
Definition str.cpp:18
#define MACRO_INTERFACE(Name)
Definition kernel.h:25
@ MAX_SKIN_LENGTH
Definition protocol7.h:73
@ NUM_SKINPARTS
Definition protocol7.h:46
static constexpr const char * DDNET_INFO_URL
Definition serverbrowser.h:22
static constexpr const char * DDNET_INFO_FILE
Definition serverbrowser.h:21
unsigned str_quickhash(const char *str)
Definition str.cpp:896
Definition serverbrowser.h:211
size_t operator()(const CCommunityMap &Map) const
Definition serverbrowser.h:212
Definition types.h:168
TRISTATE
Definition types.h:15