""" Contains a loop that updates guild data in the database periodically. """ from nextcord.ext import commands, tasks from sqlalchemy import select from sqlalchemy.orm import Session # pylint: disable=import-error from utilities.sql_data_classes import Guild, engine class GuildData(commands.Cog, name="Guild Data"): """Class to contain loop.""" def __init__(self, bot: commands.bot) -> None: self.bot = bot @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_update_guild_data is subclassed from tasks.loop. await self.periodic_update_guild_data.start() # pylint: disable=no-member @tasks.loop(hours=24) async def periodic_update_guild_data(self): """Loops every day, calls update_guild_data.""" self.update_guild_data() def update_guild_data(self): """ Updates all known guild's data in the database. """ with Session(engine) as session: for guild in self.bot.guilds: # update given guild name for guild id stmt = select(Guild).where(Guild.GuildId == guild.id) guild_data = session.scalar(stmt) # just in case checking if the guild doesn't exist. if guild_data is None: new_guild = Guild(GuildId=guild.id, GuildName=guild.name) session.add(new_guild) else: guild_data.GuildName = guild.name session.commit()