Тут можно решить данную задачу разными способами:
- В этом же обработчике запустить в отдельном потоке (чтобы не стопить основной поток) schedule программу, которая будет ждать 30 мин, а потом выполнять нужную логику.
- Создать маленький скриптик (в нём будет нужная логика) на Python и запустить его через утилиту cron
- Использовать асинхронную очередь задач (например, Celery) - самый лучщий способ (по моему субъективному мнению)
Пример того, как это будет выглядить на Celery:
from datetime import datetime, timedelta
import celery
# инициализация бота...
@celery.task()
def reply_after_30min(user_id):
bot.send_message(user_id, "some message")
user_id = 'some userid'
started_at = datetime.now() + timedelta(minutes=30)
reply_after_30min.apply_async((user_id, ), eta=started_at)