Discord

Интеграция с дискорд-ботом

Текущий релиз
2.6.1
Разработчик
Peter Müller
Лицензия
MIT

логотип

Этот адаптер ioBroker интегрирует бота Discord в ioBroker.

Адаптер создает дерево объектов с объектами и состояниями для серверов и каналов, где присутствует бот.

Он также создает дерево объектов для всех пользователей, которых видит бот.

Эти состояния затем позволяют боту получать и отправлять сообщения и файлы через Discord.

Кроме того, адаптер может регистрировать команды Discord с косой чертой.

Затем их можно использовать для запроса или установки состояний ioBroker.

Функции

  • ioBroker указывает для всех серверов бота информацию о приеме и отправке сообщений.
  • ioBroker указывает для всех пользователей, которых видит бот, информацию о получении и отправке прямых сообщений.
  • Упрощено подключение и отключение от серверов Discord для бота.
  • Настройка статуса бота, включая действия
  • При желании можно отслеживать статус посещаемости пользователя.
  • При желании можно отслеживать состояние голосовой связи пользователей.
  • Голосовые команды для участников сервера (заглушить звук, оглохнуть, отключиться)
  • Обработка всех сообщений или только сообщений, упоминающих бота в каналах сервера.
  • Обработка личных сообщений
  • При желании, можно автоматически отвечать на упоминания бота смайликом.
  • Файл .json содержит информацию о канале, пользователе и сообщении.
  • Отправляйте сообщения, файлы, реакции (эмодзи), ответы или пользовательское содержимое сообщений в формате JSON.
  • Список участников сервера и канала, включая назначенные им роли.
  • Поддержка команд Discord с косой чертой для запроса и установки значений статуса.
  • Поддержка пользовательских команд Discord с косой чертой, которые могут быть использованы в пользовательских скриптах (включая Blockly).
  • Поддержка text2command (необходимо включать отдельно для каждого состояния .message)
  • Отправка, редактирование и удаление сообщений, отправка и ожидание ответов на сообщения в пользовательских скриптах.
  • Дополнительные параметры исходных состояний для большей гибкости в пользовательских скриптах
  • Поддержка Blockly с пользовательскими блоками для отправки и редактирования сообщений, а также обработки пользовательских команд с косой чертой.

Что не поддерживается и не предполагается:

  • Сообщения в ветках обсуждений
  • Отправка и получение голосовых сообщений

Отсутствует какая-либо функция? Просто создайте запрос на добавление функции на [GitHub][Новая задача на GitHub].

Создание Discord-бота

Для использования этого адаптера необходимо создать приложение-бота Discord.

  1. Перейдите на [Портал разработчиков Discord] и войдите в свою учетную запись Discord, если вы еще не авторизованы.
  2. В разделе «Приложения» нажмите кнопку «Новое приложение» в правом верхнем углу.

