Задать вопрос
@Lynatik001

Telegram бот и «Сценарии» как правильно организовать переход между ними?

У меня на главной странице 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),
.....
]);

и якобы продолжать все это там но хз...

Посоветуйте, что я делаю не так, что сделать лучше, или может я вобще очень сильно злоупотребляю такими понятиями как "сцена"?
  • Вопрос задан
  • 1283 просмотра
Подписаться 2 Сложный Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы