Слэш команды
Слэш команды — это один из типов взаимодействий, интегрированных с клиентом, которые может создать бот. В отличие от команд с префиксом, они не требуют намерения на контент сообщения.
В этом разделе подробно рассказано о создании, типах и обработке слэш командах с помощью disnake .
Бот должен быть добавлен с разрешением applications.commands , чтобы создавать слэш команды на сервере. Мы рекомендуем добавить это разрешение к приглашениям вашего бота.
Определение слэш команд
Для создания слэш команд используйте декоратор @bot.slash_command .
@bot.slash_command( name="ping", description="Возращает задержку бота", ) async def ping(inter: disnake.ApplicationCommandInteraction): ...

Dellyis used / ping
Disnake Bot Bot 05/16/2023
Если используется ког, используйте декоратор @commands.slash_command .
class Meta(commands.Cog): @commands.slash_command( name="ping", description="Возращает задержку бота", ) async def ping(self, inter: disnake.ApplicationCommandInteraction): ...
Параметры
В то время как некоторые команды могут существовать без аргументов, большинство команд должны принимать их, чтобы быть полезными. Чтобы определить параметр, это так же просто, как определить аргумент для обычной команды.
Вот пример команды с одним целочисленным параметром (без описания):
@bot.slash_command(description="Увеличивает число в 7 раз") async def multiply(inter, number: int): await inter.response.send_message(number * 7)
Чтобы сделать параметр опциональным, укажите стандартное значение аргументу.
@bot.slash_command(description="Увеличивает число в указанное количество раз") async def multiply(inter, number: int, multiplier: int = 7): await inter.response.send_message(number * multiplier)
Подкоманды
Регистрация команд
В отличие от команд с префиксом, слэш команды должны быть сначала зарегистрированы в Discord. В противном случае они не появятся, если вы нажмете «/». По умолчанию библиотека автоматически регистрирует и обновляет ваши слэш команды. Это происходит при запуске бота или при выгрузке или перезагрузке одного или нескольких когов.
Библиотека не делает ненужных запросов API во время этого процесса. Если зарегистрированные команды совпадают с командами в вашем коде, запросы API не выполняются. В противном случае выполняется только один запрос на массовую перезапись.
Если вы хотите отключить автоматическую регистрацию, установите параметр sync_commands в экземпляре commands.Bot на False . Если вы хотите увидеть, как именно изменяется список зарегистрированных команд, установите параметр sync_commands_debug на True .
bot = commands.Bot("!", sync_commands_debug=True)
Он выведет, какие команды были добавлены, отредактированы, удалены или нетронуты. Это также зависит от вашего уровня ведения логирования.
Глобальные команды
Глобальные слэш команды видны везде, включая личные сообщения с ботом. Если вы не укажете параметр test_guilds в commands.Bot , все ваши слэш команды по умолчанию являются глобальными.
Глобальные команды сразу видны и доступны для использования на большинстве устройств.
Серверные команды
Если вы укажете параметр test_guilds в commands.Bot , все слэш команды в вашем коде больше не будут являться глобальными. Следующий код зарегистрирует все слэш команды только на двух серверах:
bot = commands.Bot("!", test_guilds=[123456789, 987654321]) # ID серверов
Если вы хотите сохранить некоторые из ваших команд с косой чертой глобальными, а некоторые сделать локальными, укажите параметр guild_ids в декораторе @bot.slash_command() :
bot = commands.Bot("!") @bot.slash_command() async def global_command(inter): """Эта команда видна везде""" ... @bot.slash_command(guild_ids=[123456789]) async def local_command(inter): """Эта команда видна только на одном сервере""" ...
Ответ на команды
Отправка ответа
Атрибут response ссылается на экземпляр InteractionResponse , который имеет 4 способа ответа на ApplicationCommandInteraction . Ответ может быть выполнен только один раз. Если вы хотите отправлять повторные сообщения, рассмотрите возможность использования followup вместо вебхука.
Ответ может быть использован только один раз. После получения ответа больше никаких ответов быть не может. Смотрите объект followup для отправки сообщений после ответа.
- send_message — Отправляет ответное сообщение
- edit_message — Редактирует оригинальное сообщение, вы не можете использовать это в командах приложения, потому что во время ответа нет сообщений.
- defer — Откладывает взаимодействие
- send_modal — отправляет Modal (модальное окно).
Кроме того, существует один метод, который не дает ответа:
- is_done — Указывает, был ли выполнен ответ на взаимодействие.
Если вы собираетесь запускать длительные процессы (более 3 секунд) во время ответа, вы должны сначала отложить взаимодействие. Затем, когда ваш ответ будет готов, вы можете отредактировать сообщение, используя edit_original_message .
@bot.slash_command() async def ping(inter: ApplicationCommandInteraction): await inter.response.send_message("Понг!") @bot.slash_command() async def defer(inter: ApplicationCommandInteraction): await inter.response.defer() await asyncio.sleep(10) await inter.edit_original_message(content="Ожидание закончилось, мои товарищи!")
Последующие действия
Последующие действия — это способ отправить сообщение после ответа. Существует два важных ограничения в отношении того, когда можно использовать последующее наблюдение:
- на взаимодействие должен быть дан ответ в течение первых 3 секунд (см. Отправка ответа).
- срок действия взаимодействия не должен быть истек. Проверка того, истек ли срок действия взаимодействия, может быть выполнена с помощью ApplicationCommandInteraction.is_expired .
По своей сути, последующие действия — это просто экземпляр Webhook . В этом нет ничего особенного, за исключением того, что параметр wait обрабатывается так, как если бы он всегда имел значение True .
Одним из возможных способов последующего использования может быть отправка инструкций, которые будут видны, если модальное сообщение не отправлено.
@bot.slash_command() async def confirm(inter: ApplicationCommandInteraction): await inter.response.send_modal( title="Подтверждение", custom_id="confirm-or-deny", components=[disnake.ui.TextInput(label="подтвердить?", custom_id="confirm")], ) await inter.followup.send(content="Пожалуйста, не закрывайте модальное окно!", ephemeral=True)
Discord.py. Как сделать такое:

