telegraf / telegraf-session-redis

Redis session middleware for Telegraf
MIT License
50 stars 25 forks source link

Don't changed session's value in redis #12

Open alexsmit42 opened 6 years ago

alexsmit42 commented 6 years ago

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();
romanlex commented 6 years ago

@alexsmit42, remove this code

bot.use((ctx, next) => {
    ctx.session.__language_code = ctx.session.__language_code || 'en';
    next();
});
killroy192 commented 5 years ago

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))
});
devlifeX commented 4 years ago

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