Я хотел бы попросить пользователя подтвердить, прежде чем фактически отменить все диалоги. В текущем примере кода диалоги отменяются, как только пользователь вводит отмену или выход. Любые предложения, как это сделать?
async interrupt(innerDc) {
if (innerDc.context.activity.text) {
const text = innerDc.context.activity.text.toLowerCase();
switch (text) {
case 'help':
case '?': {
const helpMessageText = 'Show help here';
await innerDc.context.sendActivity(helpMessageText, helpMessageText, InputHints.ExpectingInput);
return { status: DialogTurnStatus.waiting };
}
case 'cancel':
case 'quit': {
const cancelMessageText = 'Cancelling...';
await innerDc.context.sendActivity(cancelMessageText, cancelMessageText, InputHints.IgnoringInput);
return await innerDc.cancelAllDialogs();
}
}
}
}
}
Где мои манеры. Добавлена ссылка на образец основного бота.
Глядя на пример Core Bot, вы можете видеть, что CancelAndHelpDialog
— это диалог компонента, что означает, что у него есть собственный набор диалогов, к которому мы можем добавлять диалоги. В вашем случае вам понадобится запрос подтверждения и диалоговое окно водопада. Вы можете использовать BookingDialog в качестве руководства по реализации этого, потому что он расширяет CancelAndHelpDialog
и, следовательно, расширяет ComponentDialog
.
Вы можете видеть, что BookingDialog
добавляет внутренние диалоги к набору диалогов в своем конструкторе:
constructor(id) { super(id || 'bookingDialog'); this.addDialog(new TextPrompt(TEXT_PROMPT)) .addDialog(new ConfirmPrompt(CONFIRM_PROMPT)) .addDialog(new DateResolverDialog(DATE_RESOLVER_DIALOG)) .addDialog(new WaterfallDialog(WATERFALL_DIALOG, [ this.destinationStep.bind(this), this.originStep.bind(this), this.travelDateStep.bind(this), this.confirmStep.bind(this), this.finalStep.bind(this) ])); this.initialDialogId = WATERFALL_DIALOG; }
Если вы хотите добавить диалоги в набор диалогов в базовом классе CancelAndHelpDialog
, вы должны определить для этого конструктор:
constructor(id) {
super(id);
this.addDialog(new ConfirmPrompt(CANCELLATION_CONFIRMATION))
.addDialog(new WaterfallDialog(CANCELLATION_WATERFALL, [
async stepContext => await stepContext.prompt(CANCELLATION_CONFIRMATION, 'Are you sure you want to cancel?'),
async stepContext => {
if (stepContext.result) {
const cancelMessageText = 'Cancelling...';
await stepContext.context.sendActivity(cancelMessageText, cancelMessageText, InputHints.IgnoringInput);
return await stepContext.cancelAllDialogs();
}
return stepContext.endDialog();
},
]));
}
Обратите внимание, что, поскольку CancelAndHelpDialog
предназначен для использования в качестве базового класса, он будет делиться своим набором диалогов с любым классом, который его расширяет. Это означает, что вам нужно убедиться, что нет никаких идентификаторов диалога, которые он имеет вместе с классами, которые его расширяют. Например, вы можете видеть, что BookingDialog
уже использует идентификаторы 'confirmPrompt'
и 'waterfallDialog'
:
const CONFIRM_PROMPT = 'confirmPrompt'; const DATE_RESOLVER_DIALOG = 'dateResolverDialog'; const TEXT_PROMPT = 'textPrompt'; const WATERFALL_DIALOG = 'waterfallDialog';
Это означает, что вы не можете использовать эти строки в качестве идентификатора для запроса подтверждения и диалогового окна водопада, которые вы создаете в CancelAndHelpDialog
. Вот строки, которые я использую вместо этого:
const CANCELLATION_CONFIRMATION = 'cancellationConfirmation';
const CANCELLATION_WATERFALL = 'cancellationWaterfall';
Также обратите внимание, что я использую анонимные стрелочные функции в качестве каскадных шагов, но если вы хотите использовать именованные функции, такие как BookingDialog
, вам нужно придумать имена функций, которые не конфликтуют с функциями в классах, которые расширяют CancelAndHelpDialog
, как и в случае с идентификаторами диалогов. Так, например, поскольку BookingDialog
содержит функцию с именем confirmStep
, вы не должны использовать это имя в качестве имени вашей функции, которая вызывает запрос подтверждения в CancelAndHelpDialog
.
Вы можете заметить, что второй шаг в определенном мной диалоговом окне водопада содержит код, который почти идентичен второму варианту переключения в функции interrupt
:
const cancelMessageText = 'Cancelling...'; await innerDc.context.sendActivity(cancelMessageText, cancelMessageText, InputHints.IgnoringInput); return await innerDc.cancelAllDialogs();
Вам нужно заменить этот код в функции interrupt
кодом, который вызывает ваш водопадный диалог:
return await innerDc.beginDialog(CANCELLATION_WATERFALL);
спасибо Кайл. Сначала я протестировал его на образце corebot. После изменения «if (stepContext.result.value)» на «if (stepContext.result)» это сработало как шарм. Если это имеет смысл, пожалуйста, отрегулируйте, и я приму ответ. Я также заставил его работать в моем собственном проекте. Ваши замечания о том, что идентификатор диалогового окна должен быть уникальным, объяснили сообщения об ошибках, которые я получил с моим собственным конструктором.
Я пропустил, что prompt.ts уже извлекает значение из результата распознавателя приглашений.
Можете ли вы дать ссылку на образец, на который вы ссылаетесь?