Code Monkey home page Code Monkey logo

Comments (7)

popstas avatar popstas commented on June 2, 2024

Да, согласен, пока этого нет, я программно меняю сцену так:

ctx.session.setData('currentScene', null);

from yandex-dialogs-sdk.

fletcherist avatar fletcherist commented on June 2, 2024

@alexander-karpov А как ты думаешь, как было бы удобнее менять сцену?
1 - как ты предложил, но тогда если у тебя сцены в разных файлах, то тебе надо одну в другую импортировать, чтобы заходить.
2 - а можно по названию при инициализации

alice.command('Алиса, пойдём в бар!', ctx => {
    if (ctx.profile.age < 18) {
        ctx.reply('Давайте лучше в кино.');
    } else {
        ctx.reply('Пойдёмте.');
        ctx.changeScene('in-the-bar');
        ctx.switchScene('in-the-bar'); // maybe better naming
    }
});

from yandex-dialogs-sdk.

popstas avatar popstas commented on June 2, 2024

Еще хорошо бы сразу подумать о том, что в будущем могут появиться множественные активные сцены (когда сцена вызвана из сцены).

Мне кажется, что переключение сцены надо делать через события.

Я же правильно понимаю, что переключение сцен хорошо ложится на паттерн State Machine?
Я сейчас прочитал это - https://ru.hexlet.io/courses/js-abp/lessons/state_machine_pattern/theory_unit, после чего подумал про события.

В моем представлении сцены похожи на экраны мобильного приложения. Например, заказ пиццы имел бы экраны:

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

То же самое я бы сделал в навыке, 3 сцены (главный экран - когда без сцены).

Сцена внутри сцены тут может быть такая: модальное окно с подтверждением отправки заказа в приложении и ctx.confirm() в навыке. То есть вложенные сцены в моем представлении похожи на модальные попапы на сайте, они дают выбрать из одного или нескольких вариантов и пока это не будет сделано, не дают сделать ничего другого.
При таком раскладе (если больше 2 сцен не будет) может это и не вложенная сцена совсем, а просто отдельным полем завести ctx.session.data.currentModalScene.
Я могу представить, когда нужна вложенность больше:

  • если модальное действие вызывает другое модальное действие, в gui такое часто бывает:
    image
  • в играх, наверное можно использовать сцены как экраны в голосовом квесте, внутри экрана может быть еще несколько сцен с диалогами с разными персонажами экрана

Вопрос в том, насколько глубоко возможно погружать пользователя в голосовом интерфейсе.

А вам какие сценарии приходят в голову, где нужны вложенные сцены?

from yandex-dialogs-sdk.

alexander-karpov avatar alexander-karpov commented on June 2, 2024

@popstas Наверняка в сложных навыках понадобится вложенность и возможность переходить на предыдущий экран. Мое предложение - начать пока просто с возможности произвольно переключать сцены (хотя возможно потом это будет сложнее расширить).

@fletcherist Мне кажется лучше все же передавать ссылку на сцену - надежнее (рефакторить проще, труднее случайно сломать). Переключение можно сделать например вызовами

const inBar = new Scene();

alice.command('Алиса, пойдём в бар', ctx => {
    ctx.enterScene(inBar); // change, switch
    return 'Пойдёмте.';
});

inBar.command('Алиса, пойдём домой', ctx => {
    ctx.enterScene(alice); // или ctx.leaveScene()
    return 'Возвращаюсь.';
});

Кстати, как насчет отделить alice как сервер и alice как сцену?

from yandex-dialogs-sdk.

fletcherist avatar fletcherist commented on June 2, 2024

Взял на себя

from yandex-dialogs-sdk.

fletcherist avatar fletcherist commented on June 2, 2024

@popstas стейт-машины — это прикольно, но мне кажется, пускай разработчики сами их пишут. Мы дадим им апи перехода из сцены в сцену. А дальше пускай они сами разруливают, куда и из какого состояния можно переходить

from yandex-dialogs-sdk.

fletcherist avatar fletcherist commented on June 2, 2024

Сделано в PR #65

Теперь можно писать так:

const inBar = new Scene('in-bar');
alice.command('Алиса, пойдём в бар', ctx => {
    ctx.enterScene(inBar); // change, switch
    return 'Пойдёмте.';
});

inBar.command('Алиса, пойдём домой', ctx => {
    ctx.leaveScene()
    return 'Возвращаюсь.';
});

С таким же успехом можно прыгать из одной сцены в другую.
ctx.leaveScene() всегда возвращает на главный диалог

from yandex-dialogs-sdk.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.