Bonjour, je suis actuellement en train de créer un bot pour mon serveur discord.
Ce bot est codé en python3 avec discord.py, j’aimerais séparer mon code en plusieurs fichier de façon à le rendre plus propre mais je n’arrive pas à utiliser les commandes étant situé dans d’autres fichiers que le fichier principal.
J’utilise un venv, je suis sous ArchLinux donc pour les commandes de shell(bash, sh, fish …) n’ayez pas peur de m’en donner pour avoir plus d’informations sur mon code et les éventuelles erreurs que j’ai.
Le fichier requirements.txt est vide, les fichier erabot.py et herobrine.py sont deux fichier de démarrage différents, l’un n’utilise pas plusieurs fichiers et l’autre utilise commands/admin.py et commands/fun.py. main.py est vide et n’est pas encore utilisé.
erabot.py est le fichier qui doit en importer plusieurs pour fonctionner, voici son code.
#!/usr/bin/env python# -*- coding: utf-8 -*-importasyncioimportdiscordimportloggingfromcommands.adminimport*fromcommands.funimport*# Logslogger=logging.getLogger('discord')logger.setLevel(logging.DEBUG)handler=logging.FileHandler(filename='discord.log',encoding='utf-8',mode='w')handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))logger.addHandler(handler)client=discord.Client()@client.eventasyncdefon_ready():print('Connecté en tant que:')print(client.user.name)print(client.user.id)print('En cours d\'éxecution.')client.run('Token')
J’ai remplacé le token par Token
Soyez indulgent je ne sait que très peu de choses en python, et je débute avec discord.py.
Pour faire en sorte qu’une commande soit séparée dans un fichier, j’ai utilisé un pattern particulier (qu’il faut que je refactore un peu à l’occasion, mais là n’est pas la question).
Tu verras que pour chaque fichier, il y est défini une fonction load qui retourne un tuple avec le nom de la commande ainsi que la coroutine responsable de la gestion de la commande.
Et en fonction de la configuration de mon bot (qui est, il faut le dire, un vrai merdier), je charge le fichier en questions dans le sous-module commands et appelle load :
1
2
3
4
5
6
7
8
def_load_extra_commands(self,server_id,extra_commands):"""Load extra commands."""forcommand,configinextra_commands.items():self.info("Will load %s",command)module=importlib.import_module(".commands.{}".format(command),package="cacophony")command,function=module.load()self.callbacks[(command,server_id)]=function
C’est une piste parmi d’autres. Je réfléchis à mes heures perdues à une meilleure archi et à un code plus découplé. Parfois les projets persos manquent cruellement de design et il devient difficile de dev par-dessus ou d’impliquer d’autres devs…
Le grand problème que j’ai est que je n’ai pas une commande par fichier mais une catégorie de commande, et je ne vois pas comment créer une fonction load dans mes fichiers.
J’ai de la doc a écrire en effet… Tu m’en vois navré.
Je suis actuellement peu disponible mais si tu as suffisamment de patience je pourrai te parler plus en détail de la logique du bot. Je compte même le refacto car sa configuration est juste infâme.
Et pour quelqu’un qui ne sait que très peu de choses en python, je te concède que mon code abjecte puisse être déroutant.
Ce que je ne sait pas faire surtout et que je ne comprend pas c’est comment créer un fonction qui se lance lors de l’appel/import d’un fichier en python.
+0
-0
Connectez-vous pour pouvoir poster un message.
Connexion
Pas encore membre ?
Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte