Refactor main function into ChaosBot class for improved structure and initialization of components

This commit is contained in:
Edgar P. Burkhart 2025-03-23 10:26:46 +01:00
parent d4257c8315
commit 4ab0faab7e
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227

View file

@ -1,5 +1,6 @@
import logging import logging
import tomllib import tomllib
from typing import Any
import discord import discord
@ -11,31 +12,55 @@ from botbotbot.tts import CambAI
from botbotbot.voice import VoiceBot from botbotbot.voice import VoiceBot
from botbotbot.wordlist import Wordlist from botbotbot.wordlist import Wordlist
def main() -> None:
description = """Discord Chaos Bot"""
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
with open("config.toml", "rb") as config_file:
config = tomllib.load(config_file)
guild_ids = config.get("guild_ids") class ChaosBot:
if not (isinstance(guild_ids, list) and all(isinstance(i, int) for i in guild_ids)): def __init__(self, config: dict[str, Any]) -> None:
logger.error("Guild IDs must be a list of integers.") self.config = config
guild_ids = []
intents = discord.Intents.all()
intents.presences = False
self.bot = discord.Bot(description="Discord Chaos Bot", intents=intents)
self.init_aibot()
self.init_cambai()
self.init_guild_ids()
self.shuffler = Shuffler()
self.word_list = Wordlist(self.bot, self.guild_ids)
self.text_bot = TextBot(
self.bot,
self.word_list,
aibot=self.ai_bot,
shuffler=self.shuffler,
guild_ids=self.guild_ids,
)
self.voice_bot = VoiceBot(
self.bot,
self.cambai,
aibot=self.ai_bot,
shuffler=self.shuffler,
guild_ids=self.guild_ids,
)
self.nick_bot = NickBot(
self.bot, shuffler=self.shuffler, guild_ids=self.guild_ids
)
self.init_events()
def init_aibot(self) -> None:
self.ai_bot: AIBot | None = None
if isinstance(key := self.config.get("mistral_api_key"), str):
system_prompt = """Tu es une intelligence artificelle qui répond en français. system_prompt = """Tu es une intelligence artificelle qui répond en français.
Tu dois faire un commentaire pertinent en lien avec ce qui te sera dit. Tu dois faire un commentaire pertinent en lien avec ce qui te sera dit.
Ta réponse doit être très courte. Ta réponse doit être très courte.
Ta réponse doit être une seule phrase. Ta réponse doit être une seule phrase.
TA RÉPONSE DOIT ÊTRE EN FRANÇAIS !!!""" TA RÉPONSE DOIT ÊTRE EN FRANÇAIS !!!"""
aibot: AIBot | None = None self.ai_bot = AIBot(
if isinstance(key := config.get("mistral_api_key"), str):
aibot = AIBot(
key, key,
model="mistral-large-latest", model="mistral-large-latest",
system_message=system_prompt, system_message=system_prompt,
@ -43,34 +68,42 @@ def main() -> None:
else: else:
logger.warning("No AI Bot.") logger.warning("No AI Bot.")
cambai: CambAI | None = None def init_cambai(self) -> None:
if isinstance(key := config.get("cambai_api_key"), str): self.cambai: CambAI | None = None
cambai = CambAI(key) if isinstance(key := self.config.get("cambai_api_key"), str):
self.cambai = CambAI(key)
else: else:
logger.warning("No CambAI.") logger.warning("No CambAI.")
intents = discord.Intents.default() def init_guild_ids(self) -> None:
intents.members = True guild_ids = self.config.get("guild_ids")
intents.message_content = True if not (
intents.reactions = True isinstance(guild_ids, list) and all(isinstance(i, int) for i in guild_ids)
intents.voice_states = True ):
logger.error("Guild IDs must be a list of integers.")
guild_ids = []
self.guild_ids = guild_ids
bot = discord.Bot(description=description, intents=intents) def init_events(self) -> None:
shf = Shuffler() self.bot.add_listener(self.on_ready, "on_ready")
wl = Wordlist(bot, guild_ids)
wl.init_events()
text_bot = TextBot(bot, wl, aibot=aibot, shuffler=shf, guild_ids=guild_ids) self.word_list.init_events()
text_bot.init_events() self.text_bot.init_events()
self.voice_bot.init_events()
self.nick_bot.init_events()
voice_bot = VoiceBot(bot, cambai, aibot=aibot, shuffler=shf, guild_ids=guild_ids) async def on_ready(self) -> None:
voice_bot.init_events() logger.info(f"We have logged in as {self.bot.user}")
nick_bot = NickBot(bot, shuffler=shf, guild_ids=guild_ids) def run(self) -> None:
nick_bot.init_events() self.bot.run(self.config.get("token"))
@bot.listen("on_ready")
async def on_ready() -> None:
logger.info(f"We have logged in as {bot.user}")
bot.run(config.get("token")) def main() -> None:
logging.basicConfig(level=logging.INFO)
with open("config.toml", "rb") as config_file:
config = tomllib.load(config_file)
chaos_bot = ChaosBot(config)
chaos_bot.run()