Неверная команда для взаимодействия с приложением Discord
Обновлено: 21.11.2024
Discord предоставляет разработчикам возможность создавать встроенные в клиент команды косой черты. В этом разделе мы расскажем, как зарегистрировать эти команды с помощью discord.js!
На этой странице предполагается, что вы используете ту же файловую структуру, что и наш раздел обработки команд. Предоставленные сценарии предназначены для работы с этой настройкой.
Если вы уже настроили слэш-команды для своего приложения и хотите научиться реагировать на них, обратитесь к следующему разделу.
В этом разделе мы будем использовать сценарий, который можно использовать в сочетании с обработчиком команд косой черты из раздела обработки команд.
Сначала установите @discordjs/rest
открыть в новом окне, выполнив в терминале следующую команду:
Запуск этого скрипта зарегистрирует все ваши команды в гильдии, идентификатор которой был передан выше.
Глобальные команды кэшируются на один час. Новые глобальные команды будут медленно распространяться по всем гильдиям и гарантированно будут обновлены только через час. Команды гильдии обновляются мгновенно. Поэтому мы рекомендуем вам использовать команды на основе гильдии во время разработки и публиковать их в глобальных командах, когда они будут готовы для общего использования.
Чтобы развернуть глобальные команды, вы можете использовать тот же сценарий из раздела команд гильдии и настроить маршрут в сценарии на .applicationCommands(clientId) .
Команды приложения могут иметь параметры. Думайте об этих параметрах как о аргументах функции. Вы можете указать их, как показано ниже:
Обратите внимание, как .setRequired(true) указывается в построителе параметров. Установка этого параметра не позволит пользователю отправить команду без указания значения для этой опции!
Как показано в приведенном выше примере параметров, вы можете указать тип ApplicationCommandOption . Ниже перечислены все возможные значения, которые вы можете передать как ApplicationCommandOptionType:
В построителе команд косой черты есть метод для каждого из этих типов соответственно. Обратитесь к документации Discord API для получения подробной информации о типах параметров SUB_COMMAND и SUB_COMMAND_GROUP
- SUB_COMMAND устанавливает параметр как подкоманду
- SUB_COMMAND_GROUP устанавливает параметр как группу подкоманд
- STRING задает параметр, требующий строкового значения.
- INTEGER задает параметр, требующий целочисленного значения.
- ЧИСЛО задает параметр, требующий десятичного значения (также известного как число с плавающей запятой).
- BOOLEAN задает параметр, требующий логического значения.
- USER устанавливает параметр, требующий пользователя или снежинки в качестве значения.
- КАНАЛ задает параметр, требующий канала или снежинки в качестве значения.
- ROLE устанавливает параметр, требующий роли или снежинки в качестве значения.
- MENTIONABLE задает параметр, требующий пользователя, роль или снежинку в качестве значения.
Оба типа параметров STRING и INTEGER могут иметь варианты . Варианты выбора — это набор предопределенных значений, которые пользователи могут выбирать при выборе варианта, который их содержит.
Если вы укажете варианты для параметра, это будут единственные допустимые значения, которые могут выбрать пользователи!
Укажите их с помощью метода addChoice() из построителя команд с косой чертой:
Хорошо, мы добрались до 12 части! Предупреждаю, это будет долго. Эта часть будет о том, как вы можете создавать обработчики ошибок для своих команд, как вы кратко видели в предыдущей части о времени восстановления.
Существует несколько способов обработки ошибок с помощью discord.py:
- Обработчики ошибок для каждой команды
- Обработчики ошибок для каждого процессора
- Глобальные обработчики ошибок
В этой части я расскажу только об обработчиках ошибок для каждой команды и глобальных ошибок, но в любом случае не стесняйтесь идти по маршруту для каждого процессора, прочитав документацию и поэкспериментировав самостоятельно. Опять же, в качестве общего напоминания, я советую вам не просто копировать код здесь, а попытаться понять его самостоятельно и создать свой собственный код. Вы не учитесь, копируя, вы учитесь, делая.
Обработка ошибок для каждой команды
Хорошо! Первый тип обработчика, который мы создадим, — простой для одной команды. Сначала давайте получим базовый код для шестеренки и базовой команды:
- CommandOnCooldown из-за декоратора времени восстановления
- MissingPermissions из-за декоратора has_guild_permissions
- MissingRequiredArgument из-за необходимости члена
- ConversionError из-за подсказки типа участника
- CommandInvokeError из-за содержания команды, вызывающей DivisionByZero
Чтобы получить исходную ошибку из CommandInvokeError , вы можете использовать ее исходный атрибут, который возвращает вызвавшее ее исключение.
Теперь перейдем к самому обработчику ошибок. Первое, что нам нужно сделать, чтобы добавить обработчик ошибок, это сообщить discord.py, что мы хотим добавить обработчик ошибок в команду, что мы можем сделать с помощью декоратора ошибок команды:
Это говорит о разногласиях.py, чтобы добавить функцию, которую декоратор украшает в качестве обработчика ошибок для команды, и она будет вызываться, если во время выполнения команды возникнет какая-либо ошибка, или даже перед вызовом, если проверка функций или преобразование завершатся неудачно.
Далее нам нужно добавить функцию, которая будет обрабатывать ошибку:
Отлично! Как видите, функция принимает 2 аргумента, не являющихся собственными: ctx и error, которые являются контекстом команды и возникшей ошибкой. Теперь давайте добавим немного логики в функцию, чтобы показать соответствующую информацию пользователю, чтобы он знал, что пошло не так, как обычно, я объясню, что все делает после, и я призываю вас не копировать этот код, а понять его и работайте над написанием собственного обработчика.
Это много кода, но вот что делает каждая его часть:
- Во-первых, isinstance — это метод Python, который проверяет, является ли объект экземпляром данного класса. В этом случае мы проверяем, является ли ошибка экземпляром различных ошибок discord.py, чтобы определить, какое сообщение об ошибке мы хотим отправить, поскольку иногда они имеют разные параметры.
- Первая ошибка — CommandOnCooldown. Здесь мы хотим отправить время в секундах, пока не закончится время восстановления, и пользователь сможет снова использовать команду, что мы можем получить с помощью атрибута ошибки retry_after.
- Далее для MissingPermissions мы просто хотим сообщить, что у пользователя отсутствуют необходимые разрешения. Также можно отправить именно то разрешение, которого им не хватает, но для простоты я оставлю это здесь, поскольку по умолчанию используются внутренние имена, такие как manage_guild , а не красивые имена Discord, такие как Manage Server
- Для MissingRequiredArgument мы хотим показать, какой аргумент отсутствует, используя атрибут param ошибки.
- Теперь, если ошибка не является ни одной из этих, мы хотим отправить общее сообщение о том, что команда не удалась, и мы отправляем это сообщение с параметром delete_after, чтобы сообщение само удалялось через 5 секунд.
- Наконец, мы хотим, чтобы сообщение, вызвавшее ошибку, также было удалено, чтобы сохранить чат в чистоте. Мы не хотим, чтобы это удалялось немедленно, поэтому мы установили удаление через 5 секунд, что означает, что команда и ответ об ошибке будут удалены примерно в одно и то же время.
По сути, это все, что касается обработчиков команд. Конечно, есть и другие типы ошибок, которые могут возникать в других обстоятельствах, и я настоятельно рекомендую прочитать документацию по исключениям discord.py, чтобы узнать о них больше.
Глобальная обработка ошибок
Хорошо, покомандная обработка завершена, переходим к глобальной обработке! Обратите внимание, что часть содержимого здесь предполагает, что вы прочитали раздел об обработке каждой команды, поэтому я бы рекомендовал прочитать этот бит, если вы этого не сделали, чтобы у вас был необходимый контекст, даже если вы не собираетесь использовать обработчик для каждой команды.
Первое, что мы собираемся сделать, как и в случае с обработкой каждой команды, — это создать шестеренку, только на этот раз мы не будем помещать в нее какие-либо команды, она будет зарезервирована только для ошибок. Это не обязательно, но помогает сегментировать код и упрощает поиск и разделение всего, что удобно и чисто.
Довольно просто, по сути, это стандартный шаблон для шестеренки, как обычно. Далее мы добавим прослушиватель для получения ошибок команды:
Параметры точно такие же, как и у ошибки команды, но на этот раз вместо декоратора из команды мы используем прослушиватель on_command_error . Как и в случае с обработчиком ошибок для каждой команды, теперь мы хотим реализовать логику, чтобы определить, какое сообщение отправить пользователю:
Это не полный обработчик ошибок. Исключений не хватает, и я не собираюсь их включать. Это делается для того, чтобы отговорить людей от простого копирования обработчика ошибок для себя. Я не могу не подчеркнуть, насколько важно для обучения, чтобы люди пробовали что-то сами, а не копировали код. Для всех ошибок, которые вам, возможно, придется обрабатывать здесь, я советую прочитать документы discord.py по исключениям. Кроме того, некоторые из ошибок здесь имеют несколько производных исключений, таких как UserInputError , во что бы то ни стало нужно сделать более конкретные обработчики ошибок, которые имеют специальные сообщения для каждого исключения!
Как видите, это не сильно отличается от обработчика для каждой команды, но есть несколько заметных отличий:
- Мы используем прослушиватель для события, а не назначаем обработчик конкретной команде.
- Существует вероятность того, что теперь мы получаем ошибки CommandNotFound, поэтому мы исправим их (игнорируя их, потому что они становятся спамом!)
- В целом мы обрабатываем ошибки более общим способом, мы не знаем точно, какие исключения могут быть вызваны, поэтому нам нужно это учитывать.
Опять же, ошибок намного больше, чем это, и некоторые причудливые встраивания ошибок тоже могут выглядеть неплохо, но я оставлю это в качестве упражнения для читателя, так как эта часть завершена! (пс.для встраивания, возможно, попробуйте сделать что-то вроде того, что вы видите ниже!)
В Discord появилась новая функция под названием Slash Commands. Они позволяют вам ввести /, а затем имя команды, чтобы выполнить какое-либо действие. Например, вы можете набрать /giphycats (встроенная команда), чтобы получить несколько гифок с кошками. Это довольно круто. :)
Команды Discord Slash работают, отправляя запрос на URL всякий раз, когда кто-то вводит команду. Вам не нужно, чтобы ваше приложение работало все время, чтобы Slash-команды работали, что делает Deno Deploy идеальным решением для создания таких команд.
В этом посте давайте посмотрим, как мы можем создать приветственную команду Slash Command с помощью Deno Deploy.
Создайте приложение на портале разработчиков Discord
Вот и все. Создается новое приложение, которое будет содержать нашу команду Slash. Не закрывайте вкладку, так как нам нужна информация с этой страницы приложения на протяжении всей нашей разработки.
Прежде чем мы сможем написать код, нам нужно свернуть конечную точку разногласий, чтобы зарегистрировать команду косой черты в нашем приложении.
Заполните BOT_TOKEN токеном, доступным в разделе «Бот», а CLIENT_ID — идентификатором, доступным в разделе «Общая информация» на странице, и выполните команду на своем терминале.
Это зарегистрирует команду с косой чертой hello, которая принимает параметр с именем name строкового типа.
Создать и развернуть команду "Hello world Slash"
Вкратце: мы создали приложение на портале разработчиков Discord, зарегистрировали Slash-команду и создали проект на панели инструментов Deno Deploy.
Каждый раз, когда кто-то отправляет команду, Discord отправляет запрос POST с полезной нагрузкой в формате JSON. Нам нужно ответить в Discord в том же формате JSON. В приведенном ниже коде показан пример, который отвечает приветствием.
Развернуть код
- Нажмите кнопку ниже, и вы перейдете к Deno Deploy.
- Введите поле переменной env DISCORD_PUBLIC_KEY. Значение должно быть открытым ключом, доступным в разделе «Общая информация» на странице приложения Discord.
- Нажмите «Создать», чтобы создать проект, а затем «Развернуть», чтобы развернуть сценарий.
- Возьмите URL-адрес, отображаемый в разделе "Домены в рабочем развертывании".
Настройте приложение Discord для использования нашего URL-адреса в качестве URL-адреса конечной точки взаимодействия
- Вернитесь на страницу своего приложения (приветствия) на портале разработчиков Discord.
- Заполните поле "URL-адрес КОНЕЧНОЙ ТОЧКИ ВЗАИМОДЕЙСТВИЯ" URL-адресом и нажмите "Сохранить изменения".
Приложение готово. Перейдем к следующему разделу, чтобы установить его.
Установите Slash Command на свой сервер Discord
Поэтому, чтобы использовать команду hello Slash, нам нужно установить наше приложение Greeter на наш сервер Discord. Вот шаги:
Откройте Discord, введите /hello Deno Deploy и нажмите Enter. Результат будет выглядеть примерно так, как показано ниже.
Поздравляем с завершением обучения! Идите вперед и создайте несколько потрясающих команд Discord Slash! И поделитесь ими с нами на канале развертывания сервера Deno Discord.
Есть вопрос о нашей библиотеке? Ну, ваш ответ, вероятно, лежит где-то здесь.
Эта страница поддерживается Помощниками сервера Discord и разработчиками по их усмотрению. Для любых комментариев, отзывов или проблем, пожалуйста, рассмотрите возможность присоединиться к нашему серверу и обсудить это в наших каналах поддержки.
discord.py мертв! Умрет ли и эта библиотека?¶
Короткий ответ: нет.
Решение стать отдельной библиотекой, которая теперь является оболочкой API для Discord API, было принято до того, как Дэнни опубликовал на GitHub свое сообщение о прекращении разработки discord.py. Это официальное заявление разработчика библиотеки по этому поводу:
Собираетесь/рассмотрите возможность создания форка discord.py?¶
Короткий ответ: нет.
Длинный ответ представляет собой список многочисленных причин, по которым было принято это решение:
Для discord.py существует или будет существовать множество ответвлений, и поэтому мы не можем гарантировать нашу способность помочь пользователям, которые могут использовать собственную форму модифицированного кода.
Первоначальная цель этой библиотеки состояла в том, чтобы выступать в качестве расширения discord.py, но из-за необходимости постоянно вносить исправления в их кодовую базу, чтобы поддерживать работу нашей библиотеки, возникла крайняя техническая задолженность. Разветвление discord.py и построение на его основе ничего не меняет в нашей задаче избежать этого.
Целью этой библиотеки является исключительно реализация поддержки и интеграции использования взаимодействий из Discord API. Сделать эту библиотеку уникальной в том смысле, что мы делаем только это, казалось разумным и в пределах наших стандартов в то время.
Намерение сообщения неизбежно станет привилегированным намерением в апреле 2022 года. Практичность попытки поддерживать команды сообщений будет неосуществимой, поскольку разработчики Discord уже признали, что «нежелание реализовывать команды приложения» не будет уважительной причиной. для подачи заявки на это привилегированное намерение.
Разветвление discord.py было бы огромным изменением в нашей текущей кодовой базе, отбросив все усилия, которые мы вложили в него до сих пор, и, по сути, просто переписали бы то, как создавалась версия 2.0a. На тот момент это было бы не чем иным, как взаимодействием с discord.py — плюс, мы уже являемся библиотекой, которая придерживается очень похожих соглашений об именах, что и discord.py, так что это бессмысленно.
Сможет ли discord.py работать с этой библиотекой?¶
Короткий ответ: да.
Тем не менее, термин "работа" здесь имеет нечеткую структуру. Представьте, что это похоже на заклеивание дыры в стене вместо ремонта стены. По сути, мы «замазываем» поддержку discord.py вместо того, чтобы делать операции на его внутренних органах, чтобы он хорошо работал с нашей библиотекой. В настоящее время Interactions.py и discord.py являются оболочками API. Вы сможете запускать код наряду друг с другом, и вы сможете подключать некоторые классы, но преобразование данных должно быть точным.
Что это значит? Что ж, мы покажем вам:
Оба этих взаимодействия переменных и dpy смогут работать в одной и той же установленной среде, и, кроме того, обе они будут работать правильно, как и задумано их соответствующими библиотеками. Эта реализация использует asyncio.gather для одновременного выполнения обоих запусков как асинхронных задач и запускает их в одном цикле.
А как насчет моделей? Это простой ответ:
Оба из них смогут выполняться и давать правильное значение. Однако здесь очень важно отметить, что вы должны возвращать ту же самую информацию, от которой зависят наши объекты. Отсутствующий экземпляр класса может легко привести к его поломке, отсюда и «штукатурка», которая здесь происходит.
Что делать, если discord.py больше нет?¶
Самым предвзятым ответом было бы, конечно, использовать Interactions.py. Мы уже предлагаем множество интегрированных аспектов оболочки API, как это делает discord.py, однако мы специализируемся только на взаимодействиях. Это означает, что подобные вещи не будут официально поддерживаться нами (но могут быть доступны третьим сторонам):
Конечно, есть и другие библиотеки. Как правило, если вы хотите выполнять в основном слэш-команды и этот лакомый кусочек, мы настоятельно рекомендуем использовать нашу библиотеку, особенно слияние компонентов разногласий начиная с версии 4.0. Но если вам нужно что-то более открытое и универсальное, мы рекомендуем следующие источники:
Pycord (наиболее активно поддерживается).
dis-snek (высокоуровневая, «взламываемая» оболочка API, которую легко модифицировать).
nextcord (более абстрактный и быстрый подход к API Discord).
От разработчика библиотеки лично рекомендуется искать эти пути вместо того, чтобы придерживаться более старой версии библиотеки, например. discord.py 1.7.3 или 2.0.0a, так как они могут в конечном итоге стать устаревшими из-за дальнейших изменений в API, внесенных инженерами Discord.
Почему вы не поддерживаете кулдауны?¶
Кулдауны на самом деле не являются реальной функцией самого API Discord, а скорее удобной функцией, реализованной в discord.py, чтобы избежать спама команд.
Что, если люди будут спамить команды с косой чертой или субкомандой?
Самое интересное: это очень сложно сделать, и в большинстве случаев они этого не сделают. Если они не скопируют точную строку, которая использовалась, когда вы открываете элемент пользовательского интерфейса, чтобы сделать это много раз, большинство пользователей не смогут узнать, как это сделать. Однако, если вы, как разработчик бота, испытываете беспокойство по этому поводу, вы можете сами реализовать свои собственные методы восстановления. Кулдауны были ультиматумом, который возник в результате того, что команды сообщений можно было рассылать спамом, и, поскольку мы не будем их поддерживать, нет возможности иметь их в нашей библиотеке.
Мы не сможем создавать команды сообщений?¶
Это сложный вопрос, на который сложно ответить. Если вам нужен технический ответ: вы определенно можете создать их с помощью нашей библиотеки, однако вам придется запрограммировать их в событии слушателя on_message_create, которое мы используем. Это уже то, что большинство разработчиков ботов discord.py не одобряют, поэтому кодируйте в него свои собственные обработчики команд на свой страх и риск. К счастью, вы можете взять страницу из книги discord.js, если хотите сделать это, поскольку они никогда раньше не слышали о внешней структуре обработчика команд за всю свою жизнь.
Возможно, вы делаете что-то вроде этого:
И ошибка возникает в строке, где вы пытаетесь что-то отправить. Это легко исправить, добавив один аргумент:
Вы должны добавить этот дополнительный аргумент для каждого объекта, который вы создаете самостоятельно, если хотите использовать его методы
Контекст и сообщения не имеют атрибутов канала и гильдии! Почему?¶
На данный момент Discord API не включает их в свои ответы. Вы можете получить этот объект с помощью методов get_channel() и get_guild() модели Context и Message.
Здесь нет ответа на мой вопрос!¶
Пожалуйста, присоединяйтесь к нашему серверу Discord для получения дальнейшей поддержки в отношении нашей библиотеки и/или любого зависящего от нее кода интеграции.
Используйте базу данных Firebase Realtime или статические данные для получения команд вашего Discord Bot из командной косой черты.
Этот модуль можно использовать в качестве плагина для Discord.JS через Gateway API.
Прослушиватель функций
Значение запроса из экспресс-модуля приложения.
Значение ответа из экспресс-модуля приложения.
варианты
Здесь будут определены настройки модуля.
options.errorCallback (функция)
Ошибки, возникающие в модуле, будут отображаться здесь, чтобы вы могли отправить ответ на конечную точку Discord.
options.invalidCommandCallback (функция)
Если вы получите недопустимую команду, она будет отправлена этой функции.
Все ваши команды должны быть здесь. Каждый ключ объекта должен быть идентификатором команды или именем команды. Все возвращаемые значения совпадают с параметрами "options.invalidCommandCallback".
options.app (объект / необязательно)
Статические данные JSON для получения данных вашего бота.
options.firebase (объект / необязательно)
Данные JSON из вашей базы данных Firebase, которые вы хотите получить через базу данных Firebase в режиме реального времени.
options.appPath (строка/необязательно)
Путь к вашей базе данных Firebase Realtime, где вы храните данные своего бота.
options.bot (клиент Discord.JS / необязательно)
Вы можете вставить активный или неактивный клиент Discord.JS для использования в сочетании с API. (Проверено в Discord.JS 12.5.1)
options.varNames (объект / необязательно)
options.debug (логическое значение/необязательно)
Включить журнал отладки.
options.actionNotifications (логическое значение/необязательно)
Отключить уведомления о действиях в журнале.
options.forceInvalidCommandCallback (логическое значение/необязательно)
Все команды всегда возвращаются к методу Invalid Command.
options.hiddenDetector.value (строка или массив со строками)
Поместите имя логического значения, которое будет искаться внутри логических значений команды. Если имя значения найдено и значение истинно, сообщение будет видно только пользователю.
"null" отключит эту функцию.
Значения JSON
Примеры значений JSON
команды
имя_переменных
Обратный вызов команды
Как допустимые команды, так и недопустимые команды, вы получите одни и те же значения и методы для использования при отправке ответа на конечную точку Discord Command Slash.
result.setCommandPerm(commandID, data) (обещание)
commandID – идентификатор команды (строка)
result.bot (клиент Discord.JS)
Если ваше интерактивное приложение имеет действительный токен бота, это значение будет преобразовано в клиент Discord.JS. (Значения шлюза будут работать, только если вы используете режим шлюза Discord.JS)
result.cfg (объект)
Здесь появятся все конфигурации, которые используются в модуле.
result.interaction (объект)
Все данные о ваших взаимодействиях здесь.
result.di (модуль)
Данные модуля "discord-interactions".
result.res (обещание)
Ответ ванильного экспресса. Рекомендуется использовать только методы: res.status | res.json
result.reply(msg, msgType) [msgType = 'default' или 'temp'] (обещание)
Поместите строку или объект со значениями JSON.
msg — строка или объект сообщения, которое будет возвращено в API конечной точки взаимодействия Discord. Ваши значения будут отправлены в "json.data".
msgType — ваш тип ответа, который будет отправлен на конечную точку взаимодействия Discord.
результат.получить
Быстрые системы для получения значений, которые находятся внутри вашей косой черты.
result.types
Объект чисел с типами опций для значения "result.interaction.data[0].type".
Не тестировалось.
result.msg.delete
Удалить сообщение.
result.msg.edit
Отправьте json в качестве первого аргумента, чтобы отредактировать сообщение. (Все параметры JSON, описанные в официальной документации Discord, можно разместить здесь.)
result.newMsg
Отправьте json в качестве первого аргумента, чтобы создать сообщение. (Все параметры JSON, описанные в официальной документации Discord, можно разместить здесь.)
Шлюз
Вы можете использовать своего бота через шлюз Discord Interactions с модулем Discord.JS, и результаты будут такими же, как в примерах, упомянутых выше. Единственное, что будет изменено, — это способ сборки исходного кода.
Если вы включите значение "followMode", при отправке сообщения шлюзом он сначала отвечает на сообщение, используя DeferredChannelMessageWithSource. Когда вы используете "result.reply()", будет отправлен окончательный результат вашего сообщения.
Размещение сервера для ответа на команды от внешних клиентских серверов
Вы можете создать клиентский сервер вручную или использовать полностью разработанный модуль для получения запросов серверного модуля.
Читайте также: