@itwaze
Web Developer

Как правильно обрабатывать события в node-telegram-bot-api?

Сразу код:

import TelegramBot from 'node-telegram-bot-api';

const bot = new TelegramBot('123456789', { polling: true });

bot.onText(/\/start/, function (msg) {
  
  let startMessage = 'Приветствие';

  let keyboard = {
      reply_markup: {
        inline_keyboard: [
          [
            {
              text: 'Создать напоминание',
              callback_data: 'newNote'
            },
            {
              text: 'Мои напоминание',
              callback_data: 'myNotes'
            }
          ]
        ]
      }
  };

  bot.sendMessage(msg.chat.id, startMessage, keyboard);

});

bot.on('callback_query', (query) => {
  
  let id = query.message.chat.id;

  switch (query.data) {
    case 'newNote':
      bot.sendMessage(id, 'Введите напомнинание');
      
      bot.on('message', (msg) => {
        bot.sendMessage(id, `Ок, напомню ${msg.text}`);
      });
      break;
    case 'myNotes':
      bot.sendMessage(id, 'Здесь будут Ваши напомнинания');
      break;
  }

})


Проблема такова, я нажимаю /start и у меня есть приветствие и 2 инлайн кнопки: "Создать напоминание" и "Мои напоминания", если я нажму создать то он спросит что именно напомнить и я напишу какой то текст, в ответ получу "ок, напомню ..." и еще раз если напишу какой то текст, он так же ответит "ок, напомню (то что я написал)" а если я нажму "Мои напоминания" то выдаст мне список моих напоминаний и в теории то что я буду дальше писать он не должен создавать напоминания и писать типа "ок, напомню ..." но он пишет все равно, так вот, как можно этого избежать?

Я новичек в этом деле, и если есть возможность у кого то, я бы хотел, переодически, напрямую задавать вопросы, советоваться.
  • Вопрос задан
  • 3698 просмотров
Решения вопроса 1
mak_ufo
@mak_ufo
Кратко:
Возьмите telegraf и посмотрите этот раздел

Более развёрнуто:
Вам нужно где-то хранить "состояние" пользователя. Например, в БД или Redis. И тогда код будет примерно такой:
bot.on('message', msg => {
     const session = getSessionFromDb(msg.from.id)
     if (session === 'foo') { //пользователь уже ввёл напоминание
         //обрабатываем одним способом
     } else if (session === 'bar') { //пользователь не ввёл 
        //обрабатываем другим способом
     }
})


Развёрнуто:
Читайте про конечную машину состояний. Её суть в том, что она на одинаковые входные данные возвращает разные значения в зависимости от состояния, в которой она находится. В той же википедии это подробно описано.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы