Здравствуйте. Столкнулся с проблемой, если взять два телеграмм аккаунта и начать одновременно посылать запросы, у первого появляется результат, не нажимая и не выбирая и не написал какое-то сообщение. Что-то с сессиями или что-то не так, даже не понимаю, пытался добавить сессии и впустую. Мне нужно сделать так, чтобы каждое сообщение было только у пользователя, который отправляет боту запрос. Баги появляются при create_user
Вот код.
import TelegramApi from "node-telegram-bot-api";
import { PrismaClient } from "@prisma/client";
import questions from "./consts/questions.js";
import { v4 as uuidv4 } from "uuid";
import {
handlerQuestions,
handlerStart,
handlerVerify,
hanlderQuestionChoose,
} from "./handlers.js";
const token = "";
const prisma = new PrismaClient();
const bot = new TelegramApi(token, { polling: true });
const adminButtons = {
reply_markup: JSON.stringify({
inline_keyboard: [
[
{
text: "Создание учетной записи",
callback_data: "create_user",
},
],
[
{
text: "Получить список пользователей",
callback_data: "show_list_users",
},
],
],
}),
};
const organizations = await prisma.organization.findMany({});
const chunkArray = (arr, size) => {
const result = [];
for (let i = 0; i < arr.length; i += size) {
result.push(arr.slice(i, i + size));
}
return result;
};
const arrayOrganizations = organizations.map((org) => ({
text: org.name,
callback_data: `org_${org.id}`,
}));
const createUserSteps = {
organization: {
message: "Выберите организацию:",
options: chunkArray(arrayOrganizations, 3),
},
iin: {
message: "Введите IIN (ИИН) сотрудника:",
nextStep: "username",
},
username: {
message: "Введите логин сотрудника:",
nextStep: "fullname",
},
fullname: {
message: "Введите ваше полное имя:",
},
};
const getRandomInt = (min, max) => {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
let randomNumberString = "";
for (let i = 0; i < 10; i++) {
const randomNumber = getRandomInt(0, 9);
randomNumberString += randomNumber.toString();
}
const start = () => {
bot.setMyCommands([
{ command: "/start", description: "Запуск бота" },
{ command: "/verify", description: "Верификация аккаунта" },
{ command: "/questions", description: "Все вопросы" },
{ command: "/root", description: "Root" },
]);
const userStates = {};
const sessionStore = {};
bot.onText(/\/start/, async (msg) =>
handlerStart(bot, msg, prisma, userStates, sessionStore)
);
bot.onText(/\/questions/, async (msg) =>
handlerQuestions(bot, msg, userStates, sessionStore)
);
bot.on("message", async (msg) => {
const userId = msg.from.id;
const currentState = sessionStore[userId];
if (currentState === "awaiting_question") {
hanlderQuestionChoose(bot, msg, userStates, sessionStore);
}
});
bot.onText(/\/root/, async (msg) => {
bot.sendMessage(msg.chat.id, "Admin panel", adminButtons);
});
bot.onText(/\/verify/, async (msg) =>
handlerVerify(bot, msg, prisma, userStates, sessionStore)
);
bot.on("callback_query", async (msg) => {
const action = msg.data;
if (action === "create_user") {
const chatId = msg.message.chat.id;
const sessionId = uuidv4();
sessionStore[sessionId] = { step: 1, chatId };
await initiateUserCreation(callbackQuery.message, sessionId);
} else if (action == "show_list_users") {
const chatId = msg.message.chat.id;
const sessionId = uuidv4();
sessionStore[msg.from.id] = sessionId;
await bot.sendMessage(chatId, "test");
}
});
async function initiateUserCreation(message, sessionId) {
const sessionData = sessionStore[sessionId];
const chatId = sessionData.chatId;
await bot.sendMessage(chatId, createUserSteps.organization.message, {
reply_markup: JSON.stringify({
inline_keyboard: createUserSteps.organization.options,
}),
});
bot.once("callback_query", async (callbackQuery) => {
const orgId = parseInt(callbackQuery.data.split("_")[1]);
const orgName = organizations.find((org) => org.id === orgId)?.name;
if (!orgName) {
await bot.sendMessage(chatId, "Ошибка: организация не найдена.");
return;
}
await bot.sendMessage(
chatId,
`Вы выбрали организацию: ${orgName}. Теперь введите ваш IIN (ИИН):`
);
await collectIIN(sessionId, orgId);
});
}
async function collectIIN(sessionId, orgId) {
const sessionData = sessionStore[sessionId];
const chatId = sessionData.chatId;
bot.once("message", async (msg) => {
const iin = msg.text;
if (iin.startsWith("/")) {
await bot.sendMessage(
chatId,
"ИИН не может начинаться с символа '/'. Пожалуйста, введите правильный ИИН."
);
await collectIIN(sessionId, orgId);
return;
}
await bot.sendMessage(chatId, createUserSteps.username.message);
await collectUsername(sessionId, iin, orgId);
});
}
async function collectUsername(sessionId, iin, orgId) {
const sessionData = sessionStore[sessionId];
const chatId = sessionData.chatId;
bot.once("message", async (msg) => {
const username = msg.text;
if (username.startsWith("/")) {
await bot.sendMessage(
chatId,
"Логин не может начинаться с символа '/'. Пожалуйста, введите правильный логин."
);
await collectUsername(sessionId, iin, orgId);
return;
}
await bot.sendMessage(chatId, createUserSteps.fullname.message);
await collectFullname(sessionId, iin, username, orgId);
});
}
async function collectFullname(sessionId, iin, username, orgId) {
const sessionData = sessionStore[sessionId];
const chatId = sessionData.chatId;
bot.once("message", async (msg) => {
const fullname = msg.text;
if (fullname.startsWith("/")) {
await bot.sendMessage(
chatId,
"Полное имя не может начинаться с символа '/'. Пожалуйста, введите правильное полное имя."
);
await collectFullname(sessionId, iin, username, orgId);
return;
}
await prisma.user.create({
data: {
iin,
username,
fullname,
uniccode: randomNumberString,
organizationId: orgId,
roleId: 1,
},
});
await bot.sendMessage(chatId, `Вы успешно создали пользователя`);
delete sessionStore[sessionId];
});
}
process.on("SIGINT", async () => {
await prisma.$disconnect();
process.exit(0);
});
};
start();