EmperorFred/discord_bot/bot.py

62 lines
2.4 KiB
Python
Raw Permalink Normal View History

2025-12-06 02:21:47 +00:00
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.")