universal_bot-ts
394 строки · 14.4 Кб
1import {fwrite, isDir, mkdir} from './utils/standard/util';2import {IDbControllerModel} from './models/interface';3
4export interface IDir {5path: string;6fileName: string;7}
8
9/**
10* Типы приложений
11*/
12export type TAppType = 'alisa' | 'vk' | 'telegram' | 'viber' | 'marusia' | 'user_application' | 'smart_app';13
14/**
15* Используется Алиса
16* @type {string}
17*/
18export const T_ALISA: TAppType = 'alisa';19/**
20* Используется vk бот
21* @type {string}
22*/
23export const T_VK: TAppType = 'vk';24/**
25* Используется telegram бот
26* @type {string}
27*/
28export const T_TELEGRAM: TAppType = 'telegram';29/**
30* Используется viber бот
31* @type {string}
32*/
33export const T_VIBER: TAppType = 'viber';34/**
35* Используется Марус
36* @type {string}
37*/
38export const T_MARUSIA: TAppType = 'marusia';39/**
40* Используется Сбер SmartApp
41* @type {string}
42*/
43export const T_SMARTAPP: TAppType = 'smart_app';44/**
45* Используется пользовательский тип приложения
46* @type {string}
47*/
48export const T_USER_APP: TAppType = 'user_application';49
50/**
51* Название интента для приветствия
52* @type {string}
53*/
54export const WELCOME_INTENT_NAME = 'welcome';55/**
56* Название интента для помощи
57* @type {string}
58*/
59export const HELP_INTENT_NAME = 'help';60
61/**
62* Параметры для подключения к Базе Данных
63*/
64export interface IAppDB {65/**66* Адрес, по которому находится База Данных
67*/
68host: string;69/**70* Логин для подключения к БД
71*/
72user?: string;73/**74* Пароль для подключения к БД
75*/
76pass?: string;77/**78* Название БД
79*/
80database: string;81}
82
83export interface IAppIntent {84/**85* Название команды. Используется для идентификации команд.
86*/
87name: string;88/**89* Какие слова активируют команду. (Можно использовать регулярные выражения если установлено свойство is_pattern).
90*/
91slots: string[];92/**93* Использовать регулярное выражение или нет. По умолчанию false.
94* @defaultValue false
95*/
96is_pattern?: boolean;97}
98
99export interface IAppConfig {100/**101* Директория, в которую будут записываться логи и ошибки выполнения.
102*/
103error_log?: string;104/**105* Директория, в которую будут записываться json файлы.
106*/
107json?: string;108/**109* Настройка подключения к базе данных. Актуально если isSaveDb = true.
110*/
111db?: IAppDB;112/**113* Использование локального хранилища вместо БД. Актуально для приложений, который поддерживают работу с ним. На данный момент, локальное хранилище есть у всех голосовых помощников.
114* Важно! Чтобы опция работала, нужно поставить галку "Использовать хранилище данных в навыке" в кабинете разработчика.
115*/
116isLocalStorage?: boolean;117}
118
119export interface IAppParam {120/**121* Viber токен для отправки сообщений, загрузки изображений и звуков.
122*/
123viber_token?: string | null;124/**125* Имя пользователя, от которого будет отправляться сообщение.
126*/
127viber_sender?: string | null;128/**129* Версия api для Viber
130*/
131viber_api_version?: number | null;132/**133* Telegram токен для отправки сообщений, загрузки изображений и звуков.
134*/
135telegram_token?: string | null;136/**137* Версия Vk api. По умолчанию используется v5.103.
138* @defaultValue v5.103
139*/
140vk_api_version?: string | null;141/**142* Код для проверки корректности Vk бота. Необходим для подтверждения бота.
143*/
144vk_confirmation_token?: string | null;145/**146* Vk Токен для отправки сообщений, загрузки изображений и звуков.
147*/
148vk_token?: string | null;149/**150* Маруся Токен для загрузки изображений и звуков в навыке.
151*/
152marusia_token?: string | null;153/**154* Яндекс Токен для загрузки изображений и звуков в навыке.
155*/
156yandex_token?: string | null;157/**158* Токен для отправки запросов в Yandex speech kit.
159*/
160yandex_speech_kit_token?: string | null;161/**162* Актуально для Алисы!
163* Использовать в качестве идентификатора пользователя Id в поле session.user.
164* Если true, то для всех пользователей, которые авторизованы в Яндекс будет использоваться один токен, а не разный.
165*/
166y_isAuthUser?: boolean;167/**168* Идентификатор приложения. Заполняется автоматически.
169*/
170app_id?: string | null;171/**172*Идентификатор пользователя. Заполняется автоматически.
173*/
174user_id?: string | number | null;175/**176* Текст, или массив из текста для приветствия.
177*/
178welcome_text?: string | string[];179/**180* Текст, или массив из текста для помощи.
181*/
182help_text?: string | string[];183/**184* Обрабатываемые команды.
185*
186* @demo Пример intent с регулярным выражением:
187* ```json
188* [
189* -'name' : 'regex',
190* -'slots' : [
191* -'\b{_value_}\b', // Поиск точного совпадения. Например, если _value_ = 'привет', поиск будет осуществляться по точному совпадению. Слово "приветствую" в данном случае не будет считаться как точка срабатывания
192* -'\b{_value_}[^\s]+\b', // Поиск по точному началу. При данной опции слово "приветствую" станет точкой срабатывания
193* -'(\b{_value_}(|[^\s]+)\b)', // Поиск по точному началу или точному совпадению.
194* -'\b(\d{3})\b', // Поиск всех чисел от 100 до 999.
195* -'{_value_} \d {_value_}', // Поиск по определенному условию. Например регулярное "завтра в \d концерт", тогда точкой срабатывания станет пользовательский текст, в котором есть вхождение что и в регулярном выражении, где "\d" это любое число.
196* -'{_value_}', // Поиск любого похожего текста. Похоже на includes()
197* -'...' // Поддерживаются любые регулярные выражения. Перед использованием стоит убедиться в их корректности на сайте: (https://regex101.com/)
198* ],
199* -'is_pattern' : true
200* ]
201* ```
202*/
203intents: IAppIntent[] | null;204/**205* Текст для UTM метки.
206* @defaultValue utm_source=Yandex_Alisa&utm_medium=cpc&utm_campaign=phone
207*/
208utm_text?: string | null;209}
210
211/**
212* Статический класс, хранящий состояние и параметры приложения.
213* @class mmApp
214*/
215export class mmApp {216private static _isDevMode: boolean;217/**218* Использование стороннего контроллера для подключения к БД.
219* Класс должен быть унаследован от DbControllerModel. Стоит применять в том случае, если используется другая СУБД.
220* Если опция не передается, то используется стандартное подключение MongoDb.
221* @see DbControllerModel
222*/
223public static userDbController: IDbControllerModel;224/**225* Куда сохраняются пользовательские данные. Если false, то данные сохраняются в файл, иначе в бд. По умолчанию false.
226* @defaultValue false
227*/
228public static isSaveDb: boolean = false;229
230/**231* Тип приложения. (Алиса, бот vk|telegram).
232*/
233public static appType: TAppType | null;234/**235* Основная конфигурация приложения.
236*/
237public static config: IAppConfig = {238error_log: '/../../logs',239json: '/../../json',240db: {241host: '',242user: '',243pass: '',244database: ''245},246isLocalStorage: false247};248/**249* Основные параметры приложения.
250*/
251public static params: IAppParam = {252viber_token: null,253viber_sender: null,254viber_api_version: null,255telegram_token: null,256vk_api_version: null,257vk_confirmation_token: null,258vk_token: null,259marusia_token: null,260yandex_token: null,261y_isAuthUser: false,262app_id: null,263user_id: null,264welcome_text: 'Текст приветствия',265help_text: 'Текст помощи',266intents: [267{268name: WELCOME_INTENT_NAME,269slots: [270'привет',271'здравст'272]273},274{275name: HELP_INTENT_NAME,276slots: [277'помощ',278'что ты умеешь'279]280},281],282utm_text: null283};284
285/**286* Установить dev режим работы приложения. При его активации, в консоли будут отображаться все ошибки и предупреждения.
287* @param isDevMode
288*/
289public static setDevMode(isDevMode: boolean = false): void {290mmApp._isDevMode = isDevMode;291}292
293/**294* Возвращает текущий режим работы приложения
295* @defaultValue false
296*/
297public static get isDevMode(): boolean {298return mmApp._isDevMode;299}300
301/**302* Объединение 2 массивов.
303*
304* @param {object[]} array1 Массив с котором необходимо объединить значение.
305* @param {object[]} array2 Массив для объединения.
306* @return object
307* @api
308*/
309public static arrayMerge(array1: object[], array2?: object[]): object {310if (array2) {311return [...array1, ...array2];312}313return array1;314}315
316/**317* Инициализация конфигурации приложения.
318*
319* @param {IAppConfig} config Пользовательская конфигурация.
320* @api
321*/
322public static setConfig(config: IAppConfig): void {323this.config = {...this.config, ...config};324}325
326/**327* Инициализация параметров приложения.
328*
329* @param {IAppParam} params Пользовательские параметры.
330* @api
331*/
332public static setParams(params: IAppParam): void {333this.params = {...this.params, ...params};334}335
336/**337* Переопределения места, для хранения данных пользователя.
338*
339* @param {boolean} isSaveDb Если true, то данные сохраняются в БД, иначе в файл.
340*/
341public static setIsSaveDb(isSaveDb: boolean = false): void {342this.isSaveDb = isSaveDb;343}344
345/**346* Сохранение данных в файл. В случае если директории не существует, попытается ее создать.
347* @param {IDir} dir Объект с путем и названием файла
348* @param {string} data Сохраняемые данные
349* @param {string} mode Режим записи
350*/
351public static saveData(dir: IDir, data: string, mode?: string): boolean {352if (!isDir(dir.path)) {353mkdir(dir.path);354}355fwrite(`${dir.path}/${dir.fileName}`, data, mode);356return true;357}358
359/**360* Сохранение данных в json файл.
361*
362* @param {string} fileName Название файла.
363* @param {Object|Object[]} data Сохраняемые данные.
364* @return boolean
365* @api
366*/
367public static saveJson(fileName: string, data: any): boolean {368const dir: IDir = {369path: mmApp.config.json || __dirname + '/../../json',370fileName: fileName.replace(/`/g, '')371};372return this.saveData(dir, JSON.stringify(data));373}374
375/**376* Сохранение логов.
377*
378* @param {string} fileName Название файла.
379* @param {string} errorText Текст ошибки.
380* @return boolean
381* @api
382*/
383public static saveLog(fileName: string, errorText: string | null = ''): boolean {384const dir: IDir = {385path: mmApp.config.error_log || __dirname + '/../../logs',386fileName
387};388const msg = `[${Date()}]: ${errorText}\n`;389if (mmApp._isDevMode) {390console.warn(msg);391}392return this.saveData(dir, msg, 'a');393}394}
395