Хочу сделать с помощью discord py бота для своего сервера.
Начал использовать dislash что-бы сделать слеш команды.
Сами слэш команды делать научился, но как сделать что то подобное?
Лучший ответ

Читать документацию.
https://dislashpy.readthedocs.io/en/latest/slash_commands_guide.html#introduction
И я бы советовал использовать discord py или disnake, нет особого смысла во всяких dislash, discord_components сейчас
Святослав КругловУченик (152) 1 год назад
спасибо большое
Святослав КругловУченик (152) 1 год назад
и я использую discord.py , а dislash это библиотека к нему
Vitness Просветленный (35116) Святослав Круглов, а, там сделали только кнопки, менюшки и т.п., а слеши не добавили. Тогда ясно
VitnessПросветленный (35116) 1 год назад
Я думал что слеши тоже добавили в dpy
Остальные ответы
Создание команд
Эта страница является продолжением, и используемый базовый код взят с предудущей страницы (Начальные файлы). Код можно найти в репозитории на GitHub здесь.
Discord также позволяет разработчикам регистрировать слэш команды, которые предоставляют пользователям первоклассный способ непосредственного взаимодействия с вашим приложением. Эти слэш команды описаны в руководстве здесь, в разделе Взаимодействия.
Примечание
Команды бота, которые инициируются при использовании ключевого слова вместе с указанным префиксом (например, ! или $ ), известны как команды с префиксом (также часто называются текстовыми командами).
Намерение на контент сообщений (Message Intent) — Привилегированное
Следует отметить, что для обработки команд с префиксом требуется намерение на контент сообщений, что позволяет боту получать содержимое и данные сообщений, отправленных пользователями. Это намерение недавно стало привилегированным, т.е. его необходимо включить вручную для приложения бота, и его требование в конечном итоге будет пересмотрено, если ваш бот находится на более чем 100 серверах.
Вы можете прочитать больше о намерении на контент сообщений (Message Intent) здесь.
Поэтому, чтобы свести к минимуму права, которые должен использовать ваш бот, мы рассмотрим команды с префиксом в разделе Популярные темы и перейдём к основам слэш командам в этой статье; более сложные темы того же самого будут рассмотрены в разделе Взаимодействия.
Регистрация команд
В этой статье описан самый минимум, необходимый для начала регистрации слэш команд. Ещё раз, вы можете обратиться к этой странице для подробного объяснения тем, включая команды только для серверов, глобальные команды, опции, типы опций, автозаполнение и выбор.
Теперь мы продолжим работу с базовым кодом, использованным в предыдущей статье.
import disnake from disnake.ext import commands bot = commands.Bot() @bot.event async def on_ready(): print("Бот готов!") bot.run("YOUR_BOT_TOKEN")
Первый шаг — использовать декоратор @bot.slash_command вместе с асинхронной функцией ( async ), чтобы определить код для вашей слэш команды. Ниже приведён код, демонстрирующий то же самое (сосредоточтесь на использовании inter , что является сокращением от слова interaction (взаимодействие)).
import disnake from disnake.ext import commands bot = commands.Bot() @bot.event async def on_ready(): print("Бот готов!") @bot.slash_command() async def ping(inter): ... bot.run("YOUR_BOT_TOKEN")
inter , передаваемый в функцию, аналогичен контексту или ctx , используемому в командах с префиксом — он передаёт всю информацию, относящуюся к взаимодействию — например, данные о пользователе, который вызвал команду. Это также необходимо для ответа на использование команды.
Использование ctx против inter
Если у вас есть опыт работы с написанием ботов с помощью discord.py , вы должны быть знакомы с использованием ctx в качесте аббревиатуры для передачи контекста в функцию. В этом руководстве в первую очередь будет использоваться inter , поскольку это сокращено от interaction (взаимодействие) и имеет тип ApplicationCommandInteraction . Конечно, вы можете использовать предпочитаемую вами аббревиатуру в коде.
Регистрация команд на определённых серверах
Обратите внимание, что серверы называются «гильдиями» (guild) в Discord API и библиотеке disnake. При выполнении приведённого выше кода слэш команда будет зарегистрирована глобально и будет доступна на всех серверах, на которых находится ваш бот.
Вы также можете использовать аргумент guild_ids , чтобы команда была зарегистрирована только на серверах, указанных в списке, например, на вашем сервере разработки.
import disnake from disnake.ext import commands bot = commands.Bot() @bot.event async def on_ready(): print("Бот готов!") @bot.slash_command(guild_ids=[1234, 5678]) # ID ваших серверов указаны здесь. async def ping(inter): ... bot.run("YOUR_BOT_TOKEN")
Использование test_guilds в commands.Bot()
Когда у вас есть несколько команд, зарегистрированных в одних и тех же тестовых серверах, удобно определить ваши guild_ids только один раз. Поэтому вы можете использовать аргумент test_guilds в экземпляре commands.Bot() вместо передачи guild_ids в каждой команде —
bot = commands.Bot(test_guilds=[1234, 5678])
Теперь, когда у вас всё готово для регистрации слэш команды, вы можете приступить к ответу на вызванную команду.
Ответ на команду
Вы можете ответить на вызванную слэш команду пользователем, используя inter.response.send_message() . Это аналогично использованию ctx.send() , поскольку вы можете отвечать на взаимодействие с помощь встраиваний (эмбедов), файлов, кнопок/меню выбора или просто обычного текста.
import disnake from disnake.ext import commands bot = commands.Bot() @bot.event async def on_ready(): print("Бот готов!") @bot.slash_command(guild_ids=[1234, 5678]) async def ping(inter): await inter.response.send_message("Понг!") bot.run("YOUR_BOT_TOKEN")

Dellyis used / ping
Как создать слеш команды на discord.py?

Многие используют from discord_slash import SlashCommand, но visual studio code говорит мне обратное Как можно реализовать слеш команду на примере
@bot.command() async def ping(ctx): await ctx.message.delete() latency = bot.latency rounded_ping = round(latency * 1000) message = await ctx.send(f"My ping is: ms") await asyncio.sleep(30) await message.delete()
- Вопрос задан 06 авг. 2023
- 348 просмотров
Комментировать
Решения вопроса 1

fenrir @fenrir1121 Куратор тега discord.py
Начни с документации
Многие используют from discord_slash import SlashCommand
Смелое заявление о библиотеке, которая не обновлялась с 2021 года. У нее уже даже архивный репозиторий удалили и ссылка ведет на interactions.py.
Как создать слеш команды на discord.py?
Открыть examples библиотеки, например basic.py, вставить свой токен и запустить. Все примеры снабжены исчерпывающими комментариями.
Ответ написан 06 авг. 2023
Комментировать
Нравится 5 Комментировать