TeleKit ⚡

v2.0.0 Stable

Создавайте ботов
без головной боли

Профессиональный фреймворк для Telegram ботов на TypeScript. Встроенная база данных, управление сессиями и сценами из коробки.


📦 Установка

npm install telekit-lib

Быстрый старт

import { TeleKit } from 'telekit-lib';

// 1. Инициализация
const bot = new TeleKit('YOUR_BOT_TOKEN');

// 2. Простая команда
bot.command('start', async (ctx) => {
    await ctx.reply('Привет! Бот успешно запущен.');
});

// 3. Запуск
bot.start();

📋 Меню команд

Чтобы у пользователей появилась кнопка "Меню" со списком команд, зарегистрируйте их один раз при старте:

await bot.setCommands([
    { command: 'start', description: 'Запустить бота' },
    { command: 'help', description: 'Помощь' },
    { command: 'settings', description: 'Настройки' }
]);

📂 LocalDB (Прототипирование)

⚠️ Для прототипов: LocalDB загружает весь JSON-файл в память. Это удобно для старта, но при большой нагрузке используйте PostgreSQL или Redis.

LocalDB — это имитация базы данных (похожа на массивы JS), которая сохраняет данные в файл. Отлично подходит для хранения списка товаров, настроек или задач в небольших ботах.

Пример использования

import { LocalDB } from 'telekit-lib';

// 1. Опишите тип данных
interface Product {
    id: number;
    name: string;
    price: number;
}

// 2. Создайте экземпляр (укажите имя файла)
const products = new LocalDB<Product>('products.json');

// --- Основные операции ---

// Добавить запись
await products.push({ id: 1, name: 'iPhone 15', price: 999 });

// Найти одну запись
const item = await products.findOne(p => p.id === 1);
if (item) console.log(item.name);

// Найти все записи по условию
const cheapItems = await products.find(p => p.price < 1000);

// Обновить запись
await products.update(
    p => p.id === 1,       // Условие поиска
    { price: 899 }         // Новые данные
);

// Удалить запись
await products.delete(p => p.id === 1);

💾 Хранилище Сессий (FileStore)

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

import { TeleKit, FileStore } from 'telekit-lib';

// Сессии будут сохраняться в 'sessions.json'
const bot = new TeleKit('TOKEN', {
    store: new FileStore('sessions.json')
});

bot.onText('Имя', (ctx) => {
    ctx.session.name = 'Алекс';
    ctx.reply('Запомнил!');
});

🐘 Подключение PostgreSQL

Вы можете хранить сессии пользователей в PostgreSQL. А также использовать базу данных для бизнес-логики бота.

1. Хранение сессий (Session Store)

import { ISessionStore } from 'telekit-lib';
import { Client } from 'pg';

export class PostgresStore implements ISessionStore {
    private client: Client;

    constructor(connectionString: string) {
        this.client = new Client({ connectionString });
        this.client.connect();
        // Убедитесь, что таблица sessions существует
        this.client.query(`CREATE TABLE IF NOT EXISTS sessions (
            key TEXT PRIMARY KEY, 
            value JSONB
        )`);
    }

    async get(key: string) {
        const res = await this.client.query(
            'SELECT value FROM sessions WHERE key = $1', 
            [key]
        );
        return res.rows[0]?.value || null;
    }

    async set(key: string, value: any) {
        await this.client.query(
            `INSERT INTO sessions (key, value) VALUES ($1, $2)
             ON CONFLICT (key) DO UPDATE SET value = $2`,
            [key, value]
        );
    }

    async delete(key: string) {
        await this.client.query('DELETE FROM sessions WHERE key = $1', [key]);
    }
}

2. Использование БД в командах (Бизнес-логика)

Пример того, как выполнять SQL-запросы прямо внутри команд бота.

import { TeleKit } from 'telekit-lib';
import { Client } from 'pg';

// 1. Настройка подключения
const db = new Client({ connectionString: 'postgresql://user:pass@localhost:5432/mydb' });
await db.connect();

const bot = new TeleKit('TOKEN');

// 2. Команда отображения топа пользователей из БД
bot.command('top', async (ctx) => {
    // ...
});

bot.start();

🛡️ Middleware (Прослойки)

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


// 1. Логирование всего
bot.use(async (ctx, next) => {
    console.log(`[${new Date().toISOString()}] Update from ${ctx.userId}`);
    await next(); // Передать управление дальше
});

// 2. Проверка прав администратора
const ADMIN_ID = 123456789;
bot.use(async (ctx, next) => {
    if (ctx.text === '/secret' && ctx.userId !== ADMIN_ID) {
        return ctx.reply('⛔ Доступ запрещен');
    }
    await next();
});

