Ошибка взаимодействия с ботом Discord

Обновлено: 21.11.2024

Если у вас возникли проблемы с ботом Scryfall Discord, просмотрите эту страницу, чтобы узнать о распространенных проблемах и тестировании.

Бот вообще не отвечает

Бот отвечает медленно или с большой задержкой

  • Проверьте статус Discord, чтобы узнать, влияет ли что-то на сообщения в данный момент.
  • К сожалению, даже без активного инцидента в некоторые дни в Discord наблюдается особенно высокий трафик, и Discord может передавать события чата в Scryfall медленнее, чем обычно. Продолжайте следить за страницей статуса Discord и загляните через несколько часов, чтобы узнать, улучшится ли скорость.

Бот публикует пустые или пустые сообщения

  • Бот прикрепляет данные карты в виде ссылок. В настройках Discord убедитесь, что у вас включен параметр «Текст и изображения» → «Предварительный просмотр ссылок».

Символы маны отображаются в виде текста, например :manaw: или :mana3:

Символы маны отображаются в виде длинных тегов, таких как или

  • Только для Android: это известная проблема с Discord для Android. Вам рекомендуется отправить запрос в службу поддержки Discord с описанием проблемы. Объясните, что смайлики видны на других платформах, кроме Android, и предоставьте скриншоты.
Карточки
Скрифолл
Аккаунт
Разработчики

Части Scryfall являются неофициальным фан-контентом, разрешенным в соответствии с Политикой фан-контента Wizards of the Coast. Буквальная и графическая информация о Magic: The Gathering, представленная на этом сайте, включая изображения карт, символы маны и текст Оракула, защищена авторскими правами Wizards of the Coast, LLC, дочерней компании Hasbro, Inc. Scryfall не производится, не одобряется создано, поддерживается или связано с Wizards of the Coast.

Логотипы Slack, Discord, Cash App, PayPal и Patreon принадлежат их соответствующим владельцам. Scryfall не производится и не поддерживается этими службами.

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

У меня есть бот, который каждую секунду нажимает на кнопки, а люди выполняют команды. Обычно это идет очень хорошо, но иногда я получаю «Неизвестное взаимодействие», когда я уступаю ему.

Я занимаюсь отладкой последние три дня и не могу понять, почему это происходит. Мое последнее возможное объяснение — ошибка в Discord.js или на стороне Discord.

Я прикрепил несколько скриншотов с описанием ошибки

Я бы предпочел знать, связано ли это с моим кодом, Discord.js или самим Discord.

Пример кода

версия discord.js

Версия Node.js

Операционная система

Приоритет должен быть у этой проблемы

Средний (скоро будет исправлено)

Какие партиалы вы настроили?

КАНАЛ, GUILD_MEMBER, СООБЩЕНИЕ, РЕАКЦИЯ

На какие намерения шлюза вы подписаны?

ГИЛЬДЫ, GUILD_MEMBERS, GUILD_INVITES, GUILD_VOICE_STATES, GUILD_MESSAGES, GUILD_MESSAGE_REACTIONS, DIRECT_MESSAGES

Я протестировал эту проблему в разрабатываемой версии

Текст был успешно обновлен, но возникли следующие ошибки:

прокомментировал ikheetjeff 19 ноября 2021 г. •

Чаще всего это происходит при откладывании этой кнопки. Но иногда это случается с командой. Это действительно может несколько часов идти нормально, а потом подряд выдавать кучу ошибок.

Бот находится на очень загруженном сервере с несколькими щелчками мыши каждую секунду. Так что, если вы хотите протестировать что-то на этом сервере или посмотреть, вы можете это сделать. Пожалуйста, дайте мне знать, что я могу сделать для вас.

imranbarbhuiya прокомментировал 21 ноября 2021 г.

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

DTrombett прокомментировал 21 ноября 2021 г.

Вам нужно дождаться отсрочки

imranbarbhuiya прокомментировал 21 ноября 2021 г.

Ой, простите, мой плохой. Спасибо.

прокомментировал philipaarseth 24 ноября 2021 г.

То же самое случилось со мной. Внезапно возникают ошибки (хотя все еще работало нормально).

Это не правило трех секунд, я проверял, ответы всегда были

прокомментировал ikheetjeff 24 ноября 2021 г. •

