IntentDialog соответствует только один раз при запуске в среде бота

У меня есть простой фрагмент кода, в котором я хочу запустить операцию первого запуска в начале и позволить диалоговому окну по умолчанию обрабатывать все остальное. В коде ниже.

bot.dialog('/firstRun', [firstRun1])
function firstRun1(session) {
    session.replaceDialog('/')
}

bot.dialog('/', new builder.IntentDialog()
    .matches(/wishlist/, '/wishlist')
    .matches(/exclusive/, '/exclusive')
    .onDefault('/runCampaign')
)
bot.dialog('/wishlist', (session, args) => {
    session.endDialog('Add to wishlist')
})

bot.dialog('/exclusive', (session, args) => {
    session.endDialog('Exclusive')
})

bot.dialog('/runCampaign', [runCampaign1])

function runCampaign1(session) {
    session.send('default')
}

Моя проблема прямо здесь. Когда человек вводит эксклюзив, я полагаю, что диалоговое окно по умолчанию будет запускать свои совпадения и в идеале должно запускать эксклюзив независимо от того, сколько раз, но по какой-то причине этого не происходит, как показано на снимке экрана ниже. Как только человек вводит эксклюзив или список желаний в начале, он всегда запускает значение по умолчанию внизу, как я могу это исправить. Также как обмениваться данными между различными предложениями соответствия в IntentDialog, скажем, я хочу иметь некоторую переменную session.dialogData.name для совпадений и по умолчанию введите здесь описание изображения ОБНОВЛЕНИЕ 1 Вместо говоря, что session.endDialog внутри двух областей в моем коде выше, я просто написал session.send() без завершения каких-либо диалогов, и теперь ничего не происходит, когда я набираю эксклюзив или список желаний. Я что-то упускаю? введите здесь описание изображения


person PirateApp    schedule 14.02.2017    source источник


Ответы (1)


Вы всегда должны вызывать session.endDialog, если хотите вернуться к вызывающему (предыдущему) диалогу.

В вашем первом примере:

|current dialog|user input|next dialog|
|first run     |go        | /         |
| /            |whishlist | /         |
| /            |freak     |runCampaign|
|runCampaign   |<any>     |runCampaign|

поскольку вы не вызывали session.endDialog в диалоговом окне runCampaign, вы всегда будете в нем, и при любом вводе пользователем будет напечатано «по умолчанию».

Во втором примере вы пропустили ввод «список желаний», поэтому сразу попали в диалоговое окно runCampaign. Итак, вы изменения на send там не назвали. Но если бы вы набрали «whislist», как в первом примере, перед «freak», вы бы попали в wishlist и всегда печатали бы «Добавлено в список желаний» при любом вводе.

person Sergey L    schedule 14.02.2017
comment
но я думал, что мы не должны закрывать диалоговое окно по умолчанию. Ничего, если мы закроем его? - person PirateApp; 15.02.2017
comment
На самом деле вы не завершаете диалоговое окно по умолчанию, вы завершаете диалоговое окно runCampaign, которое вызывается из onDefault из корневого диалогового окна. Корневой диалог все еще работает. - person Sergey L; 15.02.2017
comment
любые идеи по поводу этой части вопроса. Также как обмениваться данными между различными предложениями соответствия в IntentDialog :) - person PirateApp; 15.02.2017
comment
Поскольку вы начали новые диалоги в диалоге намерений, вы не можете использовать session.dialogData. Но вы можете использовать session.privateConversationData, который хранит данные для этого диалога пользователя. - person Sergey L; 15.02.2017