diff --git a/bot/libs/presence.py b/bot/libs/presence.py index e69de29..25a7c7a 100644 --- a/bot/libs/presence.py +++ b/bot/libs/presence.py @@ -0,0 +1,79 @@ +import asyncio +import time + +import discord +from discord.ext import tasks + + +class Presence(object): + """ + + A class for simply managing the bot's presence. + """ + + def __init__(self, bot): + from libs import Client + bot: Client + + self.bot = bot + self.mc_server = self.bot.mc_server + self.retry_in_seconds = self.bot.config.retry_in_seconds + + self.__server_online_presence.start() + + @tasks.loop() + async def __server_online_presence(self): + _time = time.time() + + try: + self.bot.logger.debug('Getting server information') + status = await self.mc_server.async_status() + + self.bot.is_server_starting = False + + await self.bot.change_presence( + activity=discord.Game( + name=f'with {status.players.online} player{"s" if status.players.online != 1 else ""}', + ), + status=discord.Status.online + ) + + await asyncio.sleep(40) + await self.bot.change_presence( + activity=discord.Activity( + type=discord.ActivityType.watching, + name=self.bot.config.server_address, + ) + ) + + await asyncio.sleep(20) + + except asyncio.TimeoutError: + if self.bot.is_server_starting and self.bot.last_start + self.bot.config.server_start_timout < time.time(): + self.bot.is_server_starting = False + + # ToDo: better presence + await self.bot.change_presence( + activity=discord.Activity( + type=discord.ActivityType.watching, + name=f'{self.bot.config.server_address} starting' if self.bot.is_server_starting else + f'offline: [self.server.address]', + ), + status=discord.Status.idle + ) + + # abs -> simple fix if for any reason the sleep_time is negative + sleep_time = abs(_time - time.time() + self.retry_in_seconds) + self.bot.logger.debug(f'Server offline, retrying in {round(sleep_time, 4)} seconds') + await asyncio.sleep(sleep_time) + + @__server_online_presence.before_loop + async def __before_status(self) -> None: + """< coroutine > + + Waits until the bot has fully started in case the server + is already online + """ + + await self.bot.wait_until_ready() + self.bot.logger.info('presence loaded')