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».