ddapi 0.1.2__tar.gz → 0.4.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ddapi
3
- Version: 0.1.2
3
+ Version: 0.4.6
4
4
  Summary: ddapi
5
5
  Home-page: https://github.com/ByFox213/ddapi
6
6
  Author: ByFox
@@ -46,8 +46,13 @@ Requires-Dist: pytest; extra == "dev"
46
46
  ddapi is an api from the ddnet and qwik website
47
47
  ## Installation
48
48
 
49
+ I lost access to pypi so install via git below example
49
50
  ```bash
50
- pip install ddapi
51
+ pip install ddapi # old version
52
+ ```
53
+ or
54
+ ```bash
55
+ pip install git+https://github.com/ByFox213/ddapi
51
56
  ```
52
57
 
53
58
  ## Usage/Examples
@@ -73,24 +78,4 @@ async def main():
73
78
  asyncio.run(main())
74
79
  ```
75
80
 
76
- qwik
77
-
78
- ```python
79
- import asyncio
80
- from ddapi import Player, QwikAPI
81
-
82
-
83
- async def main():
84
- obj = QwikAPI()
85
- nickname = "ByFox"
86
- user = await obj.player(nickname)
87
- if user is None:
88
- return "Player not found"
89
- print(f"{user.player}: {user.points.points}")
90
- # Cor: 31473
91
- await obj.close() # Closing client Not necessary
92
- assert isinstance(user, Player)
93
-
94
-
95
- asyncio.run(main())
96
- ```
81
+ [other examples](https://github.com/ByFox213/ddapi/tree/main/example)
@@ -1,8 +1,13 @@
1
1
  ddapi is an api from the ddnet and qwik website
2
2
  ## Installation
3
3
 
4
+ I lost access to pypi so install via git below example
4
5
  ```bash
5
- pip install ddapi
6
+ pip install ddapi # old version
7
+ ```
8
+ or
9
+ ```bash
10
+ pip install git+https://github.com/ByFox213/ddapi
6
11
  ```
7
12
 
8
13
  ## Usage/Examples
@@ -28,24 +33,4 @@ async def main():
28
33
  asyncio.run(main())
29
34
  ```
30
35
 
