@exetico

Как передать объект от сцены к сцене в telegraf js?

Т.е. например завожу в первой сцене пустой объект, по итогу ответа пользователя добавляю его в объект, при переходе в следующую сцену объект должен так же пересылаться в нее
  • Вопрос задан
  • 962 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Fellow_Fiend
Знаю, что поздно, но отвечу для будущих ботоделов.
Чтобы передавать объекты между handlers Wizard-сцены, в telegraf.js есть объект ctx.wizard.state, куда можно положить любые данные, например так:
Пример ctx.wizard.state

const { Composer, Scenes, Telegraf } = require('telegraf');

const TELEGRAM_BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN;
const bot = new Telegraf(TELEGRAM_BOT_TOKEN);

const first_handler = new Composer();
const second_handler = new Composer();
const exit = new Composer();

first_handler.on('text', async ctx => {
    ctx.wizard.state.name = ctx.message.text;
    await ctx.reply("Отлично, теперь введи свой возраст: ");
    return ctx.wizard.next();
});
second_handler.hears(/[0-9]+/, async ctx => {
    ctx.wizard.state.age = ctx.message.text;
    await ctx.reply('Отлично. Теперь введи свой адрес: ');
    return ctx.wizard.next();
});

exit.on('text', async ctx => {
      ctx.wizard.state.address = ctx.message.text;
      await ctx.reply(
`Твое имя: ${ctx.wizard.state.name}
Твой возраст: ${ctx.wizard.state.age}
Твой адрес: ${ctx.wizard.state.address}`)
      return ctx.scene.leave();
});

const wizard_scene = new Scenes.WizardScene('wizard_scene', first_handler, second_handler, exit);
const stage = new Scenes.Stage([wizard_scene]);
bot.use(session(), stage.middleware());

bot.start(async ctx => {
    await ctx.reply('Привет! Введи свое имя: ');
    return ctx.scene.enter('wizard_scene');
});

bot.launch().then(
  console.log('Bot launched!')
);
// Enable graceful stop
process.once('SIGINT', () => bot.stop('SIGINT'));
process.once('SIGTERM', () => bot.stop('SIGTERM'));



Чтобы передать значение из одной сцены в другую, достаточно вместо ctx.wizard.state написать ctx.state.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SummerWeb Ярославль
от 120 000 до 180 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $