voice.mjs — один файл без зависимостей: подключение к шлюзу с переподключением, регистрация команд, обработчики кнопок, повтор запросов при 429. Нужен Node.js 22+ (в нём есть WebSocket).
Терминал
curl -O https://voice-chat.ru/sdk/voice.mjsДля Node 18–21 передайте WebSocket из пакета ws:
new Client({ token, WebSocket: (await import("ws")).WebSocket }).Client
| Метод | Возвращает | Что делает |
|---|---|---|
new Client({ token, baseUrl?, reconnect?, WebSocket? }) | Client | Токен бота (можно с префиксом «Bot »). baseUrl по умолчанию — https://voice-chat.ru, или переменная VOICE_API. |
client.login() | Promise | Получает себя (/users/@me), регистрирует объявленные команды (PUT /applications/@me/commands) и подключается к шлюзу. |
client.command(name, description, options, handler) | this | Объявить глобальную команду «/» и её обработчик. |
client.button(customId | RegExp, handler) | this | Обработчик нажатия кнопки с этим custom_id. |
client.on(event, fn) | this | Подписка на событие (см. ниже). |
client.send(channelId, payload) | Promise<Message> | Сообщение: строка или { content, embeds, components, replyTo }. |
client.edit(channelId, messageId, content) | Promise | Изменить своё сообщение. |
client.delete(channelId, messageId) | Promise | Удалить сообщение. |
client.react(channelId, messageId, emoji) | Promise | Поставить или снять реакцию. |
client.setActivity(text, type?) | void | Статус бота: «Играет в …». type: playing, watching, listening, streaming. Подробнее |
client.api(method, path, body?) | Promise | Любой метод REST API (путь без /api), с повтором при 429. |
client.destroy() | void | Отключиться без переподключения. |
События
| Событие | Аргумент |
|---|---|
ready | client — после READY шлюза |
message | Message (кроме своих сообщений): .reply(), .react() |
messageUpdate | Message |
messageDelete | { channelId, messageId } |
interaction | Interaction — любая команда или кнопка |
command:имя | Interaction конкретной команды |
memberJoin | { serverId, member } |
serverAdd | { serverId, channels } — бота добавили на сервер |
raw | (t, d) — каждое событие шлюза |
MESSAGE_CREATE, ROLE_UPDATE… | d — любое событие шлюза по имени |
error | Error — ошибки обработчиков и запросов |
disconnect | код закрытия шлюза |
Interaction
| Свойство / метод | Тип | Описание |
|---|---|---|
type | "command" | "component" | Команда «/» или нажатие кнопки. |
commandName, options | string, object | Имя команды и параметры { имя: значение }. |
customId, message | string, object | Для кнопок: custom_id и сообщение с кнопкой. |
user, channelId, serverId | object, string | Кто вызвал и где. |
reply(payload) | Promise | Ответ (в течение 3 секунд). { ephemeral: true } — видно только вызвавшему. |
defer() | Promise | «Бот думает…» — потом followup() в течение 15 минут. |
update(payload) | Promise | Для кнопок: изменить сообщение, на котором нажали. |
followup(payload) | Promise | Ещё одно сообщение. |
editReply(payload) | Promise | Изменить первый ответ. |
Помощники
JavaScript
import { button, row } from "./voice.mjs";
row(
button.primary("Да", "vote_yes"), // также secondary, success, danger
button.link("Сайт", "https://example.com"),
);