import datetime import logging from time import sleep from telebot.apihelper import ApiTelegramException from daemons.bot import bot from helpers import now from helpers.models import UserSchema from helpers.mongo import mongo from helpers.ruz import ruz def process(): for user in mongo.users_collection.find({"notify_minutes": {"$ne": None}, "hse_id": {"$ne": None}}): time_now = now(UserSchema().load(user)) for lesson in mongo.lessons_collection.find({ "hse_user_id": user["hse_id"], "begin": {"$lte": time_now + datetime.timedelta(minutes=user["notify_minutes"])}, "notified": False }): ans = f"📅 {lesson['begin'].strftime('%d.%m')}\n" ans += f"📚 {lesson['discipline']}\n" ans += f"🏢 {lesson['building']}, {lesson['auditorium']}\n" ans += f"🕑 {lesson['begin'].strftime('%H:%M')} - {lesson['end'].strftime('%H:%M')}\n" ans += f"🧑‍🏫 {(lesson['lecturer'] or 'Неизвестно')}\n" if lesson.get('link', None): ans += f"🔗 {lesson['link']}" try: bot.send_message( user["chat_id"], f"Через {user['notify_minutes']} минут у тебя занятие!\n" + ans ) except ApiTelegramException: pass mongo.lessons_collection.update_one({"_id": lesson['_id']}, {"$set": {"notified": True}}) time_now = datetime.datetime.now() for user in mongo.users_collection.find({"next_daily_notify_time": {"$lte": time_now}}): user_model = UserSchema().load(user) deny_weekday = 6 if user_model.daily_notify_today else 5 if time_now.weekday() != deny_weekday: if user_model.daily_notify_today: lessons = mongo.get_today_lessons(user_model) else: lessons = mongo.get_tomorrow_lessons(user_model) if len(lessons) == 0: text = f"{'Сегодня' if user_model.daily_notify_today else 'Завтра'} у тебя нет пар, отдыхай." else: text = ruz.schedule_builder(lessons) try: bot.send_message( user["chat_id"], f"Уведомляю о занятиях! Твое расписание на {'сегодня' if user_model.daily_notify_today else 'завтра'}:\n" + text ) except: pass mongo.users_collection.update_one( {"chat_id": user["chat_id"]}, {"$set": {"next_daily_notify_time": user_model.next_daily_notify_time + datetime.timedelta(days=1)}} ) for user in mongo.users_collection.find({"first_lesson_notify": {"$exists": True}, "first_lesson_notify": {"$ne": None}, "hse_id": {"$ne": None}}): time_now = now(UserSchema().load(user)) for lesson in mongo.lessons_collection.find({ "hse_user_id": user["hse_id"], "begin": {"$lte": time_now + datetime.timedelta(minutes=user["first_lesson_notify"])}, "notified_today": {"$ne": True} }).sort("begin"): ans = f"📅 {lesson['begin'].strftime('%d.%m')}\n" ans += f"📚 {lesson['discipline']}\n" ans += f"🏢 {lesson['building']}, {lesson['auditorium']}\n" ans += f"🕑 {lesson['begin'].strftime('%H:%M')} - {lesson['end'].strftime('%H:%M')}\n" ans += f"🧑‍🏫 {(lesson['lecturer'] or 'Неизвестно')}\n" if lesson.get('link', None): ans += f"🔗 {lesson['link']}" try: mess = "Пары начутся через " if user['first_lesson_notify'] == 30: mess += "30 минут" elif user['first_lesson_notify'] == 60: mess += "1 час" elif user['first_lesson_notify'] == 4 * 60: mess += "4 часа" else: mess += "12 часов" mess += "!\n\nТвоя первая пара:\n\n" + ans bot.send_message( user["chat_id"], mess ) except ApiTelegramException: pass start_of_day = datetime.datetime(year=time_now.year, month=time_now.month, day=time_now.day) mongo.lessons_collection.update_many({"begin": {"$gte": start_of_day, "$lt": (start_of_day + datetime.timedelta(days=1))}, "hse_user_id": user["hse_id"]}, {"$set": {"notified_today": True}}) break def notify(): while True: logging.info("notify start") begin = datetime.datetime.now() process() end = datetime.datetime.now() logging.info('notify finished') logging.info("time elapsed %s", (end - begin).total_seconds()) sleep(63 - end.second)