1
0

main.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. """Point d'entrée : lance le bot avec `python main.py`."""
  2. import logging
  3. import sys
  4. from logging.handlers import RotatingFileHandler
  5. import discord
  6. from bot.config import ConfigError, load_settings
  7. from bot.discord_bot import ChatBot
  8. def setup_logging(log_file) -> None:
  9. formatter = logging.Formatter("[%(asctime)s] %(levelname)s %(name)s : %(message)s", "%Y-%m-%d %H:%M:%S")
  10. root = logging.getLogger()
  11. root.setLevel(logging.INFO)
  12. file_handler = RotatingFileHandler(log_file, maxBytes=5 * 1024 * 1024, backupCount=2, encoding="utf-8")
  13. file_handler.setFormatter(formatter)
  14. console_handler = logging.StreamHandler()
  15. console_handler.setFormatter(formatter)
  16. root.addHandler(file_handler)
  17. root.addHandler(console_handler)
  18. # discord.py et le SDK Anthropic sont bavards : on ne garde que leurs avertissements.
  19. # Le SDK 2.x passe par httpx2 ; httpx reste pour les versions plus anciennes.
  20. for noisy in ("discord", "httpx", "httpx2", "anthropic"):
  21. logging.getLogger(noisy).setLevel(logging.WARNING)
  22. def main() -> None:
  23. try:
  24. settings = load_settings()
  25. except ConfigError as exc:
  26. print(f"Erreur de configuration : {exc}", file=sys.stderr)
  27. sys.exit(1)
  28. setup_logging(settings.log_file)
  29. # Rika n'utilise pas le vocal : inutile de signaler l'absence de PyNaCl et de davey.
  30. discord.VoiceClient.warn_nacl = False
  31. discord.VoiceClient.warn_dave = False
  32. bot = ChatBot(settings)
  33. try:
  34. bot.run(settings.discord_token, log_handler=None)
  35. except discord.LoginFailure:
  36. logging.critical("Token Discord invalide : vérifie DISCORD_TOKEN dans le .env.")
  37. sys.exit(1)
  38. except discord.PrivilegedIntentsRequired:
  39. logging.critical(
  40. "L'intent « Message Content » n'est pas activé. Active-le dans le portail développeur "
  41. "Discord (onglet Bot > Privileged Gateway Intents)."
  42. )
  43. sys.exit(1)
  44. # Clé API ou modèle refusés (ChatBot.setup_hook), salon dédié inutilisable (ChatBot.announce) :
  45. # déjà expliqué dans le journal.
  46. if bot.config_error:
  47. sys.exit(1)
  48. if __name__ == "__main__":
  49. main()