🎮 Обработчики (Handlers)

// Точное совпадение
bot.onText('Меню', (ctx) => ctx.reply('Вот меню...'));

// Регулярное выражение (RegExp)
bot.onText(/^Привет (.+)$/, (ctx) => {
    const name = ctx.update.message.text.match(/^Привет (.+)$/)[1];
    ctx.reply(`Здравствуй, ${name}!`);
});

🎬 Сцены (Wizards)

Сцены нужны для пошагового сбора данных (например, анкета).

import { Scene } from 'telekit-lib';

// Создаем сцену 'register' с тремя шагами
const registerScene = new Scene('register',
    // Шаг 1
    (ctx) => {
        ctx.reply('Введите ваше имя:');
        ctx.next(); // Переход к следующему шагу
    },
    // Шаг 2
    (ctx) => {
        ctx.session.name = ctx.text;
        ctx.reply('Сколько вам лет?');
        ctx.next();
    },
    // Шаг 3
    (ctx) => {
        const age = ctx.text;
        ctx.reply(`Спасибо, ${ctx.session.name}! Вам ${age} лет.`);
        ctx.leave(); // Выход из сцены
    }
);

bot.addScene(registerScene);

// Команда для входа в сцену
bot.command('reg', (ctx) => ctx.enter('register'));

🎹 Клавиатуры

1. Обычные кнопки (Reply)

Появляются под полем ввода текста. Удобны для главных меню.

import { Keyboard } from 'telekit-lib';

bot.command('menu', (ctx) => {
    ctx.reply('Выберите действие:', {
        reply_markup: Keyboard.reply([
            ['📦 Товары', '🛒 Корзина'], // Ряд 1
            ['⚙️ Настройки']             // Ряд 2
        ])
    });
});

2. Инлайн кнопки (Inline)

Прикрепляются к сообщению. У каждой кнопки есть callback_data (ID действия) или url (ссылка).

bot.command('help', (ctx) => {
    ctx.reply('Чем помочь?', {
        reply_markup: Keyboard.inline([
            // data: 'promo' - это ID кнопки
            [Keyboard.callback('🔥 Акции', 'promo'), Keyboard.callback('ℹ️ О нас', 'about')],
            [Keyboard.url('🌐 Наш сайт', 'https://example.com')]
        ])
    });
});

3. Обработка нажатий (Callbacks)

Когда пользователь нажимает Инлайн-кнопку, срабатывает bot.onCallback.

// Обработка кнопки 'promo'
bot.onCallback('promo', (ctx) => {
    ctx.answerCallback(); // Скрыть часики загрузки
    ctx.reply('Сегодня скидка 50% на всё!');
});

// Обработка по шаблону (RegExp)
// Например, для кнопок 'item_5', 'item_10'
bot.onCallback(/^item_(\d+)$/, (ctx) => {
    const itemId = ctx.callbackData.match(/^item_(\d+)$/)[1];
    ctx.answerCallback(`Выбран товар #${itemId}`); // Показать всплывашку
    ctx.reply(`Информация о товаре ${itemId}...`);
});

📚 API Справочник

Context (ctx)

  • ctx.reply(text, extra?)

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

  • ctx.answerCallback(text?, alert?)

    Ответить на нажатие кнопки (скрыть часики).

  • ctx.editMessageText(text, extra?)

    Изменить текст текущего сообщения.

  • ctx.deleteMessage()

    Удалить текущее сообщение.

  • ctx.session

    Объект сессии пользователя.

  • ctx.enter(sceneId)

    Войти в сцену.

TeleKit (bot)

  • bot.start()

    Запустить бота.

  • bot.command(cmd, handler)

    Подписка на команду (/start).

  • bot.onText(trigger, handler)

    Подписка на текст (строка или RegExp).

  • bot.onCallback(trigger, handler)

    Подписка на инлайн-кнопку.

📝 История изменений (Changelog)

v2.0.3

15 Января 2026

  • 📚 Обновлена ссылка на документацию (теперь на GitHub Pages).
  • 🚀 Performance: LocalDB и FileStore переведены на асинхронную запись, чтобы не блокировать процесс.
  • 🛡️ Добавлена поддержка Middleware (см. документацию).

v2.0.1

15 Января 2026

  • ✨ Добавлен геттер ctx.userId для удобного доступа к ID пользователя.

v2.0.0 (Major Release)

15 Января 2026

  • 🎉 Полный перезапуск библиотеки под именем TeleKit.
  • 📦 Встроенная LocalDB для хранения данных в JSON.
  • 💾 Поддержка сессий (Redis / Postgres ready).
  • 🎬 Сценарный движок (Wizards) из коробки.