Создание когов/дополнений
Коги аналогичны модулям, которые дополняют основное ядро бота, тем самым расширяя его функции и возможности. Они также позволяют вам разбивать бота и упорядочивать коллекцию команд/событий вашего бота (что полезно, когда список команд вашего бота становится довольно большим).
Коги обычно используют вместе с Дополнениями. Вы можете прочитать больше о них в документации.
Создание файлов
Код, приведённый ниже был описан в Начальные файлы, и, поэтому, мы предполагаем,
что уже существует файл main.py в вашем каталоге, который инициирует экземпляр commands.Bot().
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 в качестве своего единственного аргумента и сохраняет его. Именно здесь мы будет добавлять наши команды.
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(), но также работает в когах.
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.
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.
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! Теперь вы можете создать несколько когов для группировки и организации
ваших команд/событий, а также загружать/выгружать их через ваш основной файл. Более подробную информацию о специальных
методах когов можно найти в документации.
Изменения синтаксиса
Коги представляют собой довольно радикальное изменение в способе написания команд и ботов, поэтому вот список, к которому вы можете вернуться для основного синтаксиса, используемого в когах:
- Каждый ког - это класс Python, который наследуется от
commands.Cog. - Декораторы для команд в когах:
- Команда -
commands.command() - Слэш команда -
commands.slash_command() - Профильные команды -
commands.user_command() - Команды сообщений -
commands.message_command()
- Команда -
- Для каждого слушателя событий используется декоратор
commands.Cog.listener(). - Коги регистрируются в боте с помощью вызова
Bot.add_cogи удаляются с помощьюBot.remove_cog.
Коги представляют собой довольно радикальное изменение в том, как вы пишете команды и ботов. Таким образом, рекомендуется ознакомиться с этим синтаксисом, поскольку код, который мы используем в этой статье, в значительной степени адаптирован для когов.