telegraf-session-redis
telegraf-session-redis copied to clipboard
Don't changed session's value in redis
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, remove this code
bot.use((ctx, next) => {
ctx.session.__language_code = ctx.session.__language_code || 'en';
next();
});
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 It work for me BUT I encounter with Logic and Unexpected Issue with Telegraf Scene.