Tengo un bot bastante grande para la discordia escrito. Cuenta con más de 1000 líneas de código. Cuando investigué cómo hacerlo en youtube y aquí, nada parece estar funcionando. Me preguntaba si alguien podría explicar cómo usar una mazorca adecuadamente, posiblemente con ejemplos de fotos. Puedo mostrar qué código tengo para ayudarte a entender lo que quiero.
Un ejemplo sería que quiero tener todos mis comandos mod en un archivo separado, solo para que esté más limpio y más organizado. Entonces, ¿cómo hago para hacer esto? Aquí hay un ejemplo de mi código:
Mod Comandos Quiero mover a un archivo separado usando un cog
Importaciones actualmente que tengo
Prefijo y directorio
ID de token de llamada: el identificador de token está arriba, no se muestra en la foto
No estoy seguro de cómo iniciar un engranaje completamente, qué más importar, cómo llamar al archivo. Conozco bien a Java, pero estoy tratando de trabajar en mis habilidades de Python con la discordia. ¡Gracias de antemano!
Cada engranaje tiene dos partes: una clase y una función de setup
. Casi todas las funciones de setup
tienen el mismo aspecto:
def setup(bot): bot.add_cog(Cog(bot))
donde Cog
es la clase cog.
La clase cog contiene todos nuestros comandos y eventos como métodos.
Hay cuatro transformaciones principales que debes hacer para cambiar tu bot a un engranaje:
Reemplace bot.command
con commands.command
(los commands
son from discord.ext import commands
)
Cambie las firmas de sus funciones para incluirse al principio, ya que todos sus comandos y eventos ahora son métodos de la clase cog
Cambia todas las referencias a bot
para referirse a self.bot
en self.bot
lugar
Eliminar todos los decoradores de bot.event
. Los oyentes de eventos de tu equipo están registrados solo por nombre
También hay algunas trampas:
Elimine await bot.process_commands(message)
de cualquier evento on_message
en su cog. Para cualquier mensaje esto solo debe esperarse una vez. El on_message
predeterminado on_message
ya lo hace por ti.
Registrar un evento a través de un engranaje no elimina otras devoluciones de llamada relacionadas con ese evento, desde su archivo principal u otros engranajes. Eso significa que su bot podría responder a un evento on_member_join
varias veces, por ejemplo, si tiene un comportamiento para ese evento definido en varios lugares.
Digamos que tiene el siguiente bot de bot.py
, bot.py
en el directorio src
:
from discord.ext import commands bot = commands.Bot(command_prefix='!') @bot.command(pass_context=True) @commands.has_role("Mod") async def acommand(ctx, argument): await bot.say("Stuff") @bot.event async def on_message(message): print(message.content) await bot.process_commands(message) bot.run("token")
Luego, factoriza esa funcionalidad en un cog src/cogs/maincog.py
from discord.ext import commands class MainCog: def __init__(self, bot): self.bot = bot @commands.command(pass_context=True) @commands.has_role("Mod") async def acommand(self, ctx, argument): await self.bot.say("Stuff") async def on_message(self, message): print(message.content) def setup(bot): bot.add_cog(MainCog(bot))
Y tu archivo bot.py
se vería como
from discord.ext import commands bot = commands.Bot(command_prefix='!') bot.load_extension("cogs.maincog") bot.run("token")
Tenga en cuenta que para cargar la extensión en cogs/maincog.py
, usamos load_extension("cogs.maincog")
.
Cogs también le permite definir algunos métodos especiales. La mayoría de estos están disponibles solo en discord.py-rewrite y están documentados aquí .
__global_check
, anteriormente __check
, se ejecuta antes de cada comando y debe devolver True
para que ese comando continúe.
__local_check
ejecuta solo antes de los comandos de este cog.
__global_check_once
Creo que esto es similar a __global_check
excepto que solo se verifica una vez en el caso de los subcomandos. No he usado esto mucho.
__unload
Puede actualizar en vivo su bot descargando la extensión, luego recárguela, lo que le permite actualizar sus engranajes sin desconectar su bot. Se llama a este método cuando descarga la extensión, o cuando su bot se detiene, en caso de que necesite realizar una limpieza.
__before_invoke
y __after_invoke
se ejecutan antes y después de cada comando desde este Cog, respectivamente.
__error
es un controlador de errores para los comandos de este cog.