From 0197edb816c292912c72d13558e0966d50231ef7 Mon Sep 17 00:00:00 2001 From: TatLead Date: Wed, 13 Mar 2024 10:11:07 +0000 Subject: [PATCH] Update beammp.py --- discordgsm/protocols/beammp.py | 55 +++++++++++----------------------- 1 file changed, 17 insertions(+), 38 deletions(-) diff --git a/discordgsm/protocols/beammp.py b/discordgsm/protocols/beammp.py index 81391ae..2efeac0 100644 --- a/discordgsm/protocols/beammp.py +++ b/discordgsm/protocols/beammp.py @@ -1,4 +1,5 @@ import re +import time from typing import TYPE_CHECKING import aiohttp @@ -11,59 +12,37 @@ class BeamMP(Protocol): - pre_query_required = True name = "beammp" - master_servers = None - - async def pre_query(self): - # Known-bug: the api sometimes doesn't return full server list - # (GET) https://backend.beammp.com/servers-info - # (POST) https://backend.beammp.com/servers - url = "https://backend.beammp.com/servers-info" - - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - servers = await response.json() - - master_servers = { - f'{server["ip"]}:{server["port"]}': server for server in servers - } - - # Temp fix the api bug, full update the BeamMP.master_servers when response servers > 1000 - if BeamMP.master_servers is None or len(servers) > 1000: - BeamMP.master_servers = master_servers - else: - BeamMP.master_servers.update(master_servers) async def query(self): - if BeamMP.master_servers is None: - await self.pre_query() - host, port = str(self.kv["host"]), int(str(self.kv["port"])) ip = await Socket.gethostbyname(host) - key = f"{ip}:{port}" + url = f"https://master-server.opengsq.com/beammp/search?host={ip}&port={port}" + start = time.time() - if key not in BeamMP.master_servers: - raise Exception("Server not found") + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + response.raise_for_status() + data: dict = await response.json() + ping = int((time.time() - start) * 1000) - server = dict(BeamMP.master_servers[key]) result: GamedigResult = { - "name": re.sub(r"\^[0-9|a-f|l-p|r]", "", str(server["sname"])), - "map": re.sub(r"\/?levels\/(.+)\/info\.json", r"\1", str(server["map"])) + "name": re.sub(r"\^[0-9|a-f|l-p|r]", "", str(data["sname"])), + "map": re.sub(r"\/?levels\/(.+)\/info\.json", r"\1", str(data["map"])) .replace("_", " ") .title(), - "password": bool(server.get("private", False)), - "numplayers": int(server["players"]), + "password": bool(data.get("password", False)), + "numplayers": int(data["players"]), "numbots": 0, - "maxplayers": int(server["maxplayers"]), + "maxplayers": int(data["maxplayers"]), "players": [ {"name": name, "raw": {}} - for name in str(server["playerslist"]).split(";") + for name in str(data["playerslist"]).split(";") ], "bots": None, - "connect": key, - "ping": 0, - "raw": server, + "connect": f"{host}:{port}", + "ping": ping, + "raw": data, } return result