umbot - v2.0.8
    Preparing search index...

    umbot - v2.0.8

    umbot

    Универсальный движок для разработки чат-ботов и голосовых навыков с единой бизнес-логикой для различных платформ.

    npm version License: MIT TypeScript Templates Security

    Подробная документация доступна в следующих разделах:

    Движок позволяет создать навык для Яндекс.Алиса, Маруси, Сбер(SmartApp), а также бота для VK, Viber или Telegram, с идентичной логикой. Вы можете использовать один и тот же код бизнес-логики для всех платформ, что значительно упрощает разработку и поддержку.

    Для использования собственной платформы укажите своё значение в mmApp.appType. По умолчанию установлено значение alisa.

    Платформа Идентификатор Статус
    Яндекс.Алиса alisa ✅ Полная поддержка
    Маруся marusia ✅ Полная поддержка
    Сбер SmartApp smart_app ✅ Полная поддержка
    Telegram telegram ✅ Полная поддержка
    VK vk ✅ Полная поддержка
    Viber viber ✅ Полная поддержка
    Пользовательские платформы user_application ✅ Базовая поддержка
    • ✨ Единый код для всех платформ
    • 🔄 Автоматическая конвертация форматов сообщений
    • 💾 Встроенное управление состоянием
    • 🎨 Богатые возможности UI (кнопки, карточки, галереи)
    • 🔊 Поддержка голосового ввода/вывода
    • 🚀 Простота разработки - TypeScript из коробки, автодополнение в IDE
    import { Bot } from 'umbot';
    import { EchoController } from './EchoController';
    import { IncomingMessage, ServerResponse } from 'http';

    const bot = new Bot();

    // Инициализация основных параметров
    bot.initParams({
    json: __dirname + '/data', // Директория для хранения данных
    error_log: __dirname + '/logs', // Директория для логов
    isLocalStorage: true, // Использовать локальное хранилище
    });

    // Инициализация контроллера
    const logic = new EchoController();
    bot.initBotController(logic);

    bot.start('localhost', 3000);
    import { BotController, WELCOME_INTENT_NAME } from 'umbot';

    export class EchoController extends BotController {
    public action(intentName: string): void {
    if (intentName === WELCOME_INTENT_NAME) {
    this.text = 'Привет! Я буду повторять за тобой.';
    return;
    }
    this.text = `Вы сказали: ${this.userCommand}`;
    }
    }
    # Клонирование репозитория в папку u_bot
    git clone https://github.com/max36895/universal_bot-ts.git u_bot
    cd u_bot
    npm install
    npm install umbot
    

    Минимальная конфигурация package.json:

    {
    "name": "my-umbot-project",
    "description": "Описание вашего проекта",
    "main": "index.js",
    "scripts": {
    "start": "node ./dist/index.js",
    "build": "rm -rf dist/ && tsc"
    },
    "dependencies": {
    "umbot": "*"
    }
    }
    npm install
    

    Создайте структуру проекта:

    my-bot/
    ├── src/
    │ └── controller/
    │ └── MyController.ts
    ├── package.json
    └── index.ts
    1. Контроллер бота (src/controller/MyController.ts):
    import { BotController, WELCOME_INTENT_NAME } from 'umbot';

    export class MyController extends BotController {
    public action(intentName: string): void {
    switch (intentName) {
    case WELCOME_INTENT_NAME:
    this.text = 'Привет! Я новый бот на umbot 👋';
    this.buttons.addBtn('Помощь');
    break;

    case 'help':
    this.text =
    'Я умею:\n' +
    '- Отвечать на приветствие\n' +
    '- Показывать кнопки\n' +
    '- Запоминать пользователей';
    break;

    default:
    this.text = 'Извините, я вас не понял 🤔\nСкажите "помощь" для списка команд';
    break;
    }
    }
    }
    1. Точка входа (index.ts):
    import { Bot } from 'umbot';
    import { MyController } from './src/controller/MyController';
    import { IncomingMessage, ServerResponse } from 'http';

    const bot = new Bot();

    // Конфигурация команд
    bot.initConfig({
    intents: [
    {
    name: 'help',
    slots: ['помощь', 'что ты умеешь'],
    },
    ],
    });

    // Основные параметры
    bot.initParams({
    json: __dirname + '/data', // Директория для хранения данных
    error_log: __dirname + '/logs', // Директория для логов
    isLocalStorage: true, // Использовать локальное хранилище
    welcome_text: 'Привет! Я новый бот', // Текст приветствия
    });

    // Инициализация логики
    const controller = new MyController();
    bot.initBotController(controller);

    bot.start('localhost', 3000);
    import { BotController } from 'umbot';

    export class ButtonController extends BotController {
    public action(intentName: string): void {
    switch (intentName) {
    case 'showButtons':
    // Добавление кнопок
    this.text = 'Выберите действие:';
    this.buttons.addBtn('Кнопка 1').addBtn('Кнопка 2', 'https://example.com'); // Кнопка с URL
    break;

    default:
    this.text = 'Скажите "покажи кнопки"';
    break;
    }
    }
    }
    import { mmApp, BotController } from 'umbot';

    // Простая команда со словами-триггерами
    mmApp.addCommand(
    'greeting',
    ['привет', 'здравствуй'],
    (userCommand: string, botController?: BotController) => {
    if (botController) {
    botController.text = 'Здравствуйте!';
    }
    },
    );

    // Команда с регулярными выражениями
    mmApp.addCommand(
    'numbers',
    ['\\b\\d{3}\\b'], // Числа от 100 до 999
    (userCommand: string, botController?: BotController) => {
    if (botController) {
    botController.text = `Вы ввели число: ${userCommand}`;
    }
    },
    true, // isPattern = true для регулярных выражений
    );

    // Удаление команды по имени
    mmApp.removeCommand('greeting');

    Важные замечания:

    • При isPattern: true строки в slots интерпретируются как регулярные выражения
    • Без isPattern (или isPattern: false) происходит поиск точного совпадения слов
    • Callback-функция может возвращать строку (она станет ответом) или void
    • В callback доступен весь функционал BotController

    Соберите проект следующей командой

    npm run build
    

    Запустите сервер:

    npm start
    

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

    Запуск приложения

    Для запуска приложения загрузите его на свой сервер, и по необходимости установите ssl сертификат

    Конфигурация токенов и чувствительных данных

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

    1. Прямая передача в конфигурации:
    bot.initParams({
    telegram_token: 'your-telegram-token',
    vk_token: 'your-vk-token',
    });
    bot.initConfig({
    db: {
    host: 'localhost',
    user: 'user',
    password: 'password',
    database: 'bot_db',
    },
    });
    1. Использование .env файла:
    bot.initConfig({
    env: './.env',
    });

    Пример содержимого .env файла:

    TELEGRAM_TOKEN=your-telegram-token
    VK_TOKEN=your-vk-token
    VK_CONFIRMATION_TOKEN=your-vk-confirmation-token
    VIBER_TOKEN=your-viber-token
    YANDEX_TOKEN=your-alisa-token
    MARUSIA_TOKEN=your-marusia-token
    
    DB_HOST=localhost
    DB_USER=user
    DB_PASSWORD=password
    DB_NAME=bot_db
    

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

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

    curl https://get.acme.sh | sh
    
    acme.sh --issue -d {{domain}} -w {{domain dir}}
    
    1. domain - Название домена (example.com)
    2. domain dir - Директория, в которой находится сайт
    acme.sh --install-cert -d {{domain}} --key-file {{key file}} --fullchain-file {{cert file}} --reloadcmd "service nginx reload"
    
    1. domain - Название домена (example.com)
    2. key file - Директория, в которой хранится ключ сертификата
    3. cert file - Директория, в которой сохранится сертификат

    После получения сертификата, перезапустите сервер. Для ngnix - sudo service nginx reload

    🛠 Инструменты разработчика

    • CLI команды
    • Шаблоны проектов: тут

    Тестирование проекта

    Протестировать приложение можно 2 способами:

    1. Загрузив проект на сервер (Актуально для Алисы и сбера).
    2. Через консоль, средствами движка (локально).

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

    Для тестирования используется тот же код, что и для запуска. С той лишь разницей, что нужно использовать класс BotTest вместо Bot.

    import { BotTest } from "umbot/dist/test";

    const bot = new BotTest();
    bot.test();

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

    npm run test
    node index.js

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

    1. Если навык в определенный момент ставит isEnd в True (Что означает завершение диалога), то необходимо дойти до того места сценария, в котором диалог завершается.
    2. Вызвать команду exit.

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

    📝 Лицензия

    MIT License. См. LICENSE для деталей.

    🤝 Поддержка

    Если у вас есть вопросы или предложения: