некорректная команда взаимодействия с приложением discord

AileenLumina / bot.py

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

This comment has been minimized.

Copy link Quote reply

GNUGradyn commented Nov 9, 2018

How did you get a stack trace when ignoring an exception and printing it to STDERR?

This comment has been minimized.

Copy link Quote reply

ghost commented May 20, 2019

How do i detect the error of the @commands.has_role() check?

This comment has been minimized.

Copy link Quote reply

jordanchiquet commented Aug 1, 2019

How do i detect the error of the @commands.has_role() check?

This is what I use for my ‘terminate’ command which requires admin role.

This comment has been minimized.

Copy link Quote reply

MaciejkaG commented Oct 18, 2020 •

Nice code, help me so much. Thanks!
EDIT: But can i add an CheckFailure error to a one command? If i do this that command stops working.

This comment has been minimized.

Copy link Quote reply

barryii commented Dec 23, 2020 •

Nice code, help me so much. Thanks!
EDIT: But can i add an CheckFailure error to a one command? If i do this that command stops working.

Maybe you can add a decorator called @commands.is_owner() if you don’t have a cog_check in this cog.
The error of @commands.is_owner() is called NotOwner. If you have cog_check in this cog, then it will just be CheckFailure.
And you have to put NotOwner before CheckFailure.
Or you can make an independent error for only one command in the same cog.
@yourcommandname.error
async def yourcommandname_error(self,ctx,error):
if isinstance(error, commands.errors.CheckFailure):
await ctx.send(‘blahblahblah’)
return

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Самые распространенные ошибки программы Discord

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

Распространенные ошибки в Дискорде и способы их устранить

Ошибки при запуске Дискорд могут быть разнообразными. К наиболее распространенным из них принято относить:

некорректная команда взаимодействия с приложением discord. oshibki diskord. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-oshibki diskord. картинка некорректная команда взаимодействия с приложением discord. картинка oshibki diskord.

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

Ошибки при запуске

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

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

Обратите внимание, в качестве альтернативного варианта выделяют загрузку программного обеспечения Дискорд на используемое устройство. Часто встречается ситуация, когда веб-версия временно приостановлена в вопросе функционирования, а клиентская программа работает без технических сбоев.

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

Ошибки при скачивании программы

При возникновении проблем с загрузкой программного обеспечения, пользователям рекомендуется выполнить проверку:

некорректная команда взаимодействия с приложением discord. oshibki diskord1. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-oshibki diskord1. картинка некорректная команда взаимодействия с приложением discord. картинка oshibki diskord1.

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

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

Ошибка запроса дружбы

При возникновении проблем, которые связаны с невозможностью формировать запросы на дружбы с зарегистрированными пользователями Дискорда, причинами могут быть:

В первом случае последовательность действий не вызывает сложностей и предусматривает под собой:

некорректная команда взаимодействия с приложением discord. oshibki diskord2. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-oshibki diskord2. картинка некорректная команда взаимодействия с приложением discord. картинка oshibki diskord2.

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

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

Ошибка с D3DCOMPILER_47.dll

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

некорректная команда взаимодействия с приложением discord. oshibki diskord3. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-oshibki diskord3. картинка некорректная команда взаимодействия с приложением discord. картинка oshibki diskord3.

Ошибка «Installation has failed»

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

некорректная команда взаимодействия с приложением discord. oshibki diskord4. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-oshibki diskord4. картинка некорректная команда взаимодействия с приложением discord. картинка oshibki diskord4.

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

Ошибка «Error 502»

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

некорректная команда взаимодействия с приложением discord. oshibki diskord5. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-oshibki diskord5. картинка некорректная команда взаимодействия с приложением discord. картинка oshibki diskord5.

Ошибка «JavaScript error occurred in the main process»

Проблема заключается в используемом устройстве. Чтобы обеспечить бесперебойное функционирование программного обеспечения, рекомендуется воспользоваться специально разработанными утилитами. Их можно отыскать в официальном магазине Play Market либо App Store.

некорректная команда взаимодействия с приложением discord. oshibki diskord6. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-oshibki diskord6. картинка некорректная команда взаимодействия с приложением discord. картинка oshibki diskord6.

Ошибка 0xc000007b

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

некорректная команда взаимодействия с приложением discord. oshibki diskord7. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-oshibki diskord7. картинка некорректная команда взаимодействия с приложением discord. картинка oshibki diskord7.

Ошибка с kernel32.dll

Возникновение ошибки связано с наличием сбоев в работе программного обеспечения Дискорд. Пользователям рекомендуется придерживаться следующей последовательности действий:

