Отправка сообщения в боте Telegram в конкретное время Python / C#
Подскажите, пожалуйста, как реализуются боты, допустим ToDo. Человек вводит заметку, вводит ДАТУ и ВРЕМЯ дедлайна и когда наступает тот самый момент дедлайна, бот производит какое-либо действие (отправка сообщения).
Думал, что цикл каждую секунду перебирает всю базу заметок, но это бред, по-моему.
А держать в асинхронном методе данную информацию не безопасно (допустим сейчас 22:00, а мне надо получить сообщение в 23:00, считается количество секунд, задаётся пауза и после неё идет отправка сообщения), ибо если бот выключится, то все времена и даты попросту пропадут.
А зачем проверять всю базу? Отсортируй и проверяй только первый элемент (или несколько первых если они одинаковые)
# import schedule
Как реализуются подобные боты не знаю, но я представляю себе это так:
Каждый фиксированный промежуток времени ты запускаешь выборку заметок из БД на определенный промежуток времени (до следующего вызова). Например, каждый час ты выбираешь заметки на следующий час (периодичность зависит от количества заметок и регулируется). И в планировщике по каждой заметке создаешь вызов процедуры отправки сообщения с параметрами по типу кому и что писать (берутся из БД).
Проблема отключения бота решается тем, что на каждом старте бота запускается такая же выборка заметок, но с текущего времени (или времени отключения бота, которое в логах каких-нибудь) и по конец выбранного периода (часа, допустим). Если заметки удаляются из БД, то с ближайшей по времени заметки.
Заметки из БД лучше не удалять, можно выводить историю, активность и т. п. Если уж будут мешать, то удалять каждую заметку по окончании работы с ней.
И надо не забывать про границы (левую включать, правую исключать и т. п.), чтобы заметки на граничное время, когда происходит выборка из БД не потерялись. Время выборки учитывать т. е. А проще вообще, к примеру, выборку на промежуток с 01:00:00 по 01:59:59 производить в 00:30:00.
Это в общих чертах, в ходе реализации всё само уточнится..
Всё нужное тут:
https://schedule.readthedocs.io/en/stable/
>Думал, что цикл каждую секунду перебирает всю базу заметок, но это бред, по-моему.
А нафига всю-то? Отсортируй ее по времени наступления события и проверяй только первое, как наступит - удаляй его.
lolz.guru почитай, там найдешь все...