wingbot
Version:
Enterprise Messaging Bot Conversation Engine
75 lines (60 loc) • 2.38 kB
JavaScript
const { compileWithState } = require('../../src/utils');
const { StepState, getNextStep, StepType } = require('../../src/utils/slots');
const { vars } = require('../../src/utils/stateVariables');
/** @typedef {import('../../src/Router').Resolver} Resolver */
/** @typedef {import('../../src/Responder')} Responder */
/** @typedef {import('../../src/utils/slots').SlotBotState} SlotBotState */
/** @typedef {import('../../src/utils/slots').SlotsResolver} SlotsResolver */
/** @typedef {import('../../src/utils/slots').SlotsRequest} SlotsRequest */
/**
* @param {object} params
* @param {string} [params.skip]
* @param {string} [params.fill]
* @returns {SlotsResolver}
*/
function slotsContinue ({
skip,
fill
}) {
/**
* @param {SlotsRequest} req
* @param {Responder} res
* @param {Function} postBack
* @returns {Promise}
*/
async function slotsContinuePlugin (req, res, postBack) {
const state = { ...req.state, ...res.newState };
const { _slotStep: step } = state;
let { _slotState: slotState } = state;
if (!step || !slotState) {
const msg = 'ERROR: slot filling was not initialized (use the "continue" plugin after the "initialize")';
res.text(msg);
throw new Error(msg);
}
const skipEntities = compileWithState(req, res, skip)
.split(',')
.map((e) => e.trim());
const fillEntities = compileWithState(req, res, fill)
.split(',')
.map((e) => e.trim());
const clear = {};
slotState = slotState.map((s) => {
if (skipEntities.includes(s.e)) {
if (s.t === StepType.MULTI) {
const entity = step.entity.replace(/^@/, '+');
Object.assign(clear, vars.dialogContext(entity, [], true));
} else {
Object.assign(clear, vars.dialogContext(s.e, null, true));
}
return { ...s, s: StepState.INITIALIZED };
}
return s.e === step.entity || fillEntities.includes(s.e)
? { ...s, s: StepState.FILLED }
: s;
});
res.setState({ ...clear, _slotState: slotState });
return getNextStep(req, res, postBack);
}
return slotsContinuePlugin;
}
module.exports = slotsContinue;