некорректная команда взаимодействия с приложением discord. oshibki diskord8. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-oshibki diskord8. картинка некорректная команда взаимодействия с приложением discord. картинка oshibki diskord8.

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

Точка входа в процедуру

Рекомендуется проверить качество интернет-соединения. Если с этим проблем не возникает, требуется выполнить переустановку программного обеспечения.

Источник

Команда только для выбранных пользователей discord.py?

Простой 2 комментария

Поэтому я сделал команду только для создателя бота

некорректная команда взаимодействия с приложением discord. 5ff86e8d18a98625985889. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-5ff86e8d18a98625985889. картинка некорректная команда взаимодействия с приложением discord. картинка 5ff86e8d18a98625985889.

Хз возможно ли к дискорд боте такое, но что-то по типу такого предложу:
1) Создать список тех, кому доступна эта кмд, указав их ID, к примеру
Admincmdaccess=[‘27485949’, ‘. ]
2) В коде потом, при вводе определённой кмд, добавить строку для проверки, есть ли данный пользователь в списке, чтоб продолжить:
if bot.user.id in Admincmdaccess:

Если такое там можно реализовать, то сделать что-то похожее. Изменив какие-то данные

некорректная команда взаимодействия с приложением discord. 5ff1a1d8047ac042596942. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-5ff1a1d8047ac042596942. картинка некорректная команда взаимодействия с приложением discord. картинка 5ff1a1d8047ac042596942.

некорректная команда взаимодействия с приложением discord. 5ff86e8d18a98625985889. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-5ff86e8d18a98625985889. картинка некорректная команда взаимодействия с приложением discord. картинка 5ff86e8d18a98625985889.

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

Но тут уж нужно выбирать что и как, подстраиваясь под определенные цели.

Если нужно создать секретную команду для определенного круга лиц, то и список сойдёт.
Если же нужно выдавать полномочия другим, то БД

некорректная команда взаимодействия с приложением discord. 5ff5676723681446394972. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-5ff5676723681446394972. картинка некорректная команда взаимодействия с приложением discord. картинка 5ff5676723681446394972.

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

Затем тебе нужно перед необходимой функцией добавить декоратор @bot.is_owner()

Должно получиться что-то вроде этого:

А вообще, советую тебе заглядывать в документацию библиотеки, в 99% случаях там есть ответы на подобные вопросы, тем более ребята обновили дизайн сайта, а поэтому ориентироваться по нему стало ещё проще.

Источник

Пишем Discord бота на Python используя фреймворк discord.ext

Сегодня мы создадим Discord бота на Python, для этого не надо прикладывать каких то фантастических усилий.

Подготовка к работе

Для начала посещаем портал разработчиков и жмём кнопку «New Application» («Создать приложение»), вводим название нашего будущего бота и жмём «Create» («Создать»).

Диалоговое окно

некорректная команда взаимодействия с приложением discord. image loader. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-image loader. картинка некорректная команда взаимодействия с приложением discord. картинка image loader.

Теперь нам нужно создать аккаунт для бота — переходим в категорию «Bot» и жмём «Add Bot» («Добавить бота»), в появляющемся диалоговом окне подтвердим это — «Yes, do it!».

Настройки бота

некорректная команда взаимодействия с приложением discord. image loader. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-image loader. картинка некорректная команда взаимодействия с приложением discord. картинка image loader.

Копируем токен используя соответсвующую кнопку.

Интересный факт: Токен разделён на 3 части с помощью точек. Первая часть — зашифрованый с помощью base64 ID бота, вторая — время создания токена, третья — секретный ключ.

А сейчас нам нужно установить библиотеку discord.py. Для этого нужно использовать утилиту pip.

«Костяк» программной части бота. Эвенты, команды

После установки библиотеки можем приступать к написанию кода.

Почему она должна быть асинхронна? Потому что возьмём для примера команду которую исполняют одновременно 2 раза разные пользователи. def может заставить бота повиснуть изза того что она не может быть исполнена вместе с другими процессами, но async def занимает только один поток вместо того что бы не давать другим процессам программы исполняться.

Этот аргумент хранит информацию про сообщение, автора сообщения, гильдию, канал и т.п. и быть он всегда должен первым аргументом.

И что же мы делаем в ответ на команду? Мы запускаем асинхронную функцию ctx.send что бы отправить сообщение в тот канал в котором была отправлена команда

Тестируем наш костяк

Для начала нам нужно пригласить бота на сервер — и мы возвращаемся на портал разработки, переходим в категорию OAuth2 и в поле «Scopes» отмечаем только галочку на bot и получаем приглашение.

