62 lines
2.4 KiB
Python
62 lines
2.4 KiB
Python
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.")
|