Plusieurs fichiers avec discord.py

Le problème exposé dans ce sujet a été résolu.

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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
.
├── autostart.sh
├── commands
│   ├── admin.py
│   ├── fun.py
│   └── __pycache__
│       ├── admin.cpython-36.pyc
│       └── fun.cpython-36.pyc
├── discord.log
├── erabot.py
├── herobrine.py
├── main.py
└── requirements.txt

2 directories, 10 files

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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import asyncio
import discord
import logging
from commands.admin import *
from commands.fun import *


# Logs
logger = 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.event
async def on_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.

Salut Eragon,

Tout d’abord je vais me permettre un peu de pub :D : https://github.com/cacophony-discord/cacophony

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).

J’ai un sous-module "commands" dans mon bot : https://github.com/cacophony-discord/cacophony/tree/master/src/cacophony/commands

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."""
        for command, config in extra_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…

Ayant cherché je suis déjà tombé sur ton bot mais je n’ai rien compris de son fonctionnement.

Il me faudrait donc créer une fonction qui soit appelé lors du chargement du fichier, dans commands/admin.py et dans commands/fun.py?

Eragon

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.

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