Дело в том, что я очень часто получаю сообщение о неизвестном взаимодействии, когда хочу отложить взаимодействие (

Прокомментировал Jiralite 24 ноября 2021 г.

Я хотел бы озвучить, что я вообще не занимаюсь этими проблемами. В моих косых командах используется как отсрочка, так и отсутствие отсрочки на 13.3.1.Если бы это была актуальная проблема, я бы подумал, что это будет иметь больше активности, верно? Это очень важная концепция.

Кстати, образец минимального воспроизведения не означает копирование и вставку всего файла. Минимальный репродукционный образец означает предоставление минимального кода, с помощью которого вы можете воспроизвести проблему. Например:

Похоже, это является причиной вашей проблемы, когда ожидание .deferReply() иногда приводило к ошибке. Я спамил эту команду безрезультатно, поэтому я не могу воспроизвести ее в тестировании или производстве. Я не знаю, как исправить это для вас, кроме как предположить, что это может быть ваш собственный код?

прокомментировал ikheetjeff 24 ноября 2021 г.

Похоже, это является основой вашей проблемы, когда иногда ожидание .deferReply() приводило к ошибке. Я спамил эту команду безрезультатно, поэтому я не могу воспроизвести ее в тестировании или производстве. Я не знаю, как исправить это для вас, кроме как предположить, что это может быть ваш собственный код?

Спасибо за ответ и внимание. В настоящее время у меня есть 6 разных ботов на моем Linux-сервере. Все боты используются иногда, но бот, у которого у меня такая проблема, используется каждую секунду. Опять же, это очень случайно, когда это происходит. Иногда это не происходит какое-то время, иногда несколько раз подряд.

У меня нет этого со всеми другими моими ботами с таким же кодом. Просто потому, что это так неожиданно, я хотел отправить именно свой код, чтобы увидеть, в чем может быть проблема.

Я пытаюсь спросить у больших ботов, которые тоже используют кнопки, но пока не получил ответа. Я просто хотел бы знать, из-за меня это или из-за Дискорда.

Если кто-то хочет смотреть со мной в прямом эфире через демонстрацию экрана через Discord, он может это сделать. Тогда вы также можете сразу увидеть проблему. @Jiralite @thehackerboi69github

Applebee1558 прокомментировал 24 ноября 2021 г.

Возможно ли, что процессор вашего Linux-сервера немного перегружен ботами, из-за чего он не может быстро расшифровать каждую полезную нагрузку и вовремя отправить запрос?

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

прокомментировал ikheetjeff 24 ноября 2021 г.

Возможно ли, что процессор вашего Linux-сервера немного перегружен ботами, из-за чего он не может быстро расшифровать каждую полезную нагрузку и вовремя отправить запрос?

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

Я не обновляю статус своего бота, за исключением активности, которую я обновляю каждый день.

Я также сомневаюсь, что это связано с сервером. Вот почему я увеличил его мощность. Разницы пока нет. Сейчас я попробую другой хостинг, посмотрим, изменится ли это.

suneettipirnen прокомментировал 24 ноября 2021 г.

Здравствуйте, если нет достаточно убедительных доказательств того, что это ошибка в discord.js, я бы порекомендовал превратить эту проблему в обсуждение.

прокомментировал ikheetjeff 24 ноября 2021 г.

Здравствуйте, если нет достаточно убедительных доказательств того, что это ошибка с discord.js, я бы рекомендовал превратить этот вопрос в обсуждение.

Бот работает на новом сервере около 10 минут, проблем нет. Я не хочу забегать вперед и потрачу несколько часов, чтобы посмотреть, что произойдет. Я хотел бы подождать, если это нормально.

ikheetjeff прокомментировал 26 ноября 2021 г.

Наконец-то я понял, в чем проблема. Это не имеет никакого отношения к моему серверу, даже тогда я получаю ошибки. Если я только преобразую снежинку взаимодействия во время, я увижу, что мое событие вызывается слишком поздно. См. выше время его вызова.

Если я конвертирую снежинку, я получаю: 25-11-2021 05:01:43

Теперь я просто не знаю, то ли Discord отправляет мне это слишком поздно, то ли Discord.js обрабатывает это слишком поздно. Кто-нибудь знает/может изучить это?

прокомментировал philipaarseth 30 ноября 2021 г.

Намного позже я узнал, что причина, по которой у меня возникали эти проблемы, заключалась в том, что я запускал своего бота локально во время тестирования в дополнение к работе на Heroku (оказывается, режим обслуживания «автономный» на самом деле не работает). означает закрытие бота). Это означало, что бот Heroku первым обнаружит взаимодействия, а мой локальный бот выдаст ошибки.

Прокомментировал ChrisTalman 1 декабря 2021 г.

Теперь я просто не знаю, то ли Discord отправляет мне это слишком поздно, то ли Discord.js обрабатывает это слишком поздно. Кто-нибудь знает/может разобраться в этом?

У меня возникла эта проблема, когда я вручную вызывал Discord API перед обновлением до discord.js@13.0.0 .

У меня такое ощущение, что 3 секунды — это слишком мало времени для ответа приложений, поэтому эти ошибки появляются время от времени.

Я пытался реализовать такие вещи, как немедленная отсрочка или тайм-аут для отсрочки, но некоторые из этих ошибок по-прежнему возникают.

Мне также пришло в голову, может ли быть разница между часами моего сервера и часами серверов Discord, что может затруднить определение того, когда взаимодействие все еще действительно, или уже слишком поздно отвечать.

coder-lcn прокомментировал 15 декабря 2021 г.

Прокомментировал ChrisTalman 15 декабря 2021 г.

