А в целом он работает так, как вы сделали.
get_midterm(message) - получает первое сообщение. обрабатывает. Передает "управление" дальше.
get_endterm(message) - второе сообщение получит эта функция, т.к. передали управление её хендлеру. В ней вы снова передаете управление
get_total(message) - ну вот и получаем третьи сообщение. эта функция уже срабатывает.
Как сказано выше - сделайте 1 хендлер, что ловит сообщения и несколько функций обработки.
Честно говоря ничего не понятно. Вы хотите что бы на сегодня и завтра он отвечал по разному? Или одинаково? Почему просто не сделать 2 функции на сегодня и завтра?
Если это так же важно, то если убрать проверку события и просто нажать на кнопку - то она просто бесконечно грузиться, ничего не выдавая. Я так думаю, что ждет ответа-реакцию на события, которое я не могу прописать из-за отсутствия message_event.
Но если я во время "ожидания" вкину сообщение - оно его обработает вне очереди, а значок загрузки на кнопке продолжит кружиться.
И он строит график во время обучения - поэтому он так выглядит