Запускаем бота, и тестируем работает ли команда

некорректная команда взаимодействия с приложением discord. image loader. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-image loader. картинка некорректная команда взаимодействия с приложением discord. картинка image loader.

Заключение

Возможно в следующих туториалах:

Работа с эмбедами
Разбитие бота на коги

Источник

Discord Slash API + Yandex Cloud Functions = ♡

некорректная команда взаимодействия с приложением discord. image loader. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-image loader. картинка некорректная команда взаимодействия с приложением discord. картинка image loader.

Добрый день. Многие знают, что программисту приходится следить за развитием технологий, даже тех, которые не касаются его текущего стека. Ну, или ему это доставляет удовольствие, которое он оправдывает необходимостью держать руку на пульсе. Так обычно зарождаются разнообразные домашние проекты. Я решил свести в один пост свои наработки по написанию Node.js-бота для Discord Slash API с Serverless подходом в Yandex Cloud. Использование готовых библиотек сведено к минимуму.

Discord?

Discord — это многим известный мессенджер, бесплатный до определённых пределов. Он позволяет без особых технических навыков построить коммьюнити по какой-то теме. В основном, конечно, это геймерские сообщества, именно так себя Discord и позиционирует — встроенная функциональность для трансляции игр и прочие навороты. Ими, впрочем, дело не ограничивается — на Хабре пробегали статьи про жизнь небольших контор в этом мессенджере, также там заседают алготрейдеры с «Реддита» и много кто ещё. В определённой степени эта популярность вызвана открытым API для написания ботов. Как правило, в любом сообществе администраторы создают 1–2 канала для совместного прослушивания музыки, игр в простые текстовые развлечения — атмосфера IRC начала нулевых.

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

Изначально я наткнулся на статью про Python и AWS, но просто скопировать её было бы слишком скучно для понимания и погружения, поэтому пришлось читать документацию самостоятельно.

Discord Slash API?

Коротко о разнице в подходах между основным WebSocket-протоколом и Discord Slash API для тех, кто уже писал своих ботов, — на вебсокетах можно (и нужно) слушать все сообщения в чате, независимо от того, упоминали там вашего бота или нет. Это открывает широкие возможности для взаимодействия по сбору статистики, для модерирования контента, для описания взаимодействия с пользователями в свободной форме, даже без явного упоминания, и т. д. Боты же, реализующие Discord Slash commands, получают в запрос только команду, написанную пользователем в специальном формате, но не слышат остальной трёп в канале. Эта разница отражена в названии взаимодействия — команда должна начинаться со слеша, и синтаксис выглядит привычным для многих мессенджеров — например, `/дай фотку:котика`. Параметры команды могут быть перечисляемыми. Клиентское приложение подскажет пользователю доступные варианты и явно обозначит, что это команда, а не простое сообщение в чат.

Базовый сценарий:

некорректная команда взаимодействия с приложением discord. image loader. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-image loader. картинка некорректная команда взаимодействия с приложением discord. картинка image loader.

Начнём с простого — заставим эту связку минимально работать. Нужно отвечать на команду
/дай с параметром фотку: соответствующей картинкой. Варианта будет три — котик, собакен или случайная из двух.

У Discord (в отличие от Telegram) довольно разухабистая система авторизаций, проверок и перекрёстных страниц, по которым надо пройти, чтобы все участники взаимодействия получили свои права в нужном объёме. Общением с @Botfather дело не ограничивается.

Сначала идём на портал разработчика и создаём новое приложение. На этой странице нам пригодятся поля APPLICATION ID и PUBLIC KEY. На вкладке Oauth2 нужно скопировать CLIENT SECRET, он тоже пригодится.

С помощью этих данных можно получить временный Bearer token, который позволяет авторизовываться на некоторых служебных эндпоинтах. Получим его:

CLIENT SECRET вводим весто пароля в интерактивном режиме.
Ответом будет примерно такой JSON:

Из ответа надо запомнить уже поле access_token. Обратите внимание, что scope — тоже значащее поле. Оно определяет, какие права будут у выданного нам токена. Перечисленных в примере хватит для дальнейшей работы.

Следующий нюанс — Slash-команды можно регистрировать глобально или в рамках одного сервера. Если ваш бот большой, серьёзный и готовится захватывать мир, глобальный режим — то что нужно. Везде, куда позвали бота, — его команды сразу появятся. На стадии отладки же он не очень удобен, так как изменения команд будут выкатываться до часа. Регистрация команды на одном сервере проходит мгновенно. Дублировать описание синтаксиса описания команды не буду — эта часть хорошо читается в оригинале.

