fix(bot): issue #142 — language selection on first contact (Products/message in sleep mode)

- keyboard.products in sleep mode: language_set=0 -> language keyboard first, then AI in chosen language
- message handler in sleep mode: same language_set check before AI
- AI context verified: chat_sessions history (max 20) + LANGUAGE_INSTRUCTIONS[lang] in system prompt
- 30 tests pass
This commit is contained in:
NW
2026-08-08 21:07:33 +01:00
parent c17e5f4099
commit 3b9aa5d541
2 changed files with 24 additions and 0 deletions

View File

@@ -15,6 +15,7 @@ import leadService from './services/leadService.js';
import UserService from './services/userService.js'; import UserService from './services/userService.js';
import { resetUserContext } from './utils/messageUtils.js'; import { resetUserContext } from './utils/messageUtils.js';
import { tryAcquireLock, pruneLocks } from './utils/callbackLock.js'; import { tryAcquireLock, pruneLocks } from './utils/callbackLock.js';
import { tForUser, LANGUAGE_NAMES, AVAILABLE_LANGUAGES } from './i18n/index.js';
setInterval(() => { setInterval(() => {
pruneLocks(); pruneLocks();
@@ -65,6 +66,17 @@ if (bot && botAvailable) {
// Если сообщение не обработано роутером и чатбот включён — отправить в ИИ // Если сообщение не обработано роутером и чатбот включён — отправить в ИИ
if (!dispatched && msg.text && await chatbotService.isChatbotEnabled()) { if (!dispatched && msg.text && await chatbotService.isChatbotEnabled()) {
const user = msg.__user || await UserService.getUserByTelegramId(msg.from.id); const user = msg.__user || await UserService.getUserByTelegramId(msg.from.id);
// Первый контакт: сначала выбор языка
if (!user?.language_set) {
const keyboard = {
inline_keyboard: AVAILABLE_LANGUAGES.map(code => [{
text: LANGUAGE_NAMES[code],
callback_data: `set_language_${code}`
}])
};
await bot.sendMessage(msg.chat.id, tForUser('en')('bot.language_select'), { reply_markup: keyboard });
return;
}
const lang = user?.language || 'en'; const lang = user?.language || 'en';
const result = await chatbotService.sendToChatbot({ const result = await chatbotService.sendToChatbot({
sessionId: msg.from.id, sessionId: msg.from.id,

View File

@@ -7,6 +7,7 @@ import { resetUserContext } from '../utils/messageUtils.js';
import chatbotService from '../services/chatbotService.js'; import chatbotService from '../services/chatbotService.js';
import leadService from '../services/leadService.js'; import leadService from '../services/leadService.js';
import UserService from '../services/userService.js'; import UserService from '../services/userService.js';
import { tForUser, LANGUAGE_NAMES, AVAILABLE_LANGUAGES } from '../i18n/index.js';
import userHandler from '../handlers/userHandlers/userHandler.js'; import userHandler from '../handlers/userHandlers/userHandler.js';
import userPurchaseHandler from '../handlers/userHandlers/userPurchaseHandler.js'; import userPurchaseHandler from '../handlers/userHandlers/userPurchaseHandler.js';
@@ -89,6 +90,17 @@ export function registerRoutes() {
// Магазин на паузе — сразу переключаем на ИИ-диалог, убираем меню // Магазин на паузе — сразу переключаем на ИИ-диалог, убираем меню
if (await chatbotService.isSleepMode()) { if (await chatbotService.isSleepMode()) {
const user = msg.__user || await UserService.getUserByTelegramId(msg.from.id); const user = msg.__user || await UserService.getUserByTelegramId(msg.from.id);
// Первый контакт: сначала выбор языка
if (!user?.language_set) {
const keyboard = {
inline_keyboard: AVAILABLE_LANGUAGES.map(code => [{
text: LANGUAGE_NAMES[code],
callback_data: `set_language_${code}`
}])
};
await bot.sendMessage(msg.chat.id, tForUser('en')('bot.language_select'), { reply_markup: keyboard });
return;
}
const lang = user?.language || 'en'; const lang = user?.language || 'en';
const result = await chatbotService.sendToChatbot({ const result = await chatbotService.sendToChatbot({
sessionId: msg.from.id, sessionId: msg.from.id,