Files
agon/cogs/loops/guild_data.py
T

45 lines
1.5 KiB
Python

"""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()