import datetime import logging from time import sleep from helpers import now, campus_timdelta from helpers.mongo import mongo from helpers.ruz import ruz def fetch_schedule_for_user(user: dict): today = now(user) schedule = ruz.get_schedule(user, today) if schedule is None: return False saved_ids = [] for element in schedule: year, month, day = element['date'].split('.') begin_hour, begin_minute = element['beginLesson'].split(':') end_hour, end_minute = element['endLesson'].split(':') lesson = mongo.lessons_collection.find_one({ "discipline": element['discipline'], "auditorium": element['auditorium'], "link": element['url1'], "user_email": user['email'], "begin": datetime.datetime( year=int(year), month=int(month), day=int(day), hour=int(begin_hour), minute=int(begin_minute), ) + datetime.timedelta(hours=campus_timdelta[user.get('campus', 'Москва')]) }) if lesson is None: result = mongo.lessons_collection.insert_one({ "discipline": element['discipline'], "auditorium": element['auditorium'], "link": element['url1'], "user_email": user['email'], "begin": datetime.datetime( year=int(year), month=int(month), day=int(day), hour=int(begin_hour), minute=int(begin_minute), ) + datetime.timedelta(hours=campus_timdelta[user.get('campus', 'Москва')]), "end": datetime.datetime( year=int(year), month=int(month), day=int(day), hour=int(end_hour), minute=int(end_minute), ) + datetime.timedelta(hours=campus_timdelta[user.get('campus', 'Москва')]), "building": element['building'], "lecturer": element['lecturer'], "notified": False, "notified_today": False }) saved_ids.append(result.inserted_id) else: saved_ids.append(lesson['_id']) mongo.lessons_collection.delete_many({"user_email": user['email'], "_id": {"$nin": saved_ids}}) mongo.users_collection.update_one({"_id": user['_id']}, {"$set": {'last_schedule_fetch': datetime.datetime.now()}}) return True def process(): for user in mongo.users_collection.find({"email": {"$exists": True, "$ne": None}}).sort([ ("last_schedule_fetch", 1) ]): fetch_schedule_for_user(user) sleep(5) def delete_old(): mongo.lessons_collection.delete_many({"end": {"$lte": datetime.datetime.now() - datetime.timedelta(days=1)}}) def fetch(): while True: logging.info("fetch start") begin = datetime.datetime.now() if begin.hour > 22 or begin.hour < 7: logging.info("Too late, sleeping") sleep(30 * 60) continue process() end = datetime.datetime.now() logging.info('fetch finished') logging.info("time elapsed %s", (end - begin).total_seconds()) delete_old()