Создание когов/дополнений
Коги аналогичны модулям, которые дополняют основное ядро бота, тем самым расширяя его функции и возможности. Они также позволяют вам разбивать бота и упорядочивать коллекцию команд/событий вашего бота (что полезно, когда список команд вашего бота становится довольно большим).
Коги обычно используют вместе с Дополнениями. Вы можете прочитать больше о них в документации.
Создание файлов
Код, приведённый ниже был описан в Начальные файлы, и, поэтому, мы предполагаем,
что уже существует файл 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
.
Коги представляют собой довольно радикальное изменение в том, как вы пишете команды и ботов. Таким образом, рекомендуется ознакомиться с этим синтаксисом, поскольку код, который мы используем в этой статье, в значительной степени адаптирован для когов.