Closed fletcherist closed 6 years ago
Первая реализация confirm - https://github.com/popstas/yandex-dialogs-whatis/commit/490164ad666c8eb4b529bc51ec44bf30ca484c37
Это мидлварь + простой матчер + команда. Мидлварь создает функцию confirm, при вызове пишет флаг в сессию. Матчер проверяет сессию, если там есть данные { onYes, onNo }, вызывает соответствующее действие.
Какие я вижу проблемы:
--force
. Теоретически решение может быть таким: сделать мидлварь, которая будет искать такие маркеры, убирать их из ctx.message (чтобы разработчик не делал две alice.command) и ставить флаг, например ctx.session.confirmForce. Стремно в этом случае то, что подобное вырезание может легко сломать команды так, что разработчик долго будет искать проблему, например, он может сделать команду типа "отмерь точно", которая никогда не сработает (он же не должен по идее даже знать про эту магию). Поэтому эту крутую фичу если и делать, то опциональной мидлварью (а если надо переопределить слова, то проще ее скопипастить себе, она маленькая будет).Итого: думаю команда будет выглядеть примерно так:
ctx.confirm(questionMiddleware, yesMiddleware, noMiddleware, options)
options:
{
yesMatcher: ctx => ctx.message === 'да',
noMatcher: ctx => ctx.message === 'нет',
anyMiddleware: ctx => ctx.reply('ответь'),
}
Или ты думаешь, что лучше всё в options засунуть? Я вынес три мидлвари, т.к. предполагаю, что почти всегда будут использовать их и очень редко то, что в options.
Такой подход, по-моему, довольно красиво вписывается в концепции sdk, матчеры yes/no думаю пригодятся разработчикам сами по себе в других местах.
На disposable думаю забить пока, пусть функции в ctx.session лежат. Другой вариант, который я сначала обдумывал: хранить в yes и no ответ строкой, а потом внутренне проговаривать его навыку, но так вроде сейчас не сделать, да и сомнительный это способ, тогда придется делать разные alice.command на подтверждение и на действие.
Итак, если нет возражений, давай попробую сделать PR с решенными 3 и 4, с нерешенными 1 и 2.
Что насчет опциональных подтверждений, есть идеи, как их реализовать? Проблема в том, что на yes/no должны быть даны ответы, а вот на any надо возвращаться к command.search(), как бы это сделать? К этому времени матчер уже сработал, и надо почистить ctx.session.confirm и сделать вид, что подтверждения не было, снова найти подходящую команду.
Close, out of date. Feel free to reopen this, if you want to suggest something.
@popstas предложил реализовать что-то вроде такого метода
Реализовать можно в качестве middleware. Давайте обсуждать!