Интересно, не связано ли это с ограничениями скорости. Насколько я понимаю, discord.js будет ставить в очередь запросы API, когда это необходимо, чтобы избежать ограничения скорости. Если очередь достаточно длинная, запрос ответа на взаимодействие может быть отправлен только после того, как пройдет 3-секундное окно начального ответа, что приведет к ошибке API.

xHyroM прокомментировал 15 декабря 2021 г. •

Я могу подтвердить, что это происходит со мной очень часто с автозаполнением.

advaith1 прокомментировал 15 декабря 2021 г.

Вероятно, ваш поиск на YouTube занимает более 3 секунд, прежде чем вы получите ответ

coder-lcn прокомментировал 17 декабря 2021 г.

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

ikheetjeff прокомментировал 30 декабря 2021 г.

Мой вывод с событием apiResponse:

И все же, когда я конвертирую свою снежинку 925975082281603083 во время, это 30-12-2021 05:54:23. Есть ли способ проверить, есть ли очередь для предотвращения ограничения скорости? Потому что очень раздражает иногда видеть сообщение «Ошибка взаимодействия», когда вы нажимаете кнопку или команду.

Хорошо, мы добрались до 12 части! Предупреждаю, это будет долго. Эта часть будет о том, как вы можете создавать обработчики ошибок для своих команд, как вы кратко видели в предыдущей части о времени восстановления.

Существует несколько способов обработки ошибок с помощью discord.py:

  • Обработчики ошибок для каждой команды
  • Обработчики ошибок для каждого процессора
  • Глобальные обработчики ошибок

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

Обработка ошибок для каждой команды

Хорошо! Первый тип обработчика, который мы создадим, — простой для одной команды. Сначала давайте получим базовый код для шестеренки и базовой команды:

  • CommandOnCooldown из-за декоратора времени восстановления
  • MissingPermissions из-за декоратора has_guild_permissions
  • MissingRequiredArgument из-за необходимости члена
  • ConversionError из-за подсказки типа участника
  • CommandInvokeError из-за содержания команды, вызывающей DivisionByZero

Чтобы получить исходную ошибку из CommandInvokeError , вы можете использовать ее исходный атрибут, который возвращает вызвавшее ее исключение.

Теперь перейдем к самому обработчику ошибок. Первое, что нам нужно сделать, чтобы добавить обработчик ошибок, это сообщить discord.py, что мы хотим добавить обработчик ошибок в команду, что мы можем сделать с помощью декоратора ошибок команды:

Это указывает discord.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 , во что бы то ни стало нужно сделать более конкретные обработчики ошибок, которые имеют специальные сообщения для каждого исключения!

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

Я работал над ботом Discord, чтобы создать хаос, создав сообщение с кнопкой «Не нажимать», при нажатии которой пользователь нажимал кнопку на 30 секунд с сообщением « Я сказал тебе не нажимать на кнопку». После того, как мой бот был настроен как приложение и зарегистрирован на моем сервере, я подумал, что сложная часть позади, и начал усердно работать над подключением моей команды косой черты и созданием кнопок. Все шло гладко, пока я, наконец, не добавил функцию GuildMember.timeout() и не начал видеть эту ошибку всякий раз, когда нажимал кнопку:

Важное примечание о функции тайм-аута

Для администраторов не может быть тайм-аут

Потребовалось некоторое время, чтобы найти где-нибудь в Документах для разработчиков Discord разъяснение некоторых особенностей, в том числе то, что администраторы не могут быть отключены по тайм-ауту. Первоначально я думал, что это моя проблема, потому что я был администратором на сервере, где я тестировал своего бота, поэтому я вызвал резервную копию и попросил кого-то еще попробовать кнопку. и получил ту же ошибку 🙃

Иерархия ролей

Как выяснилось, есть еще один уровень разрешений, который не отображается на странице настроек "Разрешения". Роли имеют уровень разрешений, по умолчанию соответствующий порядку, в котором роли добавляются на сервер.

Это означает, что по умолчанию роль вашего бота будет начинаться с более низкими разрешениями, чем у всех остальных с назначенной им ролью. Чтобы исправить это, перетащите свою роль бота над ролями, которые вы пытаетесь модерировать, в разделе «Настройки сервера» > «Роли».

<блочная цитата>

. перетащите свою роль бота над ролями, которые вы пытаетесь модерировать, в разделе «Настройки сервера» > «Роли».

Как проверить иерархию ролей с помощью Discord.js

Это отлично подходит для развертывания вашего бота на собственном сервере, но если вы хотите разрешить другим развертывать экземпляр бота, они могут не знать об этом, что приведет к сбою вашего бота. Это можно исправить, заключив вызов GuildMember.function() в оператор if, проверяющий логическое значение GuildMember.moderatable .

Дополнительные ресурсы

Поделитесь этой страницей с друзьями:

🧪 Эксперимент 🧪 | 💥 Неудача 💥 | 🧠 Учитесь 🧠
© 2022, Создано с Nuxt

Читайте также: