vvlad1973-telegram-framework
Version:
Current version: *7.9.5*
123 lines (101 loc) • 4.1 kB
JavaScript
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 - строка
);
}