]> git.xonotic.org Git - xonotic/xonotic.git/blob - misc/infrastructure/python/slist/main.py
slist: extend parsing
[xonotic/xonotic.git] / misc / infrastructure / python / slist / main.py
1 #!/usr/bin/env python3
2 import logging
3
4 from . import game
5 from . import master
6 from .utils import *
7
8 logger = logging.getLogger(__name__)
9
10
11 def main():
12     import socket
13
14     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
15
16     connections: Dict[Connection, Union[
17         Generator[Optional[master.SVMessage], Tuple[Connection, bytes], None],
18         Generator[Tuple[Optional[game.SVMessage], game.SequenceInfo], Tuple[Connection, bytes], None],
19     ]] = {}
20     count_inforesponse = 0
21
22     q_master = master.CLGetServersExt(game="Xonotic", protocol=3)
23     conn = (socket.gethostbyname("dpmaster.deathmask.net"), 27950)
24     connections[conn] = master.sv_parse()
25     sock.sendto(q_master.encode(), conn)
26     while True:
27         logger.debug("recv(...)")
28         try:
29             data, conn = sock.recvfrom(1400)
30         except KeyboardInterrupt:
31             break
32         logger.debug(f"recv({conn}): {data}")
33         msg = connections[conn].send((conn, data))
34         if isinstance(msg, tuple):
35             msg = msg[0]
36         if msg:
37             logger.info(f"recv({conn}): {msg}")
38             if isinstance(msg, master.SVGetServersExtResponse):
39                 logger.info(f"servers: {len(msg.servers)}")
40                 for srv in msg.servers:
41                     conn = (str(srv.addr), srv.port)
42                     q_server = game.CLGetInfo()
43                     connections[conn] = game.sv_parse()
44                     try:
45                         sock.sendto(q_server.encode(), conn)
46                     except socket.gaierror:
47                         pass
48             if isinstance(msg, game.SVGetInfoResponse):
49                 count_inforesponse += 1
50                 logger.info(f"status-{count_inforesponse}: {msg}")
51
52
53 if __name__ == "__main__":
54     main()