diff --git a/botbotbot/__init__.py b/botbotbot/__init__.py
index f3e7cc2..7402345 100644
--- a/botbotbot/__init__.py
+++ b/botbotbot/__init__.py
@@ -1,5 +1,6 @@
 import logging
 import tomllib
+from typing import Any
 
 import discord
 
@@ -11,66 +12,98 @@ from botbotbot.tts import CambAI
 from botbotbot.voice import VoiceBot
 from botbotbot.wordlist import Wordlist
 
+logger = logging.getLogger(__name__)
+
+
+class ChaosBot:
+    def __init__(self, config: dict[str, Any]) -> None:
+        self.config = config
+
+        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.
+            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 une seule phrase.
+            TA RÉPONSE DOIT ÊTRE EN FRANÇAIS !!!"""
+
+            self.ai_bot = AIBot(
+                key,
+                model="mistral-large-latest",
+                system_message=system_prompt,
+            )
+        else:
+            logger.warning("No AI Bot.")
+
+    def init_cambai(self) -> None:
+        self.cambai: CambAI | None = None
+        if isinstance(key := self.config.get("cambai_api_key"), str):
+            self.cambai = CambAI(key)
+        else:
+            logger.warning("No CambAI.")
+
+    def init_guild_ids(self) -> None:
+        guild_ids = self.config.get("guild_ids")
+        if not (
+            isinstance(guild_ids, list) and all(isinstance(i, int) for i in guild_ids)
+        ):
+            logger.error("Guild IDs must be a list of integers.")
+            guild_ids = []
+        self.guild_ids = guild_ids
+
+    def init_events(self) -> None:
+        self.bot.add_listener(self.on_ready, "on_ready")
+
+        self.word_list.init_events()
+        self.text_bot.init_events()
+        self.voice_bot.init_events()
+        self.nick_bot.init_events()
+
+    async def on_ready(self) -> None:
+        logger.info(f"We have logged in as {self.bot.user}")
+
+    def run(self) -> None:
+        self.bot.run(self.config.get("token"))
+
 
 def main() -> None:
-    description = """Discord Chaos Bot"""
-
-    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")
-    if not (isinstance(guild_ids, list) and all(isinstance(i, int) for i in guild_ids)):
-        logger.error("Guild IDs must be a list of integers.")
-        guild_ids = []
-
-    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.
-    Ta réponse doit être très courte.
-    Ta réponse doit être une seule phrase.
-    TA RÉPONSE DOIT ÊTRE EN FRANÇAIS !!!"""
-
-    aibot: AIBot | None = None
-
-    if isinstance(key := config.get("mistral_api_key"), str):
-        aibot = AIBot(
-            key,
-            model="mistral-large-latest",
-            system_message=system_prompt,
-        )
-    else:
-        logger.warning("No AI Bot.")
-
-    cambai: CambAI | None = None
-    if isinstance(key := config.get("cambai_api_key"), str):
-        cambai = CambAI(key)
-    else:
-        logger.warning("No CambAI.")
-
-    intents = discord.Intents.default()
-    intents.members = True
-    intents.message_content = True
-    intents.reactions = True
-    intents.voice_states = True
-
-    bot = discord.Bot(description=description, intents=intents)
-    shf = Shuffler()
-    wl = Wordlist(bot, guild_ids)
-    wl.init_events()
-
-    text_bot = TextBot(bot, wl, aibot=aibot, shuffler=shf, guild_ids=guild_ids)
-    text_bot.init_events()
-
-    voice_bot = VoiceBot(bot, cambai, aibot=aibot, shuffler=shf, guild_ids=guild_ids)
-    voice_bot.init_events()
-
-    nick_bot = NickBot(bot, shuffler=shf, guild_ids=guild_ids)
-    nick_bot.init_events()
-
-    @bot.listen("on_ready")
-    async def on_ready() -> None:
-        logger.info(f"We have logged in as {bot.user}")
-
-    bot.run(config.get("token"))
+    chaos_bot = ChaosBot(config)
+    chaos_bot.run()