У меня подобное было, когда в бот вставлял переводчика.
И мне нужно было, чтобы когда человек находился в переводчике, при вводе текста выполнялся перевод, а к примеру не выполнение какой то команды. Соответственно, проверяю его текущее состояние перед обработкой текста и все.
Создал БД, в котором для каждого chatid хранил этап на котором он находится.(2 колонки chatid и status).
1- это одно меню, 2- второе и так далее. При команде старт к примеру 1 дается (chatid 1029123 status 1), тыкнул в переводчик в меню получил статус 2 (chatid 1029123 status 2), вернулся в главное меню поулчил 1 (chatid 1029123 status 1).
Вот можешь посмотреть работу: @ readytospeakbot, но он недоделанный и клавиатуру не прячу пока что. Но переводчик работает и проверяет состояние, можешь проверить.