import os from libs.Db import Db import discord from discord.ext import commands as discord_commands from . import config as cfg from data.models.DiscordCog import DiscordCog class EmperorFredDiscordBot(discord_commands.Bot): """Custom Discord bot for EmperorFred. - Stores a restart_controller for cogs like !restart - Auto-loads cog modules from discord_bot.cogs at startup """ def __init__(self, *, restart_controller=None, command_prefix: str = "!", intents: discord.Intents | None = None, guild_id: str=None, **options): if intents is None: intents = discord.Intents.default() super().__init__(command_prefix=command_prefix, intents=intents, **options) # Expose restart controller to commands (e.g., !restart) self.restart_controller = restart_controller self.guild_id = guild_id self.db = Db(cfg.DB_CONN_STR, False) # async def setup_hook(self) -> None: # called before on_ready # _load_commands(self) async def on_ready(self) -> None: print(f"✅ Discord Connected: {self.user}") async def on_member_join(self, member): channel = discord.utils.get(self.guild.channels, name="general") role = discord.utils.get(await self.guild.fetch_roles(), name="Chinstrap Penguins") if role is not None: if role not in member.roles: await member.add_roles(role) await channel.send(f"{role.mention} Another Penguin has joined the Collective. Say hi to {member.mention}!") async def close(self): await super().close() async def load_cogs(self): cogs: List[str] = [] package_name = "discord_bot.cogs" for filename in os.listdir("./discord_bot/cogs"): if filename.endswith(".py") and not filename.startswith("_"): cogs.append(f"{package_name}.{filename[:-3]}") for cog in cogs: cog_record = self.db.session.query(DiscordCog).filter_by(name=cog).first() if not cog_record: print(f"NEW COG FOUND: Adding {cog} to DB") self.db.session.add(DiscordCog(name=cog)) self.db.session.commit() cog_record = self.db.session.query(DiscordCog).filter_by(name=cog).first() if cog_record.active: await self.load_extension(cog) print(f"Loaded {cog}") else: print(f"{cog} inactive in DB, skipping.")