[Новое приложение

  1. Выберите название для приложения (это будет название бота) и нажмите «Создать».

[Название приложения

  1. (Необязательно) Загрузите иконку приложения, измените название (Название), измените описание (Описание), добавьте несколько тегов и сохраните изменения (Сохранить изменения).

[Настройки приложения

  1. В левом меню перейдите в раздел Бот и нажмите кнопку Добавить бота.

Добавить бота В следующем диалоговом окне нажмите «Да, сделайте это!», чтобы подтвердить создание бота.

  1. После создания бота необходимо один раз нажать кнопку «Сбросить токен», чтобы получить токен бота.

Поскольку это аннулирует все предыдущие токены, необходимо подтвердить это, нажав кнопку «Да, сделать!» во всплывающем диалоговом окне.

После этого токен бота отобразится один раз, и его следует скопировать в безопасное место (например, в конфигурацию экземпляра адаптера).

  1. На странице Бот прокрутите вниз до раздела Привилегированные намерения шлюза и активируйте Намерение присутствия, Намерение участников сервера и Намерение содержимого сообщения. Не забудьте сохранить изменения (Сохранить изменения).

[Привилегированные намерения шлюза Примечание: Как только бот появится более чем на 100 серверах, эти намерения потребуют проверки и одобрения со стороны Discord.

  1. Теперь всё готово для запуска экземпляра адаптера и добавления бота на сервер Discord.

Добавить бота на сервер

Чтобы добавить бота на сервер, используйте вкладку «Добавить бота на сервер» в конфигурации экземпляра адаптера.

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

Добавить бота на сервер

Для работы адаптера требуются следующие разрешения бота:

  • Изменить никнейм
  • Читать сообщения/просматривать каналы
  • Участники модерируют
  • Отправить сообщения
  • Встраивание ссылок
  • Прикрепить файлы
  • Прочитать историю сообщений
  • Упомяните всех
  • Добавить реакции
  • Отключить уведомления
  • Отключить участников
  • Переместить участников

Кроме того, необходимы следующие области применения:

  • бот
  • applications.commands

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

Удалить бота с сервера

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

Штаты

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

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

Всё дерево объектов генерируется на основе того, что видит бот.

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

Discord.0.bot.*

ИмяОписание
activityTypeТип активности бота. Возможные значения: Playing, Streaming, Listening, Watching, Competing, Custom или пустая строка.
statusСтатус присутствия бота. Возможные значения: online, idle, dnd и invisible.
statusСтатус присутствия бота. Возможные значения: online, idle, dnd и invisible.

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

Discord.0.servers.<server-id>.*

ИмяОписание
channels.*Каналы сервера.
members.*Участники сервера.

Discord.0.servers.<server-id>.channels.<channel-id>.*

ИмяОписание
channels.*Присутствует только в том случае, если канал является категорией. Структура такая же, как и для серверных каналов.
membersСписок участников канала (отображаемые имена), разделенный запятыми.
messageПоследнее сообщение, полученное в этом канале.
messageIdИдентификатор последнего полученного сообщения.
messageAuthorАвтор (уникальное имя пользователя или пользовательский тег) последнего полученного сообщения.
messageTimestampВременная метка последнего полученного сообщения.
messageJsonJSON-данные последнего полученного сообщения.
sendОтправка текстовых сообщений или сообщений в формате JSON.
sendFileОтправка файла.
sendReplyОтправка ответа на сообщение.
sendReactionОтправка реакции (эмодзи) на сообщение.
jsonJSON-данные информации о канале.
jsonJSON-данные с информацией о канале.

Для всех состояний message* и send* см. раздел Сообщения ниже.

Discord.0.servers.<server-id>.members.<user-id>.*

ИмяОписание
tagУникальный тег пользователя в Discord.
displayNameОтображаемое имя пользователя на сервере.
rolesРазделенный запятыми список ролей пользователя на сервере.
joinedAtОтметка времени подключения пользователя к серверу.
voiceChannelГолосовой канал, к которому пользователь в данный момент подключен, или пустая строка, если он не подключен.
voiceDisconnectКнопка для отключения пользователя от голосового канала.
voiceSelfDeafИндикатор того, отключил ли пользователь свой слух.
voiceSelfMuteИндикатор того, отключил ли пользователь звук.
voiceServerDeafИндикатор того, был ли пользователь оглушен сервером. Также может использоваться для изменения этого статуса.
voiceServerMuteИндикатор того, отключен ли пользователь сервером. Также может использоваться для изменения этого статуса.
jsonJSON-данные с информацией о пользователе.
jsonДанные в формате JSON, содержащие информацию о пользователе.

Для актуальности состояний voice* необходимо включить в конфигурации экземпляра опцию Мониторинг состояния голосового чата пользователей.

Для использования действий voiceDisconnect, voiceServerDeaf и voiceServerMute бот должен иметь соответствующие разрешения на сервере.

Discord.0.users.<user-id>.*

ИмяОписание
tagУникальный тег пользователя в Discord.
statusСтатус присутствия пользователя. Один из online, offline, idle, dnd
activityTypeТип текущей активности пользователя. Один из Playing, Streaming, Listening, Watching, Competing, Custom или пустая строка.
activityNameНазвание текущей активности пользователя. Например, название игры во время Playing.
avatarUrlURL-адрес аватара пользователя.
botИндикатор того, является ли пользователь ботом.
messageПоследнее личное сообщение, полученное пользователем.
messageIdИдентификатор последнего полученного пользователем личного сообщения.
messageTimestampОтметка времени последнего полученного пользователем личного сообщения.
messageJsonJSON-данные последнего полученного пользователем личного сообщения.
sendОтправка текстовых сообщений или сообщений в формате JSON.
sendFileОтправка файла.
sendReplyОтправка ответа на сообщение.
sendReactionОтправка реакции (эмодзи) на сообщение.
jsonJSON-данные с информацией о пользователе.
jsonДанные в формате JSON, содержащие информацию о пользователе.

Для того чтобы состояния status и activity* были актуальными, в конфигурации экземпляра необходимо включить параметр Observe user presence.

Для всех состояний message* и send* см. раздел Сообщения ниже.

Discord.0.slashCommands.<command-name>.*

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

Все эти состояния обновляются при каждом вызове заданной пользователем команды.

ИмяОписание
jsonДанные JSON из последнего использования команды. Содержит дополнительную информацию, не включенную в отдельные состояния.
userIdИдентификатор пользователя, выполнившего команду.
userTagУникальный тег пользователя, выполнившего команду.
userNameИмя пользователя, выполнившего команду. (Один раз, если userTag заканчивается на #0)
channelIdИдентификатор канала, в котором была вызвана команда.
serverIdИдентификатор сервера, на котором была вызвана команда, или null, если команда была вызвана в личном сообщении.
timestampВременная метка последнего использования команды.
option-*Параметры, указанные для команды. Для каждого настроенного параметра создается отдельное состояние. Если параметр не указан при вызове команды, то соответствующее состояние устанавливается в null.
option-*.valueПоследнее значение, указанное для параметра при вызове команды. Если параметр не указан, соответствующее состояние устанавливается в null.
option-*.choicesМассив JSON с предопределенными вариантами выбора для этой опции. Присутствует только для вариантов текстового типа. Пример: ["Wert 1", "Wert 2", { "name": "Wert 3", "value": "w3" }]
sendReplyОтправить ответ на вызванную команду. Как и в случае с состояниями каналов или пользователей .send, это может быть строка или объект JSON. См. раздел Сообщения ниже.
sendReplyОтправляет ответ на вызванную команду. Как и в случае с состояниями .send каналов или пользователей, это может быть строка или объект JSON. См. раздел Сообщения ниже.

Примечание: Рекомендуется использовать состояние json в собственных скриптах во избежание конфликтов.

Пример: Пользовательский скрипт считывает отдельные состояния option-*, и когда пользователь запускает команду снова, параметры из первого и второго запусков команды смешиваются.

Discord.0.raw.*

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

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

ИмяОписание
messageJsonНеобработанные JSON-данные последнего полученного сообщения. (Сообщения канала и личные сообщения)
interactionJsonНеобработанные JSON-данные последнего полученного взаимодействия (например, команды со слэшем)

Авторизация

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

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

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

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

Пользователи и роли идентифицируются по их внутреннему идентификатору, поэтому даже изменения в теге пользователя, имени пользователя или имени роли не влияют на авторизацию.

Также можно отключить авторизацию. Однако это следует делать только в том случае, если всем пользователям на всех серверах бота можно доверять!

Новости

Адаптер способен принимать и отправлять сообщения из текстовых каналов Discord и от пользователей.

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

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

При получении сообщения с упоминанием бота адаптер отвечает смайликом.

Это можно настроить в конфигурации экземпляра адаптера.

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

Получать сообщения

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

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

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

Последнее полученное сообщение для каждого канала/пользователя всегда хранится в состоянии .message.

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

Кроме того, вся эта информация также хранится в формате JSON в состоянии .messageJson.

Использование text2command

Для использования text2command необходимо выбрать экземпляр text2command в конфигурации экземпляра адаптера.

Для каждого состояния .message можно включить определяемую пользователем настройку enable text2command for this state.

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

Ответ от text2command отправляется адаптером либо как ответ, либо как обычное сообщение, либо не отправляется вовсе, в зависимости от конфигурации экземпляра адаптера.

Отправка сообщений

Для отправки сообщения его содержимое можно записать в состояния .send* канала или пользователя.

Отправка простых текстовых сообщений

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

Для форматирования текста можно использовать Discord Markdown, как и в клиенте Discord.

Для упоминания пользователя можно использовать его идентификатор в формате <@Benutzer-ID>.

Для упоминания групп можно использовать <@&Gruppen-ID>, а для каналов - <#Kanal-ID>.

Примеры: Dies ist meine Nachricht., Dies ist _meine_ **formatierte** Nachricht., Hey <@490222742801481728>!

Отправка файлов

Чтобы отправить файл в качестве вложения, запишите местоположение файла в состояние .sendFile желаемого места назначения.

Местоположение файла может быть…

  • Абсолютный или относительный путь к локальному файлу.

Относительные пути указываются относительно каталога адаптера в установленной системе ioBroker.

Путь может быть дополнительно снабжен префиксом file://.

Примеры: /home/user/image.png, ../../iobroker-data/files/myfile.txt, file:///tmp/image.jpg

  • URL-адрес удалённого файла.

Пример: https://www.iobroker.dev/images/iobroker.png

  • Содержимое файла, закодированное в Base64.

Пример: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACzklEQVQ4y3WTy2tcdRTHP+d3753HncncmbaJiYvEhZrU+ii2urJgFCyCLnykpbQrsbR/gRQaXPUPUHBlH4ogUsRSqq7qLtlZrQpKg6Uu1OCkSWZ65859zfzucTExsYLf3Tl8zznf85JHZ5+cVuGcMebg0YXXHN/3UVVAqfk1VJV+HCMiAKRpyuXPr1hrixsCZ10VzgEnXMeRF+afJwgaFIUC0Go1UYVOp4OYUYIoivjiyjWszecUMMaYAyXPk7m5R8jznCjqk2YpjuMQhj1AcT2XLM3oR30GgyFB0KDkeWKMOeAeP7ZgDh16jizNeO/9Dwh7PR7ft5ejRxa49tXXvPnG6yRJzNWrX/LDjz8xMTHOu4tnKJXLLC0tG1OtViVoNKhWK9wLQ9pr6yRJwtTUJC/Oz3P9+jckccrk5APcXd+g3V6jUqkwiqmKKwKIMBrbCKpw585vvHNmkT17dvHQzAylUhkjZocnggi4I0+BAML9sEXBX+27XLj0MXGSMLR2h6cFKLh+zSdoNlHYXtW/oaq019a3bRGhPlYnaDbxaz5GVflHV7lcYlcrYJRH+V9s8VUVN4r6bG5ugginT52k2+ny/c2bADjGMDG+m073HlmWbyvq9XoURUEU9TGO4+C4DsPBgI31DZIkwVqLAs8+8zQnjh/j1Vdevq84Iriei+M4GABByLKMTz+7zMWPPuHBqSkGgwGdbpeZ6WmiXu+/g9nu0E2SRMMwJMty6rUa+596gsOHX+L8hUvEcUyp5PH7H38yMb4bgMbYGFmWE4YhSZKozO3b/7PruI/Nzj7MybffotVqYYwhjmPq9TpBo8Hq6iqFjkpmWcaH5y+ysnKboR3+4lpbfGdtvvfWrV+lUi5T8jyKoqBeq9FqBqiC7/sYM7qAnggrK7fJ8lyBG67AWQWstQeXlpd33lmhVt96535/60aENE0YWmuBbwUW/wZQx0cNXLu4ygAAAABJRU5ErkJggg==

Кроме того, в файл можно добавить текстовое сообщение. Для этого достаточно указать путь к файлу, затем символ вертикальной черты | и сообщение в состоянии .sendFile.

Примеры: /tmp/image.png|Dies ist meine Datei, https://www.iobroker.dev/images/iobroker.png|Das ioBroker Logo

Отправка реакций

Состояние .sendReaction позволяет реагировать на предыдущие сообщения с помощью эмодзи. Просто введите эмодзи в это состояние.

По умолчанию ответ отправляется сообщению, идентификатор которого в данный момент содержится в соответствующем состоянии .messageId.

Для ответа на конкретное сообщение идентификатор сообщения, за которым следует символ вертикальной черты | и эмодзи, можно записать в состояние .sendReaction.

Примеры: 👍, 971032590515568660|👍

Отправка ответов

Вы можете отвечать на предыдущие сообщения, используя состояние .sendReply.

Просто напишите свой ответ в этом состоянии.

По умолчанию ответ отправляется на сообщение, идентификатор которого в данный момент содержится в соответствующем состоянии .messageId.

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

Примеры: Dies ist eine Antwort., 971032590515568660|Dies ist eine Antwort.

Отправка специальных пользовательских сообщений

Также можно отправлять специальные сообщения, определяемые пользователем, путем записи объекта сообщения JSON в состояние .send или .sendReply.

Объект JSON должен быть типа MessageOptions.

Дополнительную информацию см. в документации discord.js MessageOptions.

Примеры:

Отправьте фотографию:

{
  "files": [
    {
      "attachment": "/tmp/image.jpg",
      "name": "image.jpg",
      "description": "Mein tolles Bild"
    }
  ]
}

Отправить встроенный контент:

{
  "content": "Verwende das:",
  "embeds": [
    {
      "title": "ioBorker.discord",
      "description": "Discord Adapter für ioBroker",
      "color": "#5865f2",
      "url": "https://github.com/crycode-de/ioBroker.discord",
      "author": {
        "name": "Peter Müller",
        "url": "https://github.com/crycode-de"
      },
      "image": {
        "url": "https://github.com/crycode-de/ioBroker.discord/raw/main/admin/discord.png"
      },
      "footer": {
        "text": "❤👍"
      }
    }
  ]
}

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

{
  "embeds": [
    {
      "title": "IP-Cam Alarm",
      "description": "Schau dir das an:",
      "color": "#ff0000",
      "image": {
        "url": "attachment://cam.jpg"
      }
    }
  ],
  "files": [
    {
      "attachment": "http://192.168.1.50:8080/ip-cam.jpg",
      "name": "cam.jpg"
    }
  ]
}

Команды с косой чертой

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

Примечание: Доступные состояния для команд Discord с косой чертой необходимо настраивать индивидуально. Подробности см. ниже.

Команды Discord с косой чертой могут быть зарегистрированы адаптером как серверные команды (по умолчанию) или как глобальные команды. Это можно настроить в конфигурации экземпляра адаптера.

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

Однако серверные команды нельзя использовать в личных сообщениях между пользователем и ботом.

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

Команды, обозначаемые косой чертой по умолчанию, - это /iob-get и /iob-set.

Названия и описания команд можно настроить в конфигурации экземпляра адаптера.

Настройка состояний для команд со слэшем

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

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

[Активировать команды Discord

[Активировать команды Discord

Для каждого состояния в Discord можно задать имя (_Name) и псевдоним (Alias).

Имя (_Name) используется для автозаполнения команд, а псевдоним (Alias) служит внутренним идентификатором. Оба параметра не должны превышать 100 символов.

Для каждого состояния можно индивидуально указать, должно ли оно быть доступно для запроса и/или установки.

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

Для состояний типа данных string можно выбрать обработку значения как файла (местоположение файла).

Если эта опция включена, текущее значение состояния отправляется так же, как и для состояний .sendFile.

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

Для состояний типа данных number можно указать количество десятичных знаков для округления значения в командах запроса.

Для состояний типа данных boolean можно задать значения, определяемые пользователем, для true и false, которые затем используются для отображения в командах запросов и для обнаружения в командах наборов.

Состояния запроса

Чтобы проверить статус, просто введите /iob-get Zustandsalias в клиенте Discord.

Для Zustandsalias по мере ввода команды будет появляться автозаполнение.

Каждое значение форматируется для вывода в соответствии с объектом состояния и связанными с ним пользовательскими настройками.

При желании добавляется информация, если состояние не подтверждено.

Установить состояния

Чтобы запросить состояние, просто вызовите команду /iob-set Zustandsalias Neuer-Wert в клиенте Discord.

Для команды Zustandsalias по мере ввода появится автозаполнение.

Команда Neuer-Wert будет обработана адаптером, если тип данных состояния равен boolean или number.

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

Для состояний типа данных boolean значения true, on, yes, 1 и их соответствующие преобразования (wahr, an, ja), а также заданное для состояния значение True, интерпретируются как true.

Любое другое значение интерпретируется как false.

Для состояний типа данных number указанное значение интерпретируется как десятичное число.

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

Если в объекте состояния определены значения для min и max, они также проверяются.

Получите обзор состояний с настройками для команд, содержащих косую черту.

Чтобы получить обзор всех состояний с активной конфигурацией для команд с косой чертой, вы можете нажать кнопку «Записывать в журнал объекты состояния, настроенные для команд» в конфигурации экземпляра адаптера. После этого результат появится в журнале установки ioBroker.

Пользовательские команды со слэшем

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

Настроенные пользовательские команды затем регистрируются в Discord вместе со стандартными командами get и set.

К любой пользовательской команде можно добавить параметры.

Эти параметры будут отображаться в клиенте Discord для данной команды.

Если параметр не указан при вызове команды, он будет иметь значение null.

Для параметров типа Text можно динамически задавать предопределенные варианты в соответствующем состоянии option-*.choices в виде массива JSON.

При вызове заданной пользователем команды соответствующие данные записываются в связанные с ней состояния. См. описание состояний в разделе «Состояния» выше.

Вся информация, включая параметры, записывается в состояние .json команды.

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

Для параметров типа User, Role, Channel или Mentionable в объектах параметров заполняются дополнительные поля.

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

Ответ должен быть отправлен в течение 15 минут через состояние .sendReply или связанное с ним действие sendTo(...).

Если ответ не будет отправлен в течение этого времени, клиент Discord отобразит сообщение об ошибке «Приложение не отвечает».

Примечание: Ответ на команду может быть отправлен несколько раз.

Ответ будет отредактирован и перезаписан новым содержимым.

Структура JSON-состояния пользовательских команд с косой чертой

{
  interactionId: string,
  commandName: string,
  user: {
    id: string,
    tag: string,
    name: string,
    displayName: string,
  },
  channelId: string,
  serverId: string | null,
  timestamp: number,
  options: {
    [string]: {
      value: string | number | boolean | null,
      type: 'String' | 'Number' | 'Boolean' | 'User' | 'Role' | 'Channel' | 'Mentionable' | null,
      user?: { // wenn type USER oder MENIONABLE ist
        id: string,
        tag: string,
        name: string,
        bot: boolean,
      },
      member?: { // wenn type USER oder MENIONABLE ist und der Befehl auf einem Server aufgerufen wurde
        id: string,
        tag: string,
        name: string,
        displayName: string,
        roles: { id: string, name: string }[],
      },
      role?: { // wenn type ROLE oder MENTIONABLE ist
        id: string,
        name: string,
      },
      channel?: { // wenn type CHANNEL ist
        id: string,
        name: string,
        type: 'GuildCategory' | 'GuildNews' | 'GuildStageVoice' | 'GuildStore' | 'GuildText' | 'GuildVoice',
        lastMessageId: string | null,
      },
    },
    // ...
  }
}

Блокли

В комплект адаптера входят собственные блоки Blockly для...

  • Отправка сообщений в пользовательские или серверные каналы
  • Редактирование сообщений в личных сообщениях или каналах сервера
  • Добавление реакций в виде эмодзи к сообщениям
  • Формирование содержимого сообщения с добавлением необязательных вложений, вложений и ссылок для ответа.
  • Создание встраивания новостей
  • Создание вложений к сообщениям
  • Реагировать на пользовательские команды с косой чертой
  • Ответы на пользовательские команды с косой чертой

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

[Отправка и редактирование сообщений в Blockly

Код Blockly
<xml xmlns="https://developers.google.com/blockly/xml">
  <variables>
    <variable id="KIILW$,(eB?pT`;GDuMF">messageId</variable>
  </variables>
  <block type="discord_send_message_user" id="?xkCV};-Lk_-|Q`]%(Gt" x="163" y="38">
    <field name="instance">.0</field>
    <field name="logResultOk">FALSE</field>
    <value name="user">
      <shadow type="text" id="jXN@CluUy_M/ig@4[(Uk">
        <field name="TEXT">crycode</field>
      </shadow>
    </value>
    <value name="content">
      <shadow type="text" id="uLWu1CJ$;k}|VTyw1-8}">
        <field name="TEXT">Hallo!</field>
      </shadow>
    </value>
    <value name="varMessageId">
      <shadow type="logic_null" id="bJ2lJW0qOa@Zjv%(]mFU"></shadow>
      <block type="variables_get" id="xkJ(vH/;@7%)cDo0HU/~">
        <field name="VAR" id="KIILW$,(eB?pT`;GDuMF">messageId</field>
      </block>
    </value>
    <value name="varError">
      <shadow type="logic_null" id="H:f+1-:p9-YkmpehJoco"></shadow>
    </value>
    <next>
      <block type="timeouts_wait" id="OM8gv}Pl#_mHQ|)([mUe">
        <field name="DELAY">3</field>
        <field name="UNIT">sec</field>
        <next>
          <block type="discord_edit_message_user" id="|L3A+9{s_H8j`AF@,*VF">
            <field name="instance">.0</field>
            <field name="logResultOk">FALSE</field>
            <value name="user">
              <shadow type="text" id="voJ:{uuYtbBZ!Xe,rtV|">
                <field name="TEXT">crycode</field>
              </shadow>
            </value>
            <value name="messageId">
              <shadow type="text" id="64L=tOKvKwoqGHadRgDm">
                <field name="TEXT"></field>
              </shadow>
              <block type="variables_get" id="(M^6xk74LUEsPdH=LagL">
                <field name="VAR" id="KIILW$,(eB?pT`;GDuMF">messageId</field>
              </block>
            </value>
            <value name="content">
              <shadow type="text" id="rvnV^RF,g$M/3+(npHNC">
                <field name="TEXT">Moin!</field>
              </shadow>
            </value>
            <value name="varError">
              <shadow type="logic_null" id="{H4Q^vl400kxRKrffDz)"></shadow>
            </value>
          </block>
        </next>
      </block>
    </next>
  </block>
</xml>

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

Отправить составное сообщение Blockly

Код Blockly
<xml xmlns="https://developers.google.com/blockly/xml">
  <block type="discord_send_message_server_channel" id="Mnc=pB-8%Dr/nsen|SC`" x="63" y="38">
    <field name="instance">.0</field>
    <field name="logResultOk">FALSE</field>
    <value name="serverId">
      <shadow type="text" id="PA4]t;7CuDrKtwa|oB?L">
        <field name="TEXT">813364154118963251</field>
      </shadow>
    </value>
    <value name="channelId">
      <shadow type="text" id="x^vm,CRT`z2AhDT#ZcUC">
        <field name="TEXT">813364154559102998</field>
      </shadow>
    </value>
    <value name="content">
      <shadow type="text" id="ebdEp~G?:_gInjN47g@f">
        <field name="TEXT"></field>
      </shadow>
      <block type="discord_create_content" id="kY,/zwmwkjo:U;cT?eN*">
        <value name="content">
          <shadow type="text" id="D|y(g`oE@H#gu+deGbv2">
            <field name="TEXT"></field>
          </shadow>
        </value>
        <value name="embeds">
          <shadow type="logic_null" id="Qt[pG25wLoI8+3/jN66C"></shadow>
          <block type="discord_create_embed" id="cXAWtP-36uYlAxLhIBhN">
            <value name="description">
              <shadow type="text" id="^D%m:ic9]AcUUQP8~U#6">
                <field name="TEXT">Eingebetteter Anhang</field>
              </shadow>
            </value>
            <value name="title">
              <shadow type="logic_null" id="_Wm.(^Ff6^u%K+gVz$^Z"></shadow>
            </value>
            <value name="url">
              <shadow type="logic_null" id="0,08A!7[kJ-nJPnPH$L5"></shadow>
            </value>
            <value name="color">
              <shadow type="colour_picker" id="V0}MlQJvN._LHFhG2K%@">
                <field name="COLOUR">#5865f2</field>
              </shadow>
            </value>
            <value name="imageUrl">
              <shadow type="logic_null" id="xXr:E++u0;@2#e]r;_`]"></shadow>
              <block type="text" id="76;;p-5{pls%KmrI!ar{">
                <field name="TEXT">attachment://datei1.jpg</field>
              </block>
            </value>
            <value name="footerText">
              <shadow type="logic_null" id="#BS`MgkNWbrQ@*m/kNdw"></shadow>
            </value>
          </block>
        </value>
        <value name="files">
          <shadow type="logic_null" id="4u@7^DXCI~J$r{Qx}1Ql"></shadow>
          <block type="lists_create_with" id="42g8r-+[xWw`|^.qOF!*">
            <mutation items="2"></mutation>
            <value name="ADD0">
              <block type="discord_create_file" id="EzK4NA^+bu4vChH/vj-b">
                <value name="attachment">
                  <shadow type="text" id="=OEkBZ:LFXvT2$S++21(">
                    <field name="TEXT">/tmp/datei1.jpg</field>
                  </shadow>
                </value>
                <value name="name">
                  <shadow type="text" id="zum#q*|`aD%A2s/N@/Ow">
                    <field name="TEXT">datei1.jpg</field>
                  </shadow>
                </value>
                <value name="description">
                  <shadow type="text" id="#ZZOq%3EHO/_GC+w.,-^">
                    <field name="TEXT"></field>
                  </shadow>
                </value>
              </block>
            </value>
            <value name="ADD1">
              <block type="discord_create_file" id="wIKo-2??SX@WcYc7e/5s">
                <value name="attachment">
                  <shadow type="text" id=")4lvYv.)IhU/p+~KUDym">
                    <field name="TEXT">/tmp/logdatei.txt</field>
                  </shadow>
                </value>
                <value name="name">
                  <shadow type="text" id="#)t#lK6{$RuZt34O;@Ag">
                    <field name="TEXT">log.txt</field>
                  </shadow>
                </value>
                <value name="description">
                  <shadow type="text" id="^UKzs+$TQ!tiE:`(=%}}">
                    <field name="TEXT"></field>
                  </shadow>
                </value>
              </block>
            </value>
          </block>
        </value>
        <value name="replyToId">
          <shadow type="logic_null" id="#1:[?d^x=)ZH.!uyxRI:"></shadow>
        </value>
      </block>
    </value>
    <value name="varMessageId">
      <shadow type="logic_null" id="@D^#9^84UknOfV|c$NK~"></shadow>
    </value>
    <value name="varError">
      <shadow type="logic_null" id="mJu{Fa9+]+Ml,{_OqIOh"></shadow>
    </value>
  </block>
</xml>

Пример использования Blockly: Ответ на пользовательскую команду с косой чертой и отправка изображения с запрошенной IP-камеры

[![https://github.com/crycode-de/ioBroker.discord/blob/main/docs/de/media/blockly-3.png)

Код Blockly
<xml xmlns="https://developers.google.com/blockly/xml">
  <variables>
    <variable id="Wcj[Gmy,vX]b,)s,O)`U">interactionId</variable>
    <variable id="{sXn[Mn@ZN#fWtTV6O^;">userName</variable>
    <variable id="ULmVI=-QcXLnD!e60KTV">camID</variable>
  </variables>
  <block type="discord_on_custom_cmd" id="GE,i32wKhz%KGlBhV$j=" x="63" y="13">
    <mutation xmlns="http://www.w3.org/1999/xhtml" options="cam"></mutation>
    <field name="instance">.0</field>
    <field name="varInteractionId" id="Wcj[Gmy,vX]b,)s,O)`U">interactionId</field>
    <field name="log">FALSE</field>
    <field name="commandName">super-command</field>
    <value name="varUserId">
      <shadow type="logic_null" id="/}0,E!Gq=C2U]C^.8m1@"></shadow>
    </value>
    <value name="varUserName">
      <block type="variables_get" id="Q=v?u?yU}Tw*@FH*|x7.">
        <field name="VAR" id="{sXn[Mn@ZN#fWtTV6O^;">userName</field>
      </block>
    </value>
    <value name="varUserTag">
      <shadow type="logic_null" id="+r2I4SpfhuW%9DE21,[c"></shadow>
    </value>
    <value name="option0">
      <shadow type="logic_null" id="hL^g}gJg-b.+SOH0s9m1"></shadow>
      <block type="variables_get" id="z/Lf|chD)~Ge0N~@EWG%">
        <field name="VAR" id="ULmVI=-QcXLnD!e60KTV">camID</field>
      </block>
    </value>
    <statement name="STATEMENT">
      <block type="discord_send_custom_command_reply" id="zJXF!F=|Xt4.kG/6ctl(">
        <field name="instance">.0</field>
        <field name="interactionId" id="Wcj[Gmy,vX]b,)s,O)`U">interactionId</field>
        <field name="logResultOk">FALSE</field>
        <value name="content">
          <shadow type="text" id="bdVm59S9_U*GFB(IBO6x">
            <field name="TEXT"></field>
          </shadow>
          <block type="discord_create_content" id="6m8gBtp;K@t8}{`9gPd1">
            <value name="content">
              <shadow type="text" id=".c}Z71nQ8LlQ@h}_Z?qR">
                <field name="TEXT"></field>
              </shadow>
              <block type="text_join" id="Z{wQ$[1g7z?KPMSHB],Y">
                <mutation items="3"></mutation>
                <value name="ADD0">
                  <block type="text" id="cuzUE7GB$#gC*;nOQ|Ke">
                    <field name="TEXT">Hi </field>
                  </block>
                </value>
                <value name="ADD1">
                  <block type="variables_get" id="|[[T@|n1Ro{EU56/jJ@P">
                    <field name="VAR" id="{sXn[Mn@ZN#fWtTV6O^;">userName</field>
                  </block>
                </value>
                <value name="ADD2">
                  <block type="text" id="LV$kS:Gzv#cJ#gXe/{4a">
                    <field name="TEXT">!</field>
                  </block>
                </value>
              </block>
            </value>
            <value name="embeds">
              <shadow type="logic_null" id="p8S?*FLv4a6aIJogCKU;"></shadow>
            </value>
            <value name="files">
              <shadow type="logic_null" id="y#a8q/mr^)Ymt*j)S:H/"></shadow>
              <block type="discord_create_file" id="vN%eoP74=*)f63CQiJ__">
                <value name="attachment">
                  <shadow type="text" id="2$9y5yj3.GHx.ms*:Ce2">
                    <field name="TEXT"></field>
                  </shadow>
                  <block type="text_join" id="K9zuKTz?-b8VT$8XUVQ8">
                    <mutation items="3"></mutation>
                    <value name="ADD0">
                      <block type="text" id="p3f^[{6t+UuDJN=49+#Z">
                        <field name="TEXT">/tmp/cam</field>
                      </block>
                    </value>
                    <value name="ADD1">
                      <block type="variables_get" id="oVmVHEX[iT(-X#]m=[U@">
                        <field name="VAR" id="ULmVI=-QcXLnD!e60KTV">camID</field>
                      </block>
                    </value>
                    <value name="ADD2">
                      <block type="text" id="wUXx)@u6*2,+9!q{W`n`">
                        <field name="TEXT">.jpg</field>
                      </block>
                    </value>
                  </block>
                </value>
                <value name="name">
                  <shadow type="text" id="L5fO_+by.^Z:se~6|xCj">
                    <field name="TEXT">cam.jpg</field>
                  </shadow>
                </value>
                <value name="description">
                  <shadow type="text" id="ku}h+v)9oY;1`[9Rr)w%">
                    <field name="TEXT"></field>
                  </shadow>
                </value>
              </block>
            </value>
            <value name="replyToId">
              <shadow type="logic_null" id="Ou%Gd6C*+2OaIPUxPp}t"></shadow>
            </value>
          </block>
        </value>
        <value name="varMessageId">
          <shadow type="logic_null" id="RUb!i][5`[t0*mzLwBvN"></shadow>
        </value>
        <value name="varError">
          <shadow type="logic_null" id="SLsj^+8=[Bp%/X8n]$?Z"></shadow>
        </value>
      </block>
    </statement>
  </block>
</xml>

Использовать в скриптах

В скриптах функция sendTo(...) может использоваться для взаимодействия с экземпляром адаптера.

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

Отправка сообщения в скрипте

Для отправки сообщения можно использовать команду send или sendMessage. Обе они идентичны.

Часть message в sendTo(...) должна представлять собой объект, содержащий content для отправки и один из следующих параметров для идентификации цели:

  • userId
  • userTag
  • userName
  • serverId и channelId

Параметр content может представлять собой простую строку или объект MessageOptions.

Возвращаемое значение в функции обратного вызова sendTo(...) представляет собой объект, содержащий параметры сообщения и строку result, а также messageId отправленного сообщения Discord в случае успеха или сообщение error в случае ошибки.

Примеры:

// Senden einer Nachricht zu einem Benutzer bei Verwendung des einmaligen Benutzernamens
sendTo('discord.0', 'sendMessage', {
  userName: 'crycode',
  content: 'Hi!',
}, (ret) => {
  log(ret);
  // {'result':'Message sent to user crycode','userName':'crycode','content':'Hi!','messageId':'971779972052155891'}

  if (ret.error) {
    log(ret.error, 'error');
    return;
  }
  log(`Nachricht gesendet mit ID ${ret.messageId}`);
});

// Senden einer Nachricht zu einem Benutzer bei Verwendung des Benutzer-Tags
// (für Bots und Benutzer, die noch nicht zu einem einmaligen Benutzernamen migriert sind)
sendTo('discord.0', 'sendMessage', {
  userTag: 'cryCode#9911',
  content: 'Hi!',
}, (ret) => {
  log(ret);
  // {'result':'Message sent to user cryCode#9911','userTag':'cryCode#9911','content':'Hi!','messageId':'971779972052160552'}

  if (ret.error) {
    log(ret.error, 'error');
    return;
  }
  log(`Nachricht gesendet mit ID ${ret.messageId}`);
});

// Senden einer Antwort zu einem Benutzer
sendTo('discord.0', 'sendMessage', {
  userId: '490222742801481728',
  content: {
    content: 'Ok!',
    reply: {
      messageReference: '971779972052160552', // ID der Nachricht, auf die geantwortet werden soll
    },
  },
}, (ret) => {
  log(ret);
  // {'result':'Message sent to user crycode','userId':'490222742801481728','content':{'content':'Ok!','reply':{'messageReference':'971779972052160552'}},'messageId':'971786369401761832'}
});

// Senden einer Datei an einen Serverkanal
sendTo('discord.0', 'sendMessage', {
  serverId: '813364154118963251',
  channelId: '813364154559102998',
  content: {
    content: 'Schau dir das an:',
    files: [
      {
        attachment: "/tmp/image.jpg",
        name: "image.jpg",
        description: "Mein tolles Bild"
      },
    ],
  },
}, (ret) => {
  log(ret);
  // {'result':'Message sent to channel Allgemein','serverId':'813364154118963251','channelId':'813364154559102998','content':{'content':'Schau dir das an:','files':[{'attachment':'/tmp/image.jpg','name':'image.jpg','description':'Mein tolles Bild'}]},'messageId':'971780152759558234'}
});

Редактирование сообщения в скрипте

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

Конечно, редактировать можно только сообщения, отправленные ботом.

Часть message в sendTo(...) идентична части sendMessage (см. выше) с добавлением messageId сообщения, подлежащего обработке.

Возвращаемое значение такое же, как и для sendMessage.

Примеры:

// Eine Nachricht bearbeiten
sendTo('discord.0', 'editMessage', {
  userName: 'crycode',
  content: 'Hallo!',
  messageId: '971495175367049276',
}, (ret) => {
  log(ret);
  // {'result':'Message edited','userName':'crycode','content':'Hallo!','messageId':'971495175367049276'}
});

// Nachricht senden und nach fünf Sekunden bearbeiten
sendTo('discord.0', 'sendMessage', {
    userName: 'crycode',
    content: 'Es ist jetzt: ' + new Date().toLocaleString(),
}, (ret) => {
  if (ret.error) {
    log(ret.error, 'error');
    return;
  }
  setTimeout(() => {
    sendTo('discord.0', 'editMessage', {
      userName: 'crycode',
      content:  'Es ist jetzt: ' + new Date().toLocaleString(),
      messageId: ret.messageId,
    }, (ret2) => {
      log(ret2);
      // {'result':'Message edited','userName':'crycode','content':'Es ist jetzt: 5.5.2022, 16:25:38','messageId':'971779692166266920'}
    });
  }, 5000);
});

Удаление сообщения в скрипте

Команда deleteMessage может использоваться для удаления предыдущего сообщения.

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

Часть message в sendTo(...) идентична части sendMessage (см. выше), но без content, зато с добавлением messageId сообщения, подлежащего удалению.

Возвращаемое значение такое же, как и для sendMessage.

Пример:

// Löschen einer Nachricht
sendTo('discord.0', 'deleteMessage', {
  userName: 'crycode',
  messageId: '971495175367049276',
}, (ret) => {
  log(ret);
  // {'result':'Message deleted','userName':'crycode','messageId':'971495175367049276'}
});

Добавление эмодзи-реакции к сообщению в скрипте

Команда addReaction может использоваться для добавления реакции (эмодзи) к предыдущему сообщению.

Часть message в sendTo(...) идентична части sendMessage (см. выше), но без content, зато с добавлением messageId сообщения, на которое должен быть дан ответ, и emoji.

Возвращаемое значение такое же, как и для sendMessage.

Пример:

// Hinzufügen einer Reaktion auf eine Nachricht
sendTo('discord.0', 'addReaction', {
  userName: 'crycode',
  messageId: '971786369401761832',
  emoji: '😎',
}, (ret) => {
  log(ret);
  // {'result':'Reaction added to message','userName':'crycode','messageId':'971786369401761832','emoji':'😎'}
});

Ожидание ответа на сообщение в скрипте

Можно дождаться реакции (эмодзи) на предыдущее сообщение, используя команду awaitMessageReaction.

Часть message в sendTo(...) идентична части editMessage (см. выше), но без content, зато с дополнительным timeout и номером max.

Параметр timeout обозначает максимальное время ожидания для сбора результатов реакций в диапазоне от 100 до 60000 мс.

Параметр max определяет максимальное количество реакций, которые необходимо собрать.

По умолчанию значение равно 1, если не указано иное.

Функция обратного вызова для sendTo(...) вызывается при достижении максимального времени ожидания или указанного количества ответов.

Возвращаемое значение представляет собой объект, содержащий параметры сообщения и массив reactions. Каждый ответ представляет собой объект, состоящий из emoji, emojiId и users, где users - это массив объектов, содержащих id и tag.

Если ответ представляет собой обычный эмодзи, то используются emojiId и null.

Для пользовательских эмодзи emoji содержит имя, а emojiId - идентификатор эмодзи.

sendTo('discord.0', 'awaitMessageReaction', {
  serverId: '813364154118963251',
  channelId: '813364154559102998',
  messageId: '970754574879162458',
  timeout: 10000,
  max: 3,
}, (ret) => {
  log(ret);
  // {'reactions':[{'emoji':'👍','emojiId':null,'users':[{'id':'490222742801481728', 'name': 'crycode','tag':'crycode#0'}]}],'serverId':'813364154118963251','channelId':'813364154559102998','messageId':'970754574879162458','timeout':10000,'max':3}
});

Реагирование на пользовательские команды со слэшем в скрипте

Команда sendCustomCommandReply может использоваться для отправки ответа на вызов пользовательской команды.

Часть message из sendTo(...) должна представлять собой объект, содержащий content для отправки и interactionId вызова команды.

Параметр content может представлять собой простую строку или объект MessageOptions (как и в случае с sendMessage).

on({ id: 'discord.0.slashCommands.iob-test.json', change: 'any', ack: true }, (obj) => {
  log(`Benutzerdefinierter Slash-Befehl ${obj.state.val}`);
  // Benutzerdefinierter Slash-Befehl {"interactionId":"977265764136517725","commandName":"iob-test","channelId":"813364154559102998","serverId":"813364154118963251","user":{"id":"490222742801481728", "name":"crycode","tag":"crycode#0","displayName":"Peter"},"timestamp":1653068714890,"options":{"myopt":{"value":"test","type":"String"}}}

  const data = JSON.parse(obj.state.val);

  let reply;
  if (data.options.myopt.value) {
    reply = {
      content: `Du hast mir "${data.options.myopt.value}" gegeben.`,
      embeds: [
        {
          title: 'Das ist großartig!',
          color: '#00AA00',
        },
      ],
    };
  } else {
    reply = `Du hast mir nichts gegeben. 🤨`;
  }

  sendTo('discord.0', 'sendCustomCommandReply', {
    interactionId: data.interactionId,
    content: reply,
  }, (ret) => {
    log(ret);
    // {'result':'Reply sent','interactionId':'977265764136517725','content':{'content':'Du hast mir \'test\' gegeben.','embeds':[{'title':'Das ist großartig!','color':'#00AA00'}]},'messageId':'977265765122183248'}
  });
});

Запрос информации о сервере в скрипте

sendTo('discord.0', 'getServerInfo', {
  serverId: '813364154118963251',
}, (ret) => {
  log(ret);
});

Запрос информации о канале сервера в скрипте

sendTo('discord.0', 'getChannelInfo', {
  serverId: '813364154118963251',
  channelId: '813364154559102998',
}, (ret) => {
  log(ret);
});

Запрос информации о пользователе в скрипте

sendTo('discord.0', 'getUserInfo', {
  userId: '490222742801481728',
}, (ret) => {
  log(ret);
});
sendTo('discord.0', 'getUserInfo', {
  userTag: 'cryCode#9911',
}, (ret) => {
  log(ret);
});

Запрос информации о участнике сервера в скрипте

sendTo('discord.0', 'getServerMemberInfo', {
  serverId: '813364154118963251',
  userId: '490222742801481728',
}, (ret) => {
  log(ret);
});
sendTo('discord.0', 'getServerMemberInfo', {
  serverId: '813364154118963251',
  userTag: 'cryCode#9911',
}, (ret) => {
  log(ret);
});

Запрос информации о предыдущем сообщении в скрипте

sendTo('discord.0', 'getMessageInfo', {
  serverId: '813364154118963251',
  channelId: '813364154559102998',
  messageId: '978252795763359794',
}, (ret) => {
  log(ret);
});
sendTo('discord.0', 'getMessageInfo', {
  userId: '490222742801481728',
  messageId: '976090572760694814',
}, (ret) => {
  log(ret);
});
sendTo('discord.0', 'getMessageInfo', {
  userTag: 'cryCode#9911',
  messageId: '976090572760694814',
}, (ret) => {
  log(ret);
});

Changelog

2.6.1 (2025-10-25)

  • (crycode-de) Updated Sentry DSN
  • (crycode-de) Updated dependencies

2.6.0 (2025-10-21)

  • (crycode-de) Node.js >= 20, js-controller >= 6.0.11, Admin >= 7.6.17 required
  • (crycode-de) Updated dependencies

2.5.2 (2024-11-16)

  • (crycode-de) Added missing sizes to jsonConfig

2.5.1 (2024-10-23)

  • (crycode-de) Small style fixes for jsonConfig
  • (crycode-de) Optimized timeout behavior
  • (crycode-de) Updated dependencies

2.5.0 (2024-09-23)

  • (crycode-de) Node.js >= 18, Admin >= 6.17, js-contoller >= 5.0.19 are required
  • (crycode-de) Updated dependencies

2.4.0 (2024-07-10)

  • (crycode-de) Added basic support for interactions unknown to the adapter (custom scripts required for handling)
  • (crycode-de) Raw interaction JSON is now written to the state after the interaction is initially handled to prevent some race conditions
  • (crycode-de) Updated dependencies

2.3.1 (2024-06-29)

  • (crycode-de) Fixed Blockly for the latest JavaScript adapter changes
  • (crycode-de) Updated dependencies

2.3.0 (2024-05-14)

  • (crycode-de) 💥 Node.js 18+ is now required!
  • (crycode-de) Added support for custom bot activities
  • (crycode-de) Fixed Issue with embed colors not accepting hex color codes
  • (crycode-de) Fixed user activities for users with custom activities (see #60)
  • (crycode-de) Updated dependencies

2.2.1 (2024-04-13)

  • (crycode-de) Fixed blockly target detection if user is provided by a variable (You may need to move a block to update the generated code)
  • (crycode-de) Updated dependencies

2.2.0 (2023-11-07)

  • (crycode-de) Optimized error handling - Network related errors should now be handled completely without adapter restarts and better logging
  • (crycode-de) Fixed small issues in config UI
  • (crycode-de) Updated dependencies

2.1.2 (2023-09-04)

  • (crycode-de) Fixed response to notification-manager adapter

2.1.1 (2023-08-27)

  • (crycode-de) Updated dependencies
  • Updated translations

2.1.0 (2023-07-12)

  • (crycode-de) Added support for unique user names
  • (crycode-de) Detect possible DNS errors during login to prevent restart loops
  • (crycode-de) Better handling for login errors, first 4 errors are now logged just as info

2.0.0 (2023-06-11)

  • (crycode-de) Updated discord.js to v14
  • (crycode-de) 💥 Breaking: Activity types and channel types are now in title case. Example: PLAYING is now Playing, GUILD_TEXT is now GuildText.
  • (crycode-de) 💥 Breaking: In raw states all type field values are now numbers representing the internal enum values of the types.
  • (crycode-de) Add support for messages from the notification-manager adapter
  • (crycode-de) Updated dependencies
  • (crycode-de) Added Ukrainian translations
  • Updated translations

1.1.6 (2022-07-28)

  • (crycode-de) Fixed voice channel member count/list

1.1.5 (2022-07-27)

  • (crycode-de) Made token validation less strict

1.1.4 (2022-07-14)

  • (crycode-de) Fixed crash if custom command choices name was empty

1.1.3 (2022-07-01)

  • (crycode-de) Dependency updates

1.1.2 (2022-06-23)

  • (crycode-de) Fixed adapter termination on discord errors to let the js-controller restart the adapter

1.1.1 (2022-06-08)

  • (crycode-de) Added support for text messages in voice channels
  • (crycode-de) Added support for custom slash commands
  • (crycode-de) Added Blockly support with special custom blocks
  • (crycode-de) Send error replies on slash commands as ephemeral
  • (crycode-de) Added config option to send all slash command replies as ephemeral
  • (crycode-de) Register get/set commands only if states are configured for this
  • (crycode-de) Choices for commands are now handled as autocomplete which allows more choices, is more dynamic and shows the choices only to authorized users
  • (crycode-de) Added command options to raw.interactionJson json content
  • (crycode-de) Fixed command name checks
  • (crycode-de) Fixed some crashes / stuck conditions when network is not available
  • (crycode-de) Fixed several small bugs

1.0.2 (2022-05-16)

  • (crycode-de) Fixed some small issues found on adapter review

1.0.1 (2022-05-15)

  • (crycode-de) Added possibility to let the bot leave a Discord server
  • (crycode-de) Fixed crash on server updates

1.0.0 (2022-05-13)

  • (crycode-de) First release

License

MIT License

Copyright (c) 2022-2026 Peter Müller peter@crycode.de

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.