Skip to main content

Создание когов/дополнений

Коги аналогичны модулям, которые дополняют основное ядро бота, тем самым расширяя его функции и возможности. Они также позволяют вам разбивать бота и упорядочивать коллекцию команд/событий вашего бота (что полезно, когда список команд вашего бота становится довольно большим).

Примечание

Коги обычно используют вместе с Дополнениями. Вы можете прочитать больше о них в документации.

Создание файлов

Код, приведённый ниже был описан в Начальные файлы, и, поэтому, мы предполагаем, что уже существует файл main.py в вашем каталоге, который инициирует экземпляр commands.Bot().

main.py
import disnake
from disnake.ext import commands

bot = commands.Bot()


@bot.event
async def on_ready():
print("Бот готов!")


bot.run("YOUR_BOT_TOKEN")

Далее мы создадим новый Python файл либо в том же каталоге, что и main.py или во вложенной папке (что рекомендуется). Для удобства организации мы создадим файл кога во вложенной папке cogs и назовём его ping.py - только для команды ping. Если вы строго следуете руководству, ваш каталог должен выглядеть примерно так:

.
├── cogs/
│ └── ping.py
├── main.py
└── secrets.env

Начальный код

Наследование класса

Первый шаг - создать класс в ping.py, который наследуется от commands.Cog, а так же конструктор, который принимает объект bot в качестве своего единственного аргумента и сохраняет его. Именно здесь мы будет добавлять наши команды.

ping.py
from disnake.ext import commands


class PingCommand(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
Совет

Мы добавили анотацию типа bot: commands.Bot здесь, чтобы дать IDE представление о том, какой тип данных содержит аргумент. Это не обязательно, но может быть полезно при разработке.

Регистрация команд

Теперь, чтобы определить слэш команду внутри класса, мы будет использовать декоратор commands.slash_comamnd(). Он функционирует так же, как и bot.slash_command(), но также работает в когах.

ping.py
import disnake
from disnake.ext import commands


class PingCommand(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot

@commands.slash_command()
async def ping(self, inter: disnake.ApplicationCommandInteraction):
"""Получить текущую задержку бота."""
await inter.response.send_message(f"Понг! {round(self.bot.latency * 1000)}мс")

Обратите внимание, что мы используем self в качестве первого аргумета, поскольку функция команды находится внутри класса.

Добавление функции setup

Последнее, что нужно добавить в этот файл, - это функция setup, чтобы disnake мог загружать ког, когда он будет добавлен в main.py.

ping.py
import disnake
from disnake.ext import commands


class PingCommand(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot

@commands.slash_command()
async def ping(self, inter: disnake.ApplicationCommandInteraction):
"""Получить текущую задержку бота."""
await inter.response.send_message(f"Понг! {round(self.bot.latency * 1000)}мс")


def setup(bot: commands.Bot):
bot.add_cog(PingCommand(bot))

Этот файл кога теперь можно добавить в бота с помощью метода bot.load_extension() в main.py.

main.py
import disnake
from disnake.ext import commands

bot = commands.Bot()


@bot.event
async def on_ready():
print("Бот готов!")


bot.load_extension("cogs.ping") # Примечание: расширение .py указывать не нужно

bot.run("YOUR_BOT_TOKEN")

Обратите внимание, что мы указали здесь "cogs.ping", поскольку файл ping.py находится внутри папки cogs. Поэтому основным синтаксисом для загрузки дополнений является bot.load_extension("<название_папки>.<название_файла>").

Совет

Для загрузки всех когов из папки cogs используйте метод bot.load_extensions()

bot.load_extensions('cogs')

И это завершает использование когов в disnake! Теперь вы можете создать несколько когов для группировки и организации ваших команд/событий, а также загружать/выгружать их через ваш основной файл. Более подробную информацию о специальных методах когов можно найти в документации.

Изменения синтаксиса

Коги представляют собой довольно радикальное изменение в способе написания команд и ботов, поэтому вот список, к которому вы можете вернуться для основного синтаксиса, используемого в когах:

Источник: Документация по Disnake

Коги представляют собой довольно радикальное изменение в том, как вы пишете команды и ботов. Таким образом, рекомендуется ознакомиться с этим синтаксисом, поскольку код, который мы используем в этой статье, в значительной степени адаптирован для когов.