Как работают stage и Scene в telegraf.js?

421
15 ноября 2020, 22:20

Подскажите пожалуйста. 
Что я хочу сделать, следующий сценарий.


  1. Пользователь нажимает на кнопку “/start”. Активируется сцена - welcomeScene
  2. Пользователь выбирает одну из ролей отображаемых в кастомной клавиатуре ( пассажир/водитель)
В зависимости от выбранной роли, происходит инициализация сцены ( либо passengerScene, либо либо driverScene)
  3. После “обработки” выбранной сцены, пользователь возвращается обратно на главную сцену т.е. WelcomeScene
 В сценах passagerScene и driverScene будет происходит сбор информации для составления маршрута. 

Как будут этим пользоваться люди?
Если пользователю необходимо доехать от точки А до точки Б, то он пишет об этом боту, бот в свою очередь переправит сообщение в общую группу для водителей. 

Помогите пожалуйста, направьте меня пусть истинный. 
Я понимаю, что не совсем понимаю как работать со сцена и со стейджем в telegraf.js

driverScene.js

const WizardScene = require('telegraf/scenes/wizard'); 
const Scene = require('telegraf/scenes/base'); 
const Markup = require('telegraf/markup'); 
const Stage = require('telegraf/stage'); 
const {enter , leave} = Stage; 
 
const driverScene = new  WizardScene ( 
    'driver', 
    (ctx) => { 
        let keyboard_buttons = Markup.keyboard(['Я водитель']).oneTime().resize().extra(); 
        ctx.reply('Кто вы?', keyboard_buttons); 
        return ctx.wizard.next(); 
    }, 
    (ctx) => { 
        ctx.wizard.state.role = ctx.message.text; 
        ctx.reply(`Я ${ctx.wizard.state.role}`); 
        return leave(); 
         
    }); 
module.exports = driverScene ;

passagerScene.js

const WizardScene = require('telegraf/scenes/wizard'); 
const Markup = require('telegraf/markup'); 
const {enter} = require('telegraf/stage'); 
 
const passagerScene = new  WizardScene ( 
    'passager', 
    (ctx) => { 
        let keyboard_buttons = Markup.keyboard(['Я пассажир']).oneTime().resize().extra(); 
        ctx.reply('Кто вы ?', keyboard_buttons); 
        return ctx.wizard.next(); 
    }, 
    (ctx) => { 
        ctx.wizard.state.role = ctx.message.text; 
        ctx.reply(`Вы ${ctx.wizard.state.role}`); 
        return ctx.scene.leave(); 
         
    }); 
module.exports = passagerScene ;

welcomeScene.js

const WizardScene = require('telegraf/scenes/wizard'); 
const Markup = require('telegraf/markup'); 
const {leave} = require('telegraf/stage'); 
 
const welcomeSetting = new  WizardScene ( 
    'welcome', 
    (ctx) => { 
        let keyboard_buttons = Markup.keyboard(['Водитель'],['Пассажир']).oneTime().resize().extra(); 
        ctx.reply('welcome!', keyboard_buttons); 
        return ctx.wizard.next(); 
    }, 
    (ctx) => { 
        ctx.reply(`leave main scene`); 
        return leave(); 
         
    }); 
module.exports = welcomeSetting ;

index.js

const Telegraf = require('telegraf'); 
const session = require('telegraf/session'); 
const Stage = require('telegraf/stage'); 
const { enter , leave} = Stage; 
 
const passagerScene = require('./controllers/passager'); 
const driverScene = require('./controllers/driver'); 
const welcomeScene = require('./controllers/welcome'); 
 
const stage = new Stage([passagerScene,driverScene,welcomeScene]); 
 
 
const bot = new Telegraf('TOKEN'); 
 
bot.use(Telegraf.log()); 
bot.use(session()); 
bot.use(stage.middleware()); 
bot.hears('order',(ctx) => enter('order')); 
bot.hears('setting',(ctx) => enter('setting')); 
 
bot.launch()

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

READ ALSO
Преобразование массив в дерево js

Преобразование массив в дерево js

Есть массив данных, который необходимо преобразовать в дерево:

162
Bitfinex API websocket

Bitfinex API websocket

Пытаюсь вывести орред бук через вебсокеты битфинекса, но в консоли получаю ошибку

190
Скрытие элементов списка

Скрытие элементов списка

Подскажите пожалуйста как реализовать такую возможность: Чтобы когда нажималась кнопка Войти в комнату, уже открытая комната закрывалась?...

186
Как буквально перевести Class.prototype = Object.prototype

Как буквально перевести Class.prototype = Object.prototype

интересуют два меленьких вопроса, которые не хочется расписывать в двух разных вопросах!

189