|
1 | 1 | import aiohttp |
2 | 2 | import asyncio |
3 | 3 |
|
4 | | -from core import EventListener, Server, Player, Side, event |
| 4 | +from core import EventListener, Server, Player, Side, event, Status |
| 5 | +from datetime import datetime, timezone |
| 6 | +from discord.ext import tasks |
5 | 7 | from psycopg.rows import dict_row |
6 | 8 |
|
7 | 9 |
|
8 | 10 | class CloudListener(EventListener): |
9 | 11 |
|
| 12 | + def __init__(self, plugin): |
| 13 | + super().__init__(plugin) |
| 14 | + if self.plugin.get_config().get('register', True): |
| 15 | + self.update_registration.start() |
| 16 | + |
| 17 | + async def shutdown(self) -> None: |
| 18 | + if self.plugin.get_config().get('register', True): |
| 19 | + self.update_registration.cancel() |
| 20 | + await super().shutdown() |
| 21 | + |
| 22 | + @event(name="registerDCSServer") |
| 23 | + async def registerDCSServer(self, server: Server, data: dict) -> None: |
| 24 | + if self.plugin.get_config().get('register', True) and data['channel'].startswith('sync'): |
| 25 | + await self.cloud_register(server) |
| 26 | + |
10 | 27 | async def update_cloud_data(self, server: Server, player: Player): |
11 | 28 | if not server.current_mission: |
12 | 29 | return |
@@ -52,3 +69,47 @@ async def onPlayerChangeSlot(self, server: Server, data: dict) -> None: |
52 | 69 | return |
53 | 70 | # noinspection PyAsyncCall |
54 | 71 | asyncio.create_task(self.update_cloud_data(server, player)) |
| 72 | + |
| 73 | + async def cloud_register(self, server: Server): |
| 74 | + try: |
| 75 | + # noinspection PyUnresolvedReferences |
| 76 | + await self.plugin.post('register_server', { |
| 77 | + "guild_id": self.node.guild_id, |
| 78 | + "server_name": server.name, |
| 79 | + "ipaddr": server.instance.dcs_host, |
| 80 | + "port": server.instance.dcs_port, |
| 81 | + "password": (server.settings['password'] != ""), |
| 82 | + "theatre": server.current_mission.map, |
| 83 | + "dcs_version": server.node.dcs_version, |
| 84 | + "num_players": len(server.get_active_players()) + 1, |
| 85 | + "max_players": int(server.settings.get('maxPlayers', 16)), |
| 86 | + "time_in_mission": int(server.current_mission.mission_time if server.current_mission else 0), |
| 87 | + "time_to_restart": (server.restart_time - datetime.now(tz=timezone.utc)).total_seconds() if server.restart_time else -1, |
| 88 | + }) |
| 89 | + self.log.info(f"Server {server.name} registered with the cloud.") |
| 90 | + except aiohttp.ClientError as ex: |
| 91 | + self.log.error(f"Could not register server {server.name} with the cloud.", exc_info=ex) |
| 92 | + |
| 93 | + @event(name="onSimulationStart") |
| 94 | + async def onSimulationStart(self, server: Server, _: dict) -> None: |
| 95 | + if self.plugin.get_config().get('register', True): |
| 96 | + await self.cloud_register(server) |
| 97 | + |
| 98 | + @event(name="onSimulationStop") |
| 99 | + async def onSimulationStop(self, server: Server, _: dict) -> None: |
| 100 | + if self.plugin.get_config().get('register', True): |
| 101 | + try: |
| 102 | + # noinspection PyUnresolvedReferences |
| 103 | + await self.plugin.post('unregister_server', { |
| 104 | + "guild_id": self.node.guild_id, |
| 105 | + "server_name": server.name, |
| 106 | + }) |
| 107 | + self.log.info(f"Server {server.name} unregistered from the cloud.") |
| 108 | + except aiohttp.ClientError as ex: |
| 109 | + self.log.error(f"Could not unregister server {server.name} from the cloud.", exc_info=ex) |
| 110 | + |
| 111 | + @tasks.loop(minutes=5) |
| 112 | + async def update_registration(self): |
| 113 | + for server in self.bot.servers.values(): |
| 114 | + if server.status in [Status.RUNNING, Status.PAUSED]: |
| 115 | + await self.cloud_register(server) |
0 commit comments