31
- qwik
32
-
33
- ```python
34
- import asyncio
35
- from ddapi import Player, QwikAPI
36
-
37
-
38
- async def main():
39
- obj = QwikAPI()
40
- nickname = "ByFox"
41
- user = await obj.player(nickname)
42
- if user is None:
43
- return "Player not found"
44
- print(f"{user.player}: {user.points.points}")
45
- # Cor: 31473
46
- await obj.close() # Closing client Not necessary
47
- assert isinstance(user, Player)
48
-
49
-
50
- asyncio.run(main())
51
- ```
36
+ [other examples](https://github.com/ByFox213/ddapi/tree/main/example)
@@ -0,0 +1,6 @@
1
+ """the module is made for the convenience of users to download and use"""
2
+ from .main import DDnetApi, DDstats, StatusAPI, utc_times, DDStatsDB
3
+ from .dataclass import *
4
+
5
+ __version__ = "0.4.0"
6
+ __author__ = 'ByFox'
@@ -0,0 +1,573 @@
1
+ # pylint: disable-all
2
+ from collections import Counter
3
+ from datetime import datetime
4
+ from typing import Optional, Union, Any
5
+ from pydantic import BaseModel, Field
6
+
7
+
8
+ # DDStats
9
+
10
+
11
+ class QE(BaseModel):
12
+ sql: str
13
+ params: dict
14
+
15
+
16
+ class DDStatsSql(BaseModel):
17
+ ok: bool = Field(default=None)
18
+ database: str = Field(default=None)
19
+ table: str = Field(default=None)
20
+ is_view: bool = Field(default=None)
21
+ human_description_en: str = Field(default=None)
22
+ rows: list[list] = Field(default=None)
23
+ truncated: bool = Field(default=None)
24
+ filtered_table_rows_count: int = Field(default=None)
25
+ expanded_columns: list = Field(default=None)
26
+ expandable_columns: list = Field(default=None)
27
+ columns: list = Field(default=None)
28
+ primary_keys: list = Field(default=None)
29
+ units: dict = Field(default=None)
30
+ query: QE = Field(default=None)
31
+ facet_results: dict = Field(default=None)
32
+ suggested_facets: list = Field(default=None)
33
+ next: int | None = Field(default=None)
34
+ next_url: str | None = Field(default=None)
35
+ error: str = Field(default='')
36
+ private: bool = Field(default=None)
37
+ allow_execute_sql: bool = Field(default=None)
38
+ query_ms: float = Field(default=None)
39
+
40
+
41
+ # ddnet
42
+ class DPoints(BaseModel):
43
+ total: Optional[int] = Field(default=None)
44
+ points: Optional[int] = Field(default=None)
45
+ rank: Optional[int] = Field(default=None)
46
+
47
+
48
+ class MaxFinishes(BaseModel):
49
+ rank: Optional[int] = Field(default=None)
50
+ player: Optional[str] = Field(default=None)
51
+ num: Optional[int] = Field(default=None)
52
+ time: Optional[float] = Field(default=None)
53
+ min_timestamp: Optional[int] = Field(default=None)
54
+ max_timestamp: Optional[int] = Field(default=None)
55
+
56
+
57
+ class DDRanks(BaseModel):
58
+ rank: Optional[int] = Field(default=None)
59
+ player: Union[str, list[str]] = Field(default=None)
60
+ time: Optional[float] = Field(default=None)
61
+ timestamp: Optional[int] = Field(default=None)
62
+ country: Optional[str] = Field(default=None)
63
+
64
+
65
+ class DDTMRanks(BaseModel):
66
+ rank: Optional[int] = Field(default=None)
67
+ players: Union[str, list[str]] = Field(default=None)
68
+ time: Optional[float] = Field(default=None)
69
+ timestamp: Optional[int] = Field(default=None)
70
+ country: Optional[str] = Field(default=None)
71
+
72
+
73
+ class DMap(BaseModel):
74
+ name: Optional[str] = Field(default=None)
75
+ website: Optional[str] = Field(default=None)
76
+ thumbnail: Optional[str] = Field(default=None)
77
+ web_preview: Optional[str] = Field(default=None)
78
+ type: Optional[str] = Field(default=None)
79
+ points: Optional[int] = Field(default=None)
80
+ difficulty: Optional[int] = Field(default=None)
81
+ mapper: Optional[str] = Field(default=None)
82
+ release: Optional[int] = Field(default=None)
83
+ median_time: Optional[float] = Field(default=None)
84
+ first_finish: Optional[int] = Field(default=None)
85
+ last_finish: Optional[int] = Field(default=None)
86
+ finishes: Optional[int] = Field(default=None)
87
+ finishers: Optional[int] = Field(default=None)
88
+ biggest_team: Optional[int] = Field(default=None)
89
+ width: Optional[int] = Field(default=None)
90
+ height: Optional[int] = Field(default=None)
91
+ tiles: Optional[list] = Field(default=None)
92
+ team_ranks: Optional[list[DDTMRanks]] = Field(default=None)
93
+ ranks: Optional[list[DDRanks]] = Field(default=None)
94
+ max_finishes: Optional[list[MaxFinishes]] = Field(default=None)
95
+
96
+
97
+ class DRank(BaseModel):
98
+ points: Optional[int] = Field(default=None)
99
+ rank: Optional[int] = Field(default=None)
100
+
101
+
102
+ class FirstFinish(BaseModel):
103
+ timestamp: Optional[float] = Field(default=None)
104
+ map: Optional[str] = Field(default=None)
105
+ time: Optional[float] = Field(default=None)
106
+
107
+
108
+ class LastFinish(BaseModel):
109
+ timestamp: Optional[float] = Field(default=None)
110
+ map: Optional[str] = Field(default=None)
111
+ time: Optional[float] = Field(default=None)
112
+ country: Optional[str] = Field(default=None)
113
+ type: Optional[str] = Field(default=None)
114
+
115
+
116
+ class FavorPart(BaseModel):
117
+ name: Optional[str] = Field(default=None)
118
+ finishes: Optional[int] = Field(default=None)
119
+
120
+
121
+ class DData(BaseModel):
122
+ points: Optional[DPoints] = Field(default=None)
123
+ team_rank: Optional[DRank] = Field(default=None)
124
+ rank: Optional[DRank] = Field(default=None)
125
+ maps: Optional[dict] = Field(default=None)
126
+
127
+
128
+ class DDType(BaseModel):
129
+ Novice: Optional[DData] = Field(default=None)
130
+ Moderate: Optional[DData] = Field(default=None)
131
+ Brutal: Optional[DData] = Field(default=None)
132
+ Insane: Optional[DData] = Field(default=None)
133
+ Dummy: Optional[DData] = Field(default=None)
134
+ DDmaX_Easy: Optional[DData] = Field(default=None, validation_alias='DDmaX.Easy')
135
+ DDmaX_Next: Optional[DData] = Field(default=None, validation_alias='DDmaX.Next')
136
+ DDmaX_Nut: Optional[DData] = Field(default=None, validation_alias='DDmaX.Nut')
137
+ DDmaX_Pro: Optional[DData] = Field(default=None, validation_alias='DDmaX.Pro')
138
+ Oldschool: Optional[DData] = Field(default=None)
139
+ Race: Optional[DData] = Field(default=None)
140
+ Solo: Optional[DData] = Field(default=None)
141
+ total: Optional[DData] = Field(default=None)
142
+
143
+
144
+ class DActiov(BaseModel):
145
+ date: Optional[str] = Field(default=None)
146
+ hours_played: Optional[int] = Field(default=None)
147
+
148
+
149
+ class DDPlayer(BaseModel):
150
+ emoji: str = Field(default='')
151
+ player: Optional[str] = Field(default=None)
152
+ points: Optional[DPoints] = Field(default=None)
153
+ team_rank: Optional[DRank] = Field(default=None)
154
+ rank: Optional[DRank] = Field(default=None)
155
+ points_last_month: Optional[DRank] = Field(default=None)
156
+ points_last_week: Optional[DRank] = Field(default=None)
157
+ first_finish: Optional[FirstFinish] = Field(default=None)
158
+ last_finishes: Optional[list[LastFinish]] = Field(default=None)
159
+ favorite_partners: Optional[list[FavorPart]] = Field(default=None)
160
+ types: Optional[DDType] = Field(default=None)
161
+ activity: Optional[list[DActiov]] = Field(default=None)
162
+ hours_played_past_365_days: Optional[int] = Field(default=None)
163
+
164
+
165
+ # qwik
166
+
167
+ class PData(BaseModel):
168
+ rank: int | None = None
169
+ points: int | None = None
170
+
171
+
172
+ class PPoints(BaseModel):
173
+ Novice: Optional[PData] = None
174
+ Moderate: Optional[PData] = None
175
+ Brutal: Optional[PData] = None
176
+ Insane: Optional[PData] = None
177
+ Dummy: Optional[PData] = None
178
+ DDmaX_Easy: Optional[PData] = Field(default=None, validation_alias='DDmaX.Easy')
179
+ DDmaX_Next: Optional[PData] = Field(default=None, validation_alias='DDmaX.Next')
180
+ DDmaX_Nut: Optional[PData] = Field(default=None, validation_alias='DDmaX.Nut')
181
+ DDmaX_Pro: Optional[PData] = Field(default=None, validation_alias='DDmaX.Pro')
182
+ Oldschool: Optional[PData] = None
183
+ Race: Optional[PData] = None
184
+ Solo: Optional[PData] = None
185
+ total: Optional[PData] = None
186
+
187
+
188
+ class PointG(BaseModel):
189
+ date: Optional[str] | None = None
190
+ points: Optional[int] | None = None
191
+ rank_points: Optional[int] | None = None
192
+ team_points: Optional[int] | None = None
193
+
194
+
195
+ class Profile(BaseModel):
196
+ name: Optional[str] | None = None
197
+ points: Optional[int] | None = None
198
+ clan: Optional[str] | None = None
199
+ country: Optional[int] | None = None
200
+ skin_name: Optional[str] | None = None
201
+ skin_color_body: Optional[int] | None = None
202
+ skin_color_feet: Optional[int] | None = None
203
+
204
+
205
+ class Map(BaseModel):
206
+ map: Optional[str] | None = None
207
+ server: Optional[str] | None = None
208
+ points: Optional[int] | None = None
209
+ stars: Optional[int] | None = None
210
+ mapper: Optional[str] | None = None
211
+ timestamp: Optional[datetime] | None = None
212
+
213
+
214
+ class RecentFinishes(BaseModel):
215
+ map: Optional[Map] | None = None
216
+ time: Optional[float] | None = None
217
+ timestamp: Optional[datetime] | None = None
218
+ server: Optional[str] | None = None
219
+ cp1: Optional[float] | None = None
220
+ cp2: Optional[float] | None = None
221
+ cp3: Optional[float] | None = None
222
+ cp4: Optional[float] | None = None
223
+ cp5: Optional[float] | None = None
224
+ cp6: Optional[float] | None = None
225
+ cp7: Optional[float] | None = None
226
+ cp8: Optional[float] | None = None
227
+ cp9: Optional[float] | None = None
228
+ cp10: Optional[float] | None = None
229
+ cp11: Optional[float] | None = None
230
+ cp12: Optional[float] | None = None
231
+ cp13: Optional[float] | None = None
232
+ cp14: Optional[float] | None = None
233
+ cp15: Optional[float] | None = None
234
+ cp16: Optional[float] | None = None
235
+ cp17: Optional[float] | None = None
236
+ cp18: Optional[float] | None = None
237
+ cp19: Optional[float] | None = None
238
+ cp20: Optional[float] | None = None
239
+ cp21: Optional[float] | None = None
240
+ cp22: Optional[float] | None = None
241
+ cp23: Optional[float] | None = None
242
+ cp24: Optional[float] | None = None
243
+ cp25: Optional[float] | None = None
244
+
245
+
246
+ class FavouriteTeammates(BaseModel):
247
+ name: str | None = None
248
+ ranks_together: int | None = None
249
+
250
+
251
+ class Finishes(BaseModel):
252
+ map: Map | None = None
253
+ name: str | None = None
254
+ time: float | None = None
255
+ timestamp: Optional[datetime] = None
256
+ server: str | None = None
257
+ rank: int | None = None
258
+ team_rank: int | None = None
259
+ seconds_played: int | None = None
260
+
261
+
262
+ class Points(BaseModel):
263
+ weekly_points: PData | None = None
264
+ monthly_points: PData | None = None
265
+ yearly_points: PData | None = None
266
+ points: PPoints | None = None
267
+ rank_points: PPoints | None = None
268
+ team_points: PPoints | None = None
269
+
270
+
271
+ class RecentActivity(BaseModel):
272
+ name: str | None = Field(default=None)
273
+ date: str | None = Field(default=None)
274
+ map_name: str | None = Field(default=None)
275
+ map: Map | None = Field(default=None)
276
+ seconds_played: int | None = Field(default=None)
277
+
278
+
279
+ class RecentPlayerInfo(BaseModel):
280
+ name: str | None = None
281
+ clan: str | None = None
282
+ country: int | None = None
283
+ skin_name: str | None = None
284
+ skin_color_body: int | None = None
285
+ skin_color_feet: int | None = None
286
+ last_seen: str | None = None
287
+ seconds_played: int | None = None
288
+
289
+
290
+ class MostPlayedMaps(BaseModel):
291
+ map_name: str | None = None
292
+ seconds_played: int | None = None
293
+ map: Map | None = None
294
+
295
+
296
+ class MostPlayed(BaseModel):
297
+ key: str | None = None
298
+ seconds_played: int | None = None
299
+
300
+
301
+ class PlaytimePerMonth(BaseModel):
302
+ year_month: str | None = None
303
+ month: str | None = None
304
+ seconds_played: int | None = None
305
+
306
+
307
+ class FavouriteRank1sTeammates(BaseModel):
308
+ name: str
309
+ ranks_together: int
310
+
311
+
312
+ class AllTop10s(BaseModel):
313
+ map: Map | None = None
314
+ name: str | None = None
315
+ time: float | None = None
316
+ rank: int | None = None
317
+ team_rank: int | None = None
318
+ team_time: float | None = None
319
+
320
+
321
+ class RecentTop10s(BaseModel):
322
+ rank_type: str | None = None
323
+ map: str | None = None
324
+ time: float | None = None
325
+ rank: int | None = None
326
+ timestamp: datetime | None = None
327
+ server: str | None = None
328
+
329
+
330
+ class Player(BaseModel):
331
+ emoji: str = Field(default='')
332
+ points_graph: Optional[list[PointG]] = None
333
+ recent_finishes: Optional[list[RecentFinishes]] = None
334
+ favourite_teammates: Optional[list[FavouriteTeammates]] = None
335
+ profile: Optional[Profile] = None
336
+ is_mapper: bool = None
337
+ finishes: Optional[list[Finishes]] = None
338
+ points: Points = None
339
+ recent_activity: Optional[list[RecentActivity]] = None
340
+ recent_player_info: Optional[list[RecentPlayerInfo]] = None
341
+ most_played_maps: Optional[list[MostPlayedMaps]] = None
342
+ most_played_gametypes: Optional[list[MostPlayed]] = None
343
+ most_played_categories: Optional[list[MostPlayed]] = None
344
+ most_played_locations: Optional[list[MostPlayed]] = None
345
+ playtime_per_month: Optional[list[PlaytimePerMonth]] = None
346
+ favourite_rank1s_teammates: Optional[list[FavouriteRank1sTeammates]] = None
347
+ all_top_10s: Optional[list[AllTop10s]] = None
348
+ recent_top_10s: Optional[list[RecentTop10s]] = None
349
+
350
+
351
+ class Client(BaseModel):
352
+ name: str = Field(default='')
353
+ clan: str = Field(default='')
354
+ country: int = Field(default=-1)
355
+ score: int = Field(default=-9999)
356
+ is_player: bool = Field(default=None)
357
+ skin: dict = Field(default=None)
358
+ afk: bool = Field(default=None)
359
+ team: int = Field(default=0)
360
+
361
+
362
+ class Info(BaseModel):
363
+ max_clients: int = Field(default=0)
364
+ max_players: int = Field(default=0)
365
+ passworded: bool = Field(default=None)
366
+ game_type: str = Field(default=None)
367
+ name: str = Field(default=None)
368
+ map: dict = Field(default=None)
369
+ version: str = Field(default=None)
370
+ clients: list[Client] = Field(default=None)
371
+
372
+
373
+ class Server(BaseModel):
374
+ addresses: Union[list, str] = Field(default=None)
375
+ location: str = Field(default=None)
376
+ info: Info = Field(default=None)
377
+
378
+ def get_count_client(self) -> int:
379
+ return len(self.info.clients)
380
+
381
+
382
+ class Master(BaseModel):
383
+ servers: list[Server]
384
+
385
+ async def get_info(self):
386
+ for i in self.servers:
387
+ yield i.info
388
+
389
+ async def get_clients(self):
390
+ for i in self.servers:
391
+ yield i.info.clients
392
+
393
+ def get_count(self) -> int:
394
+ return len(self.servers)
395
+
396
+ def get_clans(self, limit: int = 50, rm=None):
397
+ if rm is None:
398
+ rm = ["DD-Persian"]
399
+ dat = Counter(client.clan for server in self.servers for client in server.info.clients)
400
+ del dat['']
401
+ for i in rm:
402
+ del dat[i]
403
+ return sorted(dat.items(), key=lambda x: x[1], reverse=True)[:limit]
404
+
405
+ def get_count_servers(self, limit: int = 10):
406
+ dat = []
407
+ for i in self.servers:
408
+ add = i.addresses
409
+ if isinstance(i.addresses, list):
410
+ add = i.addresses[0]
411
+ dat.append((i.get_count_client(), add, i.info.game_type, i.info.name))
412
+ return sorted(dat, key=lambda x: x[0], reverse=True)[:limit]
413
+
414
+
415
+ class QueryData(BaseModel):
416
+ points: int
417
+ name: str
418
+
419
+
420
+ class Query(BaseModel):
421
+ emoji: str = Field(default='')
422
+ data: list[QueryData]
423
+
424
+
425
+ # statusAPI
426
+
427
+
428
+ class STClient(BaseModel):
429
+ name: str | None = Field(default=None)
430
+ clan: str | None = Field(default=None)
431
+ country: int | None = Field(default=None)
432
+ score: int | None = Field(default=None)
433
+ is_player: bool | None = Field(default=None)
434
+ is_bot: bool | None = Field(default=None)
435
+ is_dummy: bool | None = Field(default=None)
436
+ first_seen: datetime | None = Field(default=None)
437
+ last_seen: datetime | None = Field(default=None)
438
+
439
+
440
+ class STServer(BaseModel):
441
+ server_id: int | None = Field(default=None)
442
+ ip: str | None = Field(default=None)
443
+ port: int | None = Field(default=None)
444
+ name: str | None = Field(default=None)
445
+ map: str | None = Field(default=None)
446
+ gametype: str | None = Field(default=None)
447
+ version: str | None = Field(default=None)
448
+ password: bool | None = Field(default=None)
449
+ server_level: int | None = Field(default=None)
450
+ hostname: str | None = Field(default=None)
451
+ master_server: str | None = Field(default=None)
452
+ num_clients: int | None = Field(default=None)
453
+ max_clients: int | None = Field(default=None)
454
+ num_players: int | None = Field(default=None)
455
+ max_players: int | None = Field(default=None)
456
+ num_bot_players: int | None = Field(default=None)
457
+ num_bot_spectators: int | None = Field(default=None)
458
+ num_dummies: int | None = Field(default=None)
459
+ is_legacy: bool | None = Field(default=None)
460
+ is_multi_support: bool | None = Field(default=None)
461
+ first_seen: datetime | None = Field(default=None)
462
+ last_seen: datetime | None = Field(default=None)
463
+ clients: list[STClient] | None = Field(default=None)
464
+
465
+
466
+ class STPlayer(BaseModel):
467
+ emoji: str = Field(default='')
468
+ name: str | None = Field(default=None)
469
+ clan: Any | None = Field(default=None)
470
+ country: int | None = Field(default=None)
471
+ score: int | None = Field(default=None)
472
+ is_player: bool | None = Field(default=None)
473
+ is_bot: bool | None = Field(default=None)
474
+ is_dummy: bool | None = Field(default=None)
475
+ first_seen: datetime | None = Field(default=None)
476
+ last_seen: datetime | None = Field(default=None)
477
+ server: STServer | None = Field(default=None)
478
+
479
+
480
+ class STServers(BaseModel):
481
+ servers: list[STServer] | None = Field(default=None)
482
+
483
+
484
+ class STClients(BaseModel):
485
+ players: list[STClient] | None = Field(default=None)
486
+
487
+
488
+ class STClan(BaseModel):
489
+ name: str | None = Field(default=None)
490
+ online_players: int | None = Field(default=None)
491
+ first_seen: datetime | None = Field(default=None)
492
+ last_seen: datetime | None = Field(default=None)
493
+
494
+
495
+ class STClans(BaseModel):
496
+ clans: list[STClan] | None = Field(default=None)
497
+
498
+
499
+ class STGameType(BaseModel):
500
+ name: str | None = Field(default=None)
501
+ online_servers: int | None = Field(default=None)
502
+ first_seen: datetime | None = Field(default=None)
503
+ last_seen: datetime | None = Field(default=None)
504
+
505
+
506
+ class STGameTypes(BaseModel):
507
+ gametypes: list[STGameType] | None = Field(default=None)
508
+
509
+
510
+ class STMaps(BaseModel):
511
+ maps: list[STGameType] | None = Field(default=None)
512
+
513
+
514
+ class STBan(BaseModel):
515
+ ip: str | None = Field(default=None)
516
+ active: bool | None = Field(default=None)
517
+ reason: str | None = Field(default=None)
518
+ first_seen: datetime | None = Field(default=None)
519
+ unban_date: datetime | None = Field(default=None)
520
+
521
+
522
+ class STBans(BaseModel):
523
+ bans: list[STBan] | None = Field(default=None)
524
+
525
+
526
+ class STVersion(BaseModel):
527
+ id: str | None = Field(default=None)
528
+ hostname: str | None = Field(default=None)
529
+ owner: str | None = Field(default=None)
530
+ country: str | None = Field(default=None)
531
+ num_players: int | None = Field(default=None)
532
+ num_servers: int | None = Field(default=None)
533
+
534
+
535
+ class STVersions(BaseModel):
536
+ versions: list[STVersion] | None = Field(default=None)
537
+
538
+
539
+ class STMasterStats(BaseModel):
540
+ version: str | None = Field(default=None)
541
+ online_servers: int | None = Field(default=None)
542
+ first_seen: datetime | None = Field(default=None)
543
+ last_seen: datetime | None = Field(default=None)
544
+
545
+
546
+ class STMastersStats(BaseModel):
547
+ masters: list[STMasterStats] | None = Field(default=None)
548
+
549
+
550
+ class DDStatusData(BaseModel):
551
+ name: str | None = Field(default=None)
552
+ type: str | None = Field(default=None)
553
+ host: str | None = Field(default=None)
554
+ location: str | None = Field(default=None)
555
+ online4: bool | None = Field(default=None)
556
+ online6: bool | None = Field(default=None)
557
+ uptime: str | None = Field(default=None)
558
+ load: float | None = Field(default=None)
559
+ network_rx: int | None = Field(default=None)
560
+ network_tx: int | None = Field(default=None)
561
+ packets_rx: int | None = Field(default=None)
562
+ packets_tx: int | None = Field(default=None)
563
+ cpu: int | None = Field(default=None)
564
+ memory_total: int | None = Field(default=None)
565
+ memory_used: int | None = Field(default=None)
566
+ swap_total: int | None = Field(default=None)
567
+ swap_used: int | None = Field(default=None)
568
+ hdd_total: int | None = Field(default=None)
569
+ hdd_used: int | None = Field(default=None)
570
+
571
+
572
+ class DDStatus(BaseModel):
573
+ servers: list[DDStatusData] | None = Field(default=[])