Skip to content
This repository has been archived by the owner on Oct 21, 2023. It is now read-only.

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

Open
alexsmit42 opened this issue Feb 27, 2018 · 3 comments
Open

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

alexsmit42 opened this issue Feb 27, 2018 · 3 comments

Comments

@alexsmit42
Copy link

alexsmit42 commented Feb 27, 2018

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
Copy link

romanlex commented Apr 3, 2018

@alexsmit42, remove this code

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

@killroy192
Copy link

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
Copy link

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants