¿Cómo uso cogs con discord.py?

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!

Introducción

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.

Cambios principales

Hay cuatro transformaciones principales que debes hacer para cambiar tu bot a un engranaje:

  1. Reemplace bot.command con commands.command (los commands son from discord.ext import commands )

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

  3. Cambia todas las referencias a bot para referirse a self.bot en self.bot lugar

  4. 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:

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

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

Ejemplo

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

Otras características

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

  1. __global_check , anteriormente __check , se ejecuta antes de cada comando y debe devolver True para que ese comando continúe.

  2. __local_check ejecuta solo antes de los comandos de este cog.

  3. __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.

  4. __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.

  5. __before_invoke y __after_invoke se ejecutan antes y después de cada comando desde este Cog, respectivamente.

  6. __error es un controlador de errores para los comandos de este cog.