Как игнорировать определённое условие в определённый момент JS

Рейтинг: 0Ответов: 1Опубликовано: 16.08.2023

У меня есть бот, который в случае нахождения определённого сообщения выводит какой-то текст. Появилась проблема, что при команде, которая позволяет сменить тему, сразу же срабатывает условие, что написан текст. Получается так, что при вводе новой темы, бот её записывает и сразу же реагирует, хотя этого быть не должно. Как можно это попробовать исправить?

bot.on('text', (msg) => {

  if (msg.text === require('./data.json')[msg.chat.id] ? .topic) {
    if (msg.chat.id == wait && msg.chat.id == wait2) {

    } else {
      bot.sendMessage(msg.chat.id, 'Вы ввели текст!')
    }
  }

if (msg.text === '/settopic') {
    bot.sendMessage(msg.chat.id, 'Пожалуйста, укажите новую тему 
\nУчтите, что длина темы должна быть больше 15 
символов!')
    wait2.push(msg.chat.id);
}
})
bot.on('message', (msg) => {
if (wait2.includes(msg.chat.id)) {
  if (text.length < 15) {
    bot.sendMessage(id, 'Длина текста не может быть менее 15 символов!')
  } else {
    delete require('./data.json')[msg.chat.id];
    require('./data.json')[id] = {
      name: id,
      follow: true,
      subscribe: false,
      topic: text
    }
    fs.writeFileSync('data.json', JSON.stringify(require('./data.json')));
    bot.sendMessage(msg.chat.id, 'Спасибо, ваша тема сохранена!')
  }
}
})

Ответы

▲ 2Принят

Оба слушателя (message и text) работают одновременно. Вам надо перенести всё в один слушатель и уже там проверять, что если сообщение является командой, то не выполнять основной функционал бота. Как то так:

function executeCommand(message){
  ...
  // Добавляем чат в список чатов, ожидающих тему
  commandArgumentWaiter.push(message.chat.id);
}

function defaultResponse(message){
  ...
}

bot.on('text', (message) => {
  // Если чат с данным id ожидает аргумент
  if (commandArgumentWaiter.includes(message.chat.id)){
    ... // Сохраняем тему
    // Удаляем чат с данным id из списка чатов, ожидающих тему
    commandArgumentWaiter = commandArgumentWaiter.filter((e) => e != message.chat.id)
  } else if (message.text == "/command"){
    executeCommand(message);
  } else {
    defaulResponse(message);
  }
})

Таким образом в случае, если сообщение не является командой, будет выполняться стандартный ответ, иначе настройка бота. А разграничив код на функции вы облегчите его читаемость и модифицируемость