""" Handles the activity displayed on the bot's Discord profile. The current intent is to display the server's player count as the activity. """ import re import logging from discord import Game, Status from discord.ext import commands, tasks from rcon.source import rcon log = logging.getLogger(__name__) class ActivityCog(commands.Cog): """ Handles the bot's profile activity. """ def __init__(self, bot: commands.Bot): self.bot = bot @commands.Cog.listener() async def on_ready(self): if not self.update_activity.is_running(): self.update_activity.start() @tasks.loop(seconds=30) async def update_activity(self): """ Update the bot's profile activity on an interval of 30 seconds. """ log.debug("updating activity") players_message = await rcon("players", **self.bot.rcon_details) re_match = re.search(r"Players connected \((\d+)\):\s*", players_message) if not re_match: log.error("Failed to parse player count from rcon response: %s", players_message) return players_count = int(re_match.group(1)) activity = Game(name=f"with {players_count} survivor{'s' if players_count != 1 else ''}!") await self.bot.change_presence(activity=activity, status=Status.online) log.debug("player count in activity updated to: %s", players_count) async def setup(bot: commands.Bot): cog = ActivityCog(bot) await bot.add_cog(cog) log.info("Added %s cog", cog.__class__.__name__)