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

Почему может быть подобная бага в телеграм боте?

Пишу телеграм бота, и возникла ошибка с выходом из сцены.

При нажатии на /start все отрабатывает хорошо, но если сразу нажать на кнопку из keyboard, то снова выведется стартовое сообщение. При этом при повторном нажатии все отрабатывает хорошо. Так же из кнопкой "Назад", если захочу выйти из сцены до полного завершения сценария.

Стек: Node.js и Telegraf

const getBackKeyboard = () => {
    const backKeyboard = Markup.keyboard([buttons.back]);
    return backKeyboard.resize();
}

const getDefaultKeyboard = () => {
    const defaultKeyboard = Markup.keyboard([
        [buttons.how_buy_toncoin, buttons.wallet]
    ]);
    return defaultKeyboard.resize();
}

const startScene = new WizardScene(
    'START_SCENE',
    async (ctx) => {
        await ctx.replyWithHTML(text.welcome, getDefaultKeyboard());
        return ctx.scene.leave(ctx);
    }
);

const walletScene = new WizardScene(
    'WALLET_SCENE',
    async (ctx) => {
        await ctx.reply(`text.wallet_how_balance`, getBackKeyboard());
        return ctx.wizard.next();
    },
    async (ctx) => {
        const wallet = ctx.message.text;

        await fetchAddressInformation(wallet).then(({ result }) => {
                const balance = (result.balance * 1e-9).toFixed(2);

                ctx.reply(`text.balance`, {parse_mode: 'HTML'});
                return ctx.scene.leave(ctx);
        }).catch(() => {
            ctx.reply(`text.wallet_incorrect`);
            return;
        });
    }
);
walletScene.hears(buttons.back, leave());

const howBuyToncoinScene = new WizardScene(
    'HOW_BUY_TONCOIN_SCENE',
    async (ctx) => {
        await ctx.reply(text.how_buy_toncoin, {
            parse_mode: 'HTML',
            disable_web_page_preview: true
        });
        return ctx.scene.leave();
    }
);

const stage = new Stage([ walletScene, startScene, howBuyToncoinScene ]);

const bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN);
bot.use(session(), stage.middleware());

bot.start(async (ctx) => ctx.scene.enter('START_SCENE'));
bot.hears(buttons.wallet, async (ctx) => ctx.scene.enter('WALLET_SCENE'));
bot.hears(buttons.back, (ctx) => ctx.reply(text.welcome_back, getDafaultKeyboar()));
bot.hears(buttons.how_buy_toncoin, async (ctx) => ctx.scene.enter('HOW_BUY_TONCOIN_SCENE'));
bot.launch();
  • Вопрос задан
  • 222 просмотра
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

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

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