Перейти к основному содержимому
Версия: 2026.2.4

JavaScript / TypeScript

Для разработки ботов на JavaScript или TypeScript рекомендуется использовать официальный SDK @voice/client.

Установка​

npm install @voice/client

Основной пример​

Ниже приведен пример создания клиента и обработки различных событий.

import { createClient, Context, InteractionResponseKind, CommandOptionType } from "@voice/client";

const client = createClient({
token: "ВАШ_ТОКЕН",
baseUrl: "https://voice.akemiko.tech"
});

// Реагирование на текстовые сообщения
client.match("!ping", async (ctx: Context) => {
await ctx.addReaction("🏓");
await ctx.sendMessage("Понг!");
});

// Запуск клиента
await client.init();
console.log("Бот запущен");

Обработка сообщений (match)​

Метод client.match позволяет гибко подписываться на входящие сообщения.

// Точное совпадение
client.match("!hello", async (ctx) => {
await ctx.sendMessage(`Привет, ${ctx.author.username}!`);
});

// Список вариантов
client.match(["hi", "hey", "привет"], async (ctx) => {
await ctx.sendMessage("И тебе привет!");
});

// Регулярные выражения
client.match(/погод[аеуы]/i, async (ctx) => {
await ctx.typing(true);
await ctx.sendMessage("Прогноз погоды: облачно, местами код. ☁️");
});

// Функция-предикат (полный доступ к контексту)
client.match(
(ctx) => ctx.text.length > 280,
async (ctx) => {
await ctx.sendMessage("Слишком длинное сообщение! Пожалуйста, будь короче.");
}
);

Работа с контекстом (Context)​

Объект ctx предоставляет доступ к данным события и методам ответа.

  • ctx.text — текст сообщения.
  • ctx.author — автор сообщения (ID, username, displayName и т.д.).
  • ctx.sendMessage(text) — отправить сообщение в тот же канал.
  • ctx.addReaction(emoji) — поставить реакцию.
  • ctx.typing(status) — показать/скрыть статус «печатает».
  • ctx.getMe() — получить информацию о самом боте.

Slash-команды​

Работа с командами разделена на два этапа: регистрация (чтобы они появились в интерфейсе) и обработка (выполнение логики).

Регистрация команд​

const botId = "ID_ВАШЕГО_БОТА";

await client.transport.registerCommand({
botId,
name: "echo",
description: "Повторяет переданный текст",
options: [
{
name: "text",
description: "Что повторить",
type: CommandOptionType.STRING,
required: true
},
],
});

Обработка команд​

client.command("echo", async (ctx) => {
const text = ctx.interaction?.options?.text ?? "…нечего повторять";

await ctx.respondToInteraction({
kind: InteractionResponseKind.CHANNEL_MESSAGE,
content: `🔁 ${text}`,
ephemeral: false, // если true, ответ будет виден только автору
});
});

Автодополнение (Autocomplete)​

При регистрации укажите autocomplete: true для опции, а затем используйте client.command для обработки запроса на дополнение.

Управление командами​

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

// Получение всех команд бота
const { commands } = await client.transport.getBotCommands({ botId });

// Удаление команды
await client.transport.deleteCommand({ botId, commandId: "ID_КОМАНДЫ" });

Обработка ошибок​

Для глобального перехвата ошибок в хэндлерах используйте client.onError.

client.onError((error) => {
console.error("Ошибка в работе бота:", error.message);
});

Завершение работы​

Для корректной остановки бота (например, при SIGINT) используйте client.stop().

process.on("SIGINT", async () => {
await client.stop();
process.exit(0);
});

Общий контракт для реализации собственной библиотеки — в разделе «Руководства по SDK».