wingbot
Version:
Enterprise Messaging Bot Conversation Engine
101 lines (84 loc) • 3.06 kB
JavaScript
const { webalize } = require('webalize');
const { ai } = require('../../src/Ai');
const Router = require('../../src/Router');
const { StepState, StepType, getNextStep } = require('../../src/utils/slots');
const { vars } = require('../../src/utils/stateVariables');
/** @typedef {import('../../src/utils/slots').SlotsResolver} SlotsResolver */
/** @typedef {import('../../src/utils/slots').SlotPluginConfig} SlotPluginConfig */
/** @typedef {import('../../src/utils/slots').SlotBotState} SlotBotState */
/** @typedef {import('../../src/utils/slots').SlotState} SlotState */
/**
*
* @param {SlotPluginConfig} params
* @returns {Router<SlotBotState>}
*/
function slotsRegister ({
steps = [],
doneAction,
intents = ''
}) {
const useIntents = intents.split(',')
.map((i) => i.trim());
/** @type {Router<SlotBotState>} */
const bot = new Router();
/** @type {SlotsResolver} */
const handler = async (req, res, postBack) => {
const setEntities = [];
/** @type {SlotState[]} */
const slotState = steps.map((step) => {
const entity = step.entity.replace(/^@/, '');
const entities = req.entities.filter((e) => e.entity === entity)
.map((e) => e.value);
if (entities.length === 0) {
return {
t: step.type,
e: step.entity,
s: step.type === StepType.ADDITIONAL
? StepState.FILLED
: StepState.INITIALIZED
};
}
if (step.type === StepType.MULTI) {
setEntities.push(vars.dialogContext(`+${entity}`, entities, true));
} else {
setEntities.push(vars.dialogContext(step.entity, entities[0], true));
}
return {
t: step.type,
e: step.entity,
s: step.validateAction ? StepState.FILLED : StepState.VALID
};
});
const setStateEntities = {
...Object.fromEntries(
steps.map(({ entity, type }) => (type === StepType.MULTI
? [entity.replace(/^@/, '+'), []]
: [entity, null]))
),
...setEntities.reduce((o, r) => Object.assign(o, r), {})
};
Object.assign(
req.state,
Object.fromEntries(
Object.entries(setStateEntities)
.filter(([k]) => !k.startsWith('_'))
)
);
res.setState({
_slotState: slotState,
_slotSteps: steps.slice(),
_slotDone: doneAction,
...setStateEntities
});
return getNextStep(req, res, postBack);
};
bot.use(ai.global('/', useIntents), handler);
for (const step of steps) {
bot.use(
ai.global(webalize(step.entity), [...useIntents, step.entity]),
handler
);
}
return bot;
}
module.exports = slotsRegister;