telegraf-session-redis icon indicating copy to clipboard operation
telegraf-session-redis copied to clipboard

Don't changed session's value in redis

Open alexsmit42 opened this issue 7 years ago • 3 comments
trafficstars

Hello! I have problem with session-redis and i18n (actually problem exist and without i18n). I wish change language when user choosed. But overwriting session's value don't working. Overwriting works inside bot.use(), but not in bot.on('callback_query').

Thanks for help!

let Telegraf = require('telegraf');
let TelegrafI18n = require('telegraf-i18n');
let RedisSession = require('telegraf-session-redis');

const Markup = require('telegraf/markup');

let config = require('config');
let path = require('path');
let utils = require('./utils');

let bot = new Telegraf(config.get('token'));

const i18n = new TelegrafI18n({
    defaultLanguage: 'en',
    useSession: true,
    directory: path.resolve(__dirname, 'locales')
});

const session = new RedisSession({
    store: {
        host: config.get('redis.host'),
        port: config.get('redis.port'),
        db: config.get('redis.db')
    }
});

bot.use(session.middleware());
bot.use(i18n.middleware());

bot.use((ctx, next) => {
    ctx.session.__language_code = ctx.session.__language_code || 'en';
    next();
});

bot.start((ctx) => {
    const message = ctx.i18n.t('main.hello');
    return ctx.reply(message);
});

bot.command('language', (ctx) => {
    return ctx.reply(ctx.i18n.t('language.choose'),
        Markup.inlineKeyboard([
            Markup.callbackButton(ctx.i18n.t('language.en'), JSON.stringify({language: 'en'})),
            Markup.callbackButton(ctx.i18n.t('language.ru'), JSON.stringify({language: 'ru'}))
        ]).extra()
    );
});

bot.on('callback_query', (ctx) => {
    let data = false;
    try {
        data = JSON.parse(ctx.update.callback_query.data);
    } catch (err) {
        console.log(err);
    }

    let message = '';
    if (data.language !== undefined) {
        let newLanguage = data.language;
        ctx.i18n.locale(newLanguage);
        ctx.session.__language_code = newLanguage; // problem here: not overwrited variable in redis

        message = ctx.i18n.t('language.changed'); 
    }

    return ctx.replyWithMarkdown(message);
});

bot.startPolling();

alexsmit42 avatar Feb 27 '18 09:02 alexsmit42

@alexsmit42, remove this code

bot.use((ctx, next) => {
    ctx.session.__language_code = ctx.session.__language_code || 'en';
    next();
});

romanlex avatar Apr 03 '18 10:04 romanlex

Have the same issue. I've debugged this module and noticed that saveSession method called only once and before other middlewares call they "next" callbacks. In your case, you should add one more middleware such as:

bot.use((ctx, next) => {
    next().then(() => session.saveSession(session.options.getSessionKey(ctx), ctx.session))
});

killroy192 avatar Feb 01 '19 11:02 killroy192

@killroy192 It work for me BUT I encounter with Logic and Unexpected Issue with Telegraf Scene.

devlifeX avatar May 31 '20 04:05 devlifeX