Задать вопрос
@neitprogger

Проблемы с telegram bot, а именно с сообщениями, как исправить?

Здравствуйте. Столкнулся с проблемой, если взять два телеграмм аккаунта и начать одновременно посылать запросы, у первого появляется результат, не нажимая и не выбирая и не написал какое-то сообщение. Что-то с сессиями или что-то не так, даже не понимаю, пытался добавить сессии и впустую. Мне нужно сделать так, чтобы каждое сообщение было только у пользователя, который отправляет боту запрос. Баги появляются при 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();
  • Вопрос задан
  • 250 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vkpagevyacheslav
bot.once("message", async (msg) => {const fullname = msg.text;}

Насчет всего, у меня один вопрос по поводу bot.once. Once - ивент, который срабатывает только однажды, когда происходит ивент ещё, то он не вызовет нужный код уже.
То есть, бот принимает только один раз action 'message', когда он ещё раз происходит - бот уже не будет выполнять код. Я бы советовал заменить на bot.on(...)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы