"""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 from sqlmodel import col from database.db import engine from database.models import Guild 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) -> None: """Starts the loop when bot is ready.""" await self.bot.wait_until_ready() await self.periodic_update_guild_data.start() @tasks.loop(hours=24) async def periodic_update_guild_data(self) -> None: """Loops every day, calls update_guild_data.""" self.update_guild_data() def update_guild_data(self) -> None: """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(col(Guild.id) == 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(id=guild.id, name=guild.name) session.add(new_guild) else: guild_data.name = guild.name session.commit()