universal_bot-ts

Форк
0
394 строки · 14.4 Кб
1
import {fwrite, isDir, mkdir} from './utils/standard/util';
2
import {IDbControllerModel} from './models/interface';
3

4
export interface IDir {
5
    path: string;
6
    fileName: string;
7
}
8

9
/**
10
 * Типы приложений
11
 */
12
export type TAppType = 'alisa' | 'vk' | 'telegram' | 'viber' | 'marusia' | 'user_application' | 'smart_app';
13

14
/**
15
 * Используется Алиса
16
 * @type {string}
17
 */
18
export const T_ALISA: TAppType = 'alisa';
19
/**
20
 * Используется vk бот
21
 * @type {string}
22
 */
23
export const T_VK: TAppType = 'vk';
24
/**
25
 * Используется telegram бот
26
 * @type {string}
27
 */
28
export const T_TELEGRAM: TAppType = 'telegram';
29
/**
30
 * Используется viber бот
31
 * @type {string}
32
 */
33
export const T_VIBER: TAppType = 'viber';
34
/**
35
 * Используется Марус
36
 * @type {string}
37
 */
38
export const T_MARUSIA: TAppType = 'marusia';
39
/**
40
 * Используется Сбер SmartApp
41
 * @type {string}
42
 */
43
export const T_SMARTAPP: TAppType = 'smart_app';
44
/**
45
 * Используется пользовательский тип приложения
46
 * @type {string}
47
 */
48
export const T_USER_APP: TAppType = 'user_application';
49

50
/**
51
 * Название интента для приветствия
52
 * @type {string}
53
 */
54
export const WELCOME_INTENT_NAME = 'welcome';
55
/**
56
 * Название интента для помощи
57
 * @type {string}
58
 */
59
export const HELP_INTENT_NAME = 'help';
60

61
/**
62
 *  Параметры для подключения к Базе Данных
63
 */
64
export interface IAppDB {
65
    /**
66
     * Адрес, по которому находится База Данных
67
     */
68
    host: string;
69
    /**
70
     * Логин для подключения к БД
71
     */
72
    user?: string;
73
    /**
74
     * Пароль для подключения к БД
75
     */
76
    pass?: string;
77
    /**
78
     * Название БД
79
     */
80
    database: string;
81
}
82

83
export interface IAppIntent {
84
    /**
85
     * Название команды. Используется для идентификации команд.
86
     */
87
    name: string;
88
    /**
89
     * Какие слова активируют команду. (Можно использовать регулярные выражения если установлено свойство is_pattern).
90
     */
91
    slots: string[];
92
    /**
93
     * Использовать регулярное выражение или нет. По умолчанию false.
94
     * @defaultValue false
95
     */
96
    is_pattern?: boolean;
97
}
98

99
export interface IAppConfig {
100
    /**
101
     * Директория, в которую будут записываться логи и ошибки выполнения.
102
     */
103
    error_log?: string;
104
    /**
105
     * Директория, в которую будут записываться json файлы.
106
     */
107
    json?: string;
108
    /**
109
     * Настройка подключения к базе данных. Актуально если isSaveDb = true.
110
     */
111
    db?: IAppDB;
112
    /**
113
     * Использование локального хранилища вместо БД. Актуально для приложений, который поддерживают работу с ним. На данный момент, локальное хранилище есть у всех голосовых помощников.
114
     * Важно! Чтобы опция работала, нужно поставить галку "Использовать хранилище данных в навыке" в кабинете разработчика.
115
     */
116
    isLocalStorage?: boolean;
117
}
118