Работать она, конечно же, ещё не будет.

некорректная команда взаимодействия с приложением discord. image loader. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-image loader. картинка некорректная команда взаимодействия с приложением discord. картинка image loader.

Знания, необходимые для этой, казалось бы, простой подготовительной части, щедро рассыпаны по документации, так что написание первой простейшей версии бота заняло у меня несколько вечеров. Кроме того — таких извращенцев просто мало, в основном эту функциональность используют вместе с основным ботом, висящим на WebSocket с помощью библиотеки discord.js (что, конечно, получается гораздо быстрее), и готовых сниппетов в интернете практически нет.

Пришла пора писать Serverless-функцию, которая будет отвечать на запросы.

Yandex Cloud Functions

Я не буду подробно останавливаться на описании интерфейса консоли Yandex Cloud. Типичный жизненный цикл Serverless-функций — это обрабатывать входящие обращения, иногда уже отсортированные Gateway API, и отдавать результат. Биллинг потом спишет копеечку за время работы функции.

Отдельно оговорюсь, что в интернете я наткнулся на интереснейшее обсуждение реализации бота на стандартном для Discord WebSocket-протоколе, который завязывался на Amazon API Gateway, умеющем преобразовывать каждое WebSocket-сообщение в отдельный вызов Serverless-функции. Yandex API Gateway так пока не может (но планирует смочь, особенно если их потыкает побольше народа). Честно говоря, и слава Эру, иначе я никогда не довёл бы эту статью до конца.

Итак, в консоли Yandex Cloud создаём новую функцию, среда выполнения — Node.js 14, время выполнения — 3 секунды (про него объясню позднее), доступная память — минимальная — 128 МБ.

Начинаем писать мало-мальски работающий код:

Мы объявили функцию, которая будет вызываться при получении REST-запроса по своему случайно сгенерированному постоянному адресу. В параметр event прилетает всё описание запроса — заголовки и тело. Переменная, которую мы возвращаем, описывает, как должен выглядеть ответ, его статус, заголовки и тело.

Бот обязан проверять подпись входящих запросов. Discord при первом сохранении endpoint проверяет, как она реагирует на запрос с некорректной подписью. И если бот не сможет распознать его и ответить 401-й ошибкой — откажется с ней работать. Проверку было решено отдать на откуп готовой библиотеке, помня о первой заповеди самостоятельной реализации аутентификации — «не делай этого».

Рядом с этим файлом нужно создать package.json, положив в него описание проекта, а главное — зависимостей:

После сохранения этого файла на вкладке «Операции» появится запись о том, что все зависимости установлены. Конечно, никто не мешает писать код в любимой IDE, а затем положить его в ZIP и закинуть на сервер со всеми зависимостями — но мне было интересно, как работает этот функционал.

У проверки подписи есть побочный эффект — вы не сможете потыкать свою функцию тестовыми данными, чтобы проверить её работу. Так что при более-менее серьёзной разработке поднимайте отдельную версию функции, которая не столь радикально относится к подписи. А заниматься такой отладкой придётся, потому что Discord не расскажет вам, что пошло не так при общении с ботом. Именно ручная отладка помогла мне понять, что по умолчанию функция отдаёт заголовок text/plain вместо нужного application/json.

Итак, после сохранения можно взять URL функции, зайти в личный кабинет приложения на сайте Discord, вбить его в поле INTERACTIONS ENDPOINT URL и сохранить. Ура. Теперь начнём, наконец, что-то отвечать на саму команду:

некорректная команда взаимодействия с приложением discord. image loader. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-image loader. картинка некорректная команда взаимодействия с приложением discord. картинка image loader.

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

Все, перед кем вставала задача радовать неугомонных пользователей фотографиями животных, наверное, знают про сервисы The Cat API и The Dog API. Это API, отдающее ссылки на фотографии, доступные для использования в проектах, похожих на наш. Большинство подобных сервисов реализуют функцию random и сами следят за актуальностью фотографий в своей базе, что снимает с разработчика множество проблем. Такие сервисы есть почти по любой тематике, и многие из них бесплатны до какого-то количества обращений. Мне вполне хватало этого лимита, так что я приступил к их использованию, всего лишь один fetch-запрос до сервиса. и сразу наступил на грабли того самого ограничения в 3 секунды, про которое говорил ранее. И проблема тут совсем не во времени исполнения функции — хотя, учитывая, что тарифицируют нас за время работы, необдуманно забивать это поле девятками — безусловно, не лучшая идея.

