UNPKG

vvlad1973-telegram-framework

Version:
123 lines (101 loc) 4.1 kB
export class Scenario { actions = {}; context = {}; script = []; sender; filler; logger; stackCounter = 0; constructor(logger) { this.logger = logger ?? new SimpleLogger(); } #logEntry(functionName) { functionName = functionName ?? getCallerName(); this.logger.trace(`Function ${functionName}() execution...`); } #logExit(functionName) { functionName = functionName ?? getCallerName(); this.logger.trace(`Function ${functionName}() complete`); } async doAction(data, request, user, context, self) {} async process(request, user, context) { this.#logEntry(); const self = this; // Если user — строка, преобразуем в объект с id if (typeof user === 'string') user = { id: user }; // Обрабатываем промисы для role, state и substate const role = user.role instanceof Promise ? await user.role : user.role; const state = user.state instanceof Promise ? await user.state : user.state; const substate = user.substate instanceof Promise ? await user.substate : user.substate; const { chat, type, contents, params, chat_type, object } = request; let isDialogFound = false; // Логируем начало поиска this.logger.info(`[userId=%s] Searching dialog...`, user?.id); this.logger.debug( { role: role, state: state, substate: substate, type: type, contents: contents, params: params, chat: chat, object: object, chat_type: chat_type, }, `[userId=${user?.id}] Searching dialog criterias:` ); // Поиск подходящего диалога for (const item of this.script) { if (checkDialog(request, user, item)) { isDialogFound = true; // Логируем, если диалог найден this.logger.info( `[userId=${user?.id}] Found dialog _id=[${item._id}]. Executing...` ); this.logger.debug( item.actions, `[userId=${user?.id}] Dialog _id=[${item._id}] contents:` ); try { await this.doAction(item.actions, request, user, context, self); } catch (error) { self.logger.error(error); } this.logger.info( `[userId=${user?.id}] Dialog _id=[${item._id}] finished` ); break; } } // Логируем, если диалог не найден if (!isDialogFound) this.logger.info(`[userId=${user?.id}] Dialog not found. Done`); this.#logExit('Scenario.process'); } } function matchCondition(value, pattern) { if (typeof pattern !== 'string') return true; // Если pattern не задан, любое значение подходит const strValue = value == null ? '' : String(value); return Boolean(strValue.match(new RegExp(pattern, 'i'))); } async function checkDialog(request, user = {}, dialogItem) { if (!dialogItem) return false; // Если dialogItem отсутствует, условия не выполняются const role = user.role instanceof Promise ? await user.role : user.role; const state = user.state instanceof Promise ? await user.state : user.state; const substate = user.substate instanceof Promise ? await user.substate : user.substate; const { chat, type, contents, params, chat_type } = request; return ( matchCondition(state, dialogItem.state) && matchCondition(substate, dialogItem.substate) && matchCondition(role, dialogItem.role) && matchCondition(type, dialogItem.received?.type) && matchCondition(contents, dialogItem.received?.text) && matchCondition(params, dialogItem.received?.params) && matchCondition(chat, dialogItem.chat) && matchCondition(chat_type, dialogItem.chat_type) && matchCondition(user?.id ?? '', dialogItem.user) // Гарантируем, что user.id - строка ); }