119
export interface IAppParam {
120
    /**
121
     * Viber токен для отправки сообщений, загрузки изображений и звуков.
122
     */
123
    viber_token?: string | null;
124
    /**
125
     * Имя пользователя, от которого будет отправляться сообщение.
126
     */
127
    viber_sender?: string | null;
128
    /**
129
     * Версия api для Viber
130
     */
131
    viber_api_version?: number | null;
132
    /**
133
     * Telegram токен для отправки сообщений, загрузки изображений и звуков.
134
     */
135
    telegram_token?: string | null;
136
    /**
137
     * Версия Vk api. По умолчанию используется v5.103.
138
     * @defaultValue v5.103
139
     */
140
    vk_api_version?: string | null;
141
    /**
142
     * Код для проверки корректности Vk бота. Необходим для подтверждения бота.
143
     */
144
    vk_confirmation_token?: string | null;
145
    /**
146
     * Vk Токен для отправки сообщений, загрузки изображений и звуков.
147
     */
148
    vk_token?: string | null;
149
    /**
150
     * Маруся Токен для загрузки изображений и звуков в навыке.
151
     */
152
    marusia_token?: string | null;
153
    /**
154
     * Яндекс Токен для загрузки изображений и звуков в навыке.
155
     */
156
    yandex_token?: string | null;
157
    /**
158
     * Токен для отправки запросов в Yandex speech kit.
159
     */
160
    yandex_speech_kit_token?: string | null;
161
    /**
162
     * Актуально для Алисы!
163
     * Использовать в качестве идентификатора пользователя Id в поле session.user.
164
     * Если true, то для всех пользователей, которые авторизованы в Яндекс будет использоваться один токен, а не разный.
165
     */
166
    y_isAuthUser?: boolean;
167
    /**
168
     * Идентификатор приложения. Заполняется автоматически.
169
     */
170
    app_id?: string | null;
171
    /**
172
     *Идентификатор пользователя. Заполняется автоматически.
173
     */
174
    user_id?: string | number | null;
175
    /**
176
     * Текст, или массив из текста для приветствия.
177
     */
178
    welcome_text?: string | string[];
179
    /**
180
     * Текст, или массив из текста для  помощи.
181
     */
182
    help_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
     */
203
    intents: IAppIntent[] | null;
204
    /**
205
     * Текст для UTM метки.
206
     * @defaultValue utm_source=Yandex_Alisa&utm_medium=cpc&utm_campaign=phone
207
     */
208
    utm_text?: string | null;
209
}
210

211
/**
212
 * Статический класс, хранящий состояние и параметры приложения.
213
 * @class mmApp
214
 */
