Задать вопрос
  • Как на телеграф js при нажатии на кнопку дать команду боту?

    @Fellow_Fiend
    Не инлайн кнопки не могут возвращать callback_data, и наоборот, инлайновые кнопки не могут возвращать текст.
    Про инлайн кнопки
    Про обычные кнопки

    Поэтому вам нужно изменить тип кнопок в клавиатуре и начать обрабатывать с помощью
    bot.command('command', callback) // вместо command - текст кнопки без /

    либо
    bot.on('text', callback) // и проверять не равно ли ctx.message.text нужному значению

    либо
    const { message } = require('telegraf/filters')
    
    bot.on(message('text'), callback) // рекомендуемая версия предыдущего примера


    Либо вы можете изменить тип клавиатуры на инлайновую и обрабатывать уже callback_data, кодом, который предложил выше StepsOnes
    Ответ написан
    Комментировать
  • Как передать объект от сцены к сцене в telegraf js?

    @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.
    Ответ написан
    Комментировать