У меня на главной странице index.js при старте уводит на файл Scenegenerator(там розмещены сцены)
const currScene = new SceneGenerator();
const mainMenuScene = currScene.mainMenu(Usrmenu);
const entryMenuScene = currScene.entryMenu(arrayOfLabel);
const bot = new Telegraf(config.tgToken);
const stage = new Stage([
mainMenuScene,
entryMenuScene,
currScene.controlPanel(Botmenu, usrPanelKeyboard),
]);
bot.use(session());
bot.use(stage.middleware());
bot.command('mainMenu', (ctx) => ctx.scene.enter('mainMenu'));
bot.launch();
bot.start(async (ctx) => {
user1.checkAddUser(ctx.from);
ctx.scene.enter('entryMenu');
});
А далее в сценариях обрабатывать переходы по всяким менюшкам. Сказано - сделано.
Сделал вроде как логично. но у меня переход с одной менюшки в другой - это переход из одной сцены в другую.
Когда подумал что сама сцена - личного кабинета - как и другие такие же многофункциональные будут занимать кучу места, и соотвецтвенно в одном файле это уже грех хранить. нужно делить сделать файл сцены - личного кабинета - что будет иметь в себе, все сцены относящися именно к ЛК. Трабла встала в том что либа Telegraf вобще не блещет документацией и примерами.
Вот сцена в Scenegenerator, в которой переход к сцене в другом файле.
controlPanel(Botmenu, usrPanelKeyboard) {
const controlPanelScene = new Scene('controlPanel');
const BS = new BotScene();
const Botscene = new Stage([BS.controlPanelCurrBot(usrPanelKeyboard)]);
controlPanelScene.use(Botscene.middleware());
// controlPanelScene.use(() => new Stage([BotScene.mainMenu()]).middleware());
controlPanelScene.enter(async (ctx) => {
await ctx.reply(`this :\n${ctx.from.first_name} (@${ctx.from.username})`, Botmenu);
});
controlPanelScene.leave((ctx) => ctx.reply('Bye'));
// controlPanelScene.action('controlbot', (ctx) => controlPanelScene.scene.enter('BotScene'));
controlPanelScene.action('controlbot', (ctx) => ctx.scene.enter('controlCurrBot'));
controlPanelScene.on('message', (ctx) => ctx.scene.reenter());
return controlPanelScene;
}
вот нужная сцена в другом файле. при переходе на эту сцену выводится лишь controlPanelScene.enter(...) - с выводов текста и клавиатуры. но далее сцена заканчивается? она не отрабатывает не controlPanelScene.leave((ctx) => ctx.reply('Bye')); не controlPanelScene.on('message', async (ctx) => ctx.reply('dialog not out'));
Она вобще как кончается. и теперь можно /start обратится к изначальной сцене. Подскажите что за баг. как вызывать предыдущие сцены(что находятся в других файлах) - выходит не переопределяя controlPanelScene.use(Botscene.middleware()); - ибо мне кажется доля вины лежит на переопределении этого.
controlPanelCurrBot(usrPanelKeyboard) {
const controlPanelScene = new Scene('controlCurrBot');
const dialog = ` №1 /change_img`;
controlPanelScene.enter(async (ctx) => {
await ctx.reply(dialog, usrPanelKeyboard);
});
controlPanelScene.leave((ctx) => ctx.reply('Bye'));
controlPanelScene.on('message', async (ctx) => ctx.reply('dialog not out'));
return controlPanelScene;
}
Я конечно могу добавлять все сцены в изначальный файл.
const stage = new Stage([
mainMenuScene,
entryMenuScene,
currScene.controlPanel(Botmenu, usrPanelKeyboard),
.....
]);
и якобы продолжать все это там но хз...
Посоветуйте, что я делаю не так, что сделать лучше, или может я вобще очень сильно злоупотребляю такими понятиями как "сцена"?