215
export class mmApp {
216
    private static _isDevMode: boolean;
217
    /**
218
     * Использование стороннего контроллера для подключения к БД.
219
     * Класс должен быть унаследован от DbControllerModel. Стоит применять в том случае, если используется другая СУБД.
220
     * Если опция не передается, то используется стандартное подключение MongoDb.
221
     * @see DbControllerModel
222
     */
223
    public static userDbController: IDbControllerModel;
224
    /**
225
     * Куда сохраняются пользовательские данные. Если false, то данные сохраняются в файл, иначе в бд. По умолчанию false.
226
     * @defaultValue false
227
     */
228
    public static isSaveDb: boolean = false;
229

230
    /**
231
     * Тип приложения. (Алиса, бот vk|telegram).
232
     */
233
    public static appType: TAppType | null;
234
    /**
235
     * Основная конфигурация приложения.
236
     */
237
    public static config: IAppConfig = {
238
        error_log: '/../../logs',
239
        json: '/../../json',
240
        db: {
241
            host: '',
242
            user: '',
243
            pass: '',
244
            database: ''
245
        },
246
        isLocalStorage: false
247
    };
248
    /**
249
     * Основные параметры приложения.
250
     */
251
    public static params: IAppParam = {
252
        viber_token: null,
253
        viber_sender: null,
254
        viber_api_version: null,
255
        telegram_token: null,
256
        vk_api_version: null,
257
        vk_confirmation_token: null,
258
        vk_token: null,
259
        marusia_token: null,
260
        yandex_token: null,
261
        y_isAuthUser: false,
262
        app_id: null,
263
        user_id: null,
264
        welcome_text: 'Текст приветствия',
265
        help_text: 'Текст помощи',
266
        intents: [
267
            {
268
                name: WELCOME_INTENT_NAME,
269
                slots: [
270
                    'привет',
271
                    'здравст'
272
                ]
273
            },
274
            {
275
                name: HELP_INTENT_NAME,
276
                slots: [
277
                    'помощ',
278
                    'что ты умеешь'
279
                ]
280
            },
281
        ],
282
        utm_text: null
283
    };
284

285
    /**
286
     * Установить dev режим работы приложения. При его активации, в консоли будут отображаться все ошибки и предупреждения.
287
     * @param isDevMode
288
     */
289
    public static setDevMode(isDevMode: boolean = false): void {
290
        mmApp._isDevMode = isDevMode;
291
    }
292

293
    /**
294
     * Возвращает текущий режим работы приложения
295
     * @defaultValue false
296
     */
297
    public static get isDevMode(): boolean {
298
        return mmApp._isDevMode;
299
    }
300

301
    /**
302
     * Объединение 2 массивов.
303
     *
304
     * @param {object[]} array1 Массив с котором необходимо объединить значение.
305
     * @param {object[]} array2 Массив для объединения.
306
     * @return object
307
     * @api
308
     */
309
    public static arrayMerge(array1: object[], array2?: object[]): object {
310
        if (array2) {
311
            return [...array1, ...array2];
312
        }
313
        return array1;
314
    }
315

316
    /**
317
     * Инициализация конфигурации приложения.
318
     *
319
     * @param {IAppConfig} config Пользовательская конфигурация.
320
     * @api
321
     */
322
    public static setConfig(config: IAppConfig): void {
323
        this.config = {...this.config, ...config};
324
    }
325

326
    /**
327
     * Инициализация параметров приложения.
328
     *
329
     * @param {IAppParam} params Пользовательские параметры.
330
     * @api
331
     */
332
    public static setParams(params: IAppParam): void {
333
        this.params = {...this.params, ...params};
334
    }
335

336
    /**
337
     * Переопределения места, для хранения данных пользователя.
338
     *
339
     * @param {boolean} isSaveDb Если true, то данные сохраняются в БД, иначе в файл.
340
     */
341
    public static setIsSaveDb(isSaveDb: boolean = false): void {
342
        this.isSaveDb = isSaveDb;
343
    }
344

345
    /**
346
     * Сохранение данных в файл. В случае если директории не существует, попытается ее создать.
347
     * @param {IDir} dir Объект с путем и названием файла
348
     * @param {string} data Сохраняемые данные
349
     * @param {string} mode Режим записи
350
     */
351
    public static saveData(dir: IDir, data: string, mode?: string): boolean {
352
        if (!isDir(dir.path)) {
353
            mkdir(dir.path);
354
        }
355
        fwrite(`${dir.path}/${dir.fileName}`, data, mode);
356
        return true;
357
    }
358

359
    /**
360
     * Сохранение данных в json файл.
361
     *
362
     * @param {string} fileName Название файла.
363
     * @param {Object|Object[]} data Сохраняемые данные.
364
     * @return boolean
365
     * @api
366
     */
367
    public static saveJson(fileName: string, data: any): boolean {
368
        const dir: IDir = {
369
            path: mmApp.config.json || __dirname + '/../../json',
370
            fileName: fileName.replace(/`/g, '')
371
        };
372
        return 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
     */
383
    public static saveLog(fileName: string, errorText: string | null = ''): boolean {
384
        const dir: IDir = {
385
            path: mmApp.config.error_log || __dirname + '/../../logs',
386
            fileName
387
        };
388
        const msg = `[${Date()}]: ${errorText}\n`;
389
        if (mmApp._isDevMode) {
390
            console.warn(msg);
391
        }
392
        return this.saveData(dir, msg, 'a');
393
    }
394
}
395

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.