В umbot нет жесткого разделения на "адаптеры" и "плагины" на уровне ядра. Всё, что расширяет функционал, реализует интерфейс IPlugin (или IPluginFn) и подключается через bot.use(). Адаптеры для БД и Платформ — это просто специализированные плагины, наследующие базовые классы.
При вызове bot.use(entity) фреймворк проверяет тип сущности. Если это класс, он вызывает entity.init(appContext, bot). Контекст (AppContext) — это синглтон-хаб, где хранятся состояния, токены, реестры команд и подключенные модули.
appContext.plugins.appContext.plugins под любым вашим ключом. Вы вызываете их вручную из своего кода.appContext.database.adapter.appContext.platforms.Вам не нужно наследоваться от базовых классов. Достаточно реализовать функцию или объект и поместить его в нужный слот appContext.plugins.
import { Bot, AppContext, IPluginFn } from 'umbot';
const myI18nPlugin: IPluginFn = (appContext: AppContext, bot: Bot) => {
// Регистрируем плагин в слоте 'i18n'
appContext.plugins['i18n'] = (key: string, ...params: unknown[]) => {
return `Перевод для: ${key}`;
};
// Возвращаем функцию очистки ресурсов (опционально)
return () => {
// Освобождение ресурсов при уничтожении плагина
console.log('i18n plugin destroyed');
};
};
const bot = new Bot();
bot.use(myI18nPlugin);
import { Bot, AppContext, IPlugin } from 'umbot';
class MyI18nPlugin implements IPlugin {
init(appContext: AppContext, bot: Bot): void {
appContext.plugins['i18n'] = (key: string, ...params: unknown[]) => {
return `Перевод для: ${key}`;
};
}
destroy(bot: Bot): void {
// Освобождение ресурсов
console.log('i18n plugin destroyed');
}
}
const bot = new Bot();
bot.use(new MyI18nPlugin());
Для корректной работы системных плагинов соблюдайте их сигнатуры:
| Плагин | Сигнатура | Описание |
|---|---|---|
| i18n | (key: string, ...params: unknown[]) => string | Локализация текста |
| nlu | (text: string, platformNlu: INlu, platform: string, request: unknown) => INlu | Обработка естественного языка |
| regExp | () => RegExpConstructor | Кастомная реализация RegExp (например, re2) |
const i18nPlugin: IPluginFn = (appContext) => {
const translations = {
hello: 'Привет',
bye: 'Пока',
};
appContext.plugins['i18n'] = (key: string) => {
return translations[key] || key;
};
};
i18nPlugin.isPlugin = true;
bot.use(i18nPlugin);
const nluPlugin: IPluginFn = (appContext) => {
appContext.plugins['nlu'] = (
text: string,
platformNlu: INlu,
platform: string,
request: unknown,
) => {
// Обогащаем NLU данными из внешнего сервиса
return {
...platformNlu,
intents: {
...platformNlu.intents,
custom_intent: { slots: [] },
},
};
};
};
nluPlugin.isPlugin = true;
bot.use(nluPlugin);
Вы можете создать плагин для любых задач (кэширование, работа с внешним API, логика бизнес-правил) и зарегистрировать его под своим именем.
// 1. Создаем и регистрируем плагин
const myCustomCachePlugin: IPluginFn = (appContext: AppContext) => {
const cache = new Map();
// Регистрируем под своим уникальным ключом
appContext.plugins['myCustomCache'] = {
set: (key: string, value: any) => cache.set(key, value),
get: (key: string) => cache.get(key),
};
};
myCustomCachePlugin.isPlugin = true; // Обязательный маркер
bot.use(myCustomCachePlugin);
// 2. Обращаемся к нему из своего кода (например, в команде или контроллере)
bot.addCommand('save_data', ['сохрани'], (text, controller) => {
// Получаем доступ к нашему плагину через appContext
const cache = controller.appContext.plugins['myCustomCache'];
if (cache) {
cache.set('last_command', text);
controller.text = 'Данные сохранены в кастомный кэш!';
}
});
bot.use(plugin) вызывается plugin.init(appContext, bot).appContext.plugins.bot.clearUse() или завершении приложения вызывается plugin.destroy(bot).Важно: Метод destroy используется для освобождения ресурсов (закрытие соединений, отписка от событий, очистка таймеров). Если ваш плагин не создает ресурсов, метод можно не реализовывать.