ruz-bot/daemons/fetch.py
Administrator 01f113ec4c link
2022-10-28 23:40:57 +03:00

85 lines
2.8 KiB
Python

import datetime
import logging
from time import sleep
from helpers import now, User
from helpers.models import UserSchema
from helpers.mongo import mongo
from helpers.ruz import ruz
def fetch_schedule_for_user(user: User):
today = now(user)
next_day = today + datetime.timedelta(days=7)
schedule = ruz.get_schedule(user, today, next_day)
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'],
"hse_user_id": user.hse_id,
"begin": datetime.datetime(
year=int(year),
month=int(month),
day=int(day),
hour=int(begin_hour),
minute=int(begin_minute),
)
})
if lesson is None:
result = mongo.lessons_collection.insert_one({
"discipline": element['discipline'],
"auditorium": element['auditorium'],
"link": element['url1'],
"hse_user_id": user.hse_id,
"begin": datetime.datetime(
year=int(year),
month=int(month),
day=int(day),
hour=int(begin_hour),
minute=int(begin_minute),
),
"end": datetime.datetime(
year=int(year),
month=int(month),
day=int(day),
hour=int(end_hour),
minute=int(end_minute),
),
"building": element['building'],
"lecturer": element['lecturer'],
"notified": False
})
saved_ids.append(result.inserted_id)
else:
saved_ids.append(lesson['_id'])
mongo.lessons_collection.delete_many({"hse_user_id": user.hse_id, "_id": {"$nin": saved_ids}})
return True
def process():
for user in mongo.users_collection.find({"hse_id": {"$ne": None}}):
fetch_schedule_for_user(UserSchema().load(user))
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()
process()
end = datetime.datetime.now()
logging.info('fetch finished')
logging.info("time elapsed %s", (end - begin).total_seconds())
delete_old()
sleep(60 * 5)