""" Functions for controlling the bot's presence. Also contains the loop. """ import nextcord from nextcord.ext import commands, tasks from sqlalchemy import func, select from sqlalchemy.orm import Session from database_setup.sql_data_classes import Presences, engine class BotPresence(commands.Cog, name="Bot Presence"): """Class for bot presence functions.""" def __init__(self, bot: commands.Bot): self.bot = bot @commands.Cog.listener() async def on_guild_join( self, guild: nextcord.Guild ): # pylint: disable=unused-argument """Listener for Guild Join. Updated presence on guild join.""" await self.change_presence() @commands.Cog.listener() async def on_ready(self): """Starts the loop when bot is ready.""" await self.bot.wait_until_ready() # pylint doesn't recognize that periodic_change_presense is subclassed from tasks.loop. self.periodic_change_presence.start() # pylint: disable=no-member @tasks.loop(minutes=5) async def periodic_change_presence(self): """Loops every 5 minutes and changes presence.""" await self.change_presence() async def change_presence(self): """Randomly chooses a presence and updates bot's presence.""" with Session(engine) as session: presence = session.scalar( select(Presences.Presence).order_by(func.random()) ) await self.bot.change_presence( activity=nextcord.CustomActivity(name="Custom Status", state=presence) )