Проблема описана в совершенно другом месте документации Discord и звучит как «Interaction tokens are valid for 15 minutes and can be used to send followup messages but you must send an initial response within 3 seconds of receiving the event. If the 3 second deadline is exceeded, the token will be invalidated». В переводе на русский это означает, что вместе с сообщением о событии мы получаем особый токен, который позволяет реагировать на входящий запрос ещё 15 минут. Но первый ответ должен быть дан за 3 секунды, иначе пользователь увидит сообщение об ошибке, а токен протухнет.

Я не планировал скачивать изображения и считал что «трёх секунд хватит всем»​, но нет. Во-первых, запросы в нашем несовершенном мире иногда падают по сетевым причинам. Во-вторых, сервисы эти монетизируются крайне условно и геокешинг с CDN в разных странах, как правило, не используют. Запросы отрабатывали, но за 3 секунды можно вылететь.

Кроме того, однажды я попал в ситуацию, когда изображения перестали открываться в чате. Виноват оказался Роскомнадзор: CDN сервиса с котиками попал под блокировку. Сам сервис отдавал ссылку на картинку, я передавал её в чат, а Discord не мог открыть её, так как из России адрес был недоступен. Дополнительная проверка ссылки на доступность (напомню, мы всего лишь пытаемся показывать милые фото котиков) делала перспективы уложиться в 3 секунды более призрачными, особенно в случае повторного запроса.

Решение? Очевидно — создадим ещё одну функцию.

Новый план!

некорректная команда взаимодействия с приложением discord. image loader. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-image loader. картинка некорректная команда взаимодействия с приложением discord. картинка image loader.

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

Медленная функция должна будет отправить результат своей работы методом POST на https://discord.com/api/v8/webhooks/APPLICATION ID/INTERACTION TOKEN — это послужит ответом на первый, служебный ответ быстрой функции.

Изменения в быстрой функции:

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

Работа с точки зрения пользователя:

некорректная команда взаимодействия с приложением discord. image loader. некорректная команда взаимодействия с приложением discord фото. некорректная команда взаимодействия с приложением discord-image loader. картинка некорректная команда взаимодействия с приложением discord. картинка image loader.

Итоги

Главный вопрос, который может возникнуть при прочтении: «Зачем?».

Я отвечаю на него: «Чтобы не следить за сервером». Как только Yandex Cloud добавит в Gateway API возможность удержания WebSocket-сообщений — я попробую переписать и WebSocket-бота (который начинает спамить котиками при слишком бурном и не очень цензурном общении в чате) на Serverless.

Иногда нужен контроль, иногда страшно, что функция слишком бодро масштабируется, иногда есть виртуалка, на которой вполне хватит места на ещё-один-докер-с-js-процессом-внутри. Но рано или поздно за этим придётся следить — переносить процесс, данные, добавлять мониторинг, обновлять систему, наконец. Serverless-подход несложен в использовании, не требует ухода после деплоя и очень дёшев при небольших/нечастых нагрузках для домашних проектов.

Кстати, про «дёшево» — это, как правило, второй возникающий вопрос. Посчитаем по прайсу.

При тарификации вычислительных ресурсов (ГБ × час) учитывается объём памяти, выделенный для функции, и время выполнения функции.

На июль 2021 г. 1 миллион вызовов стоит 10 ₽, ГБ*час стоит 3,42 ₽, а исходящий трафик — 0,96 ₽ за гигабайт.

Среднее оплачиваемое время выполнения этих функций (из отчёта Yandex Cloud):

Медленная функция: 1200 мс
Быстрая: 200 мс

Итого: 1,4 с на обработку одного запроса.

Прикинем стоимость миллиона котиков:

3,42 × (128 / 1024) × (1200 / 3600 / 1000) × 1 000 000 + 10 × (1 000 000 / 1 000 000) = 152,5 ₽

Но — приятный подарок — первый миллион запросов, первые 10 ГБ × час в месяц и первые 10 ГБ исходящего трафика не тарифицируются.

Из моей личной практики (на канале в 400 человек, где у бота есть клуб преданных фанатов): он ни разу не вышел в платный режим. Даже с учётом вакханалии на 1 апреля, когда он показывал, а затем оперативно удалял чуть-чуть NSFW-шные картинки, которые «случайно» попали в его базу.

Неважно, что вы делаете — планировщик задач, торгового бота или такой проект на коленке, — прежде чем писать ещё_один_демон_за_которым_надо_следить, подумайте, возможно Serverless подойдёт вам больше.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *