91 lines
3.3 KiB
Python
91 lines
3.3 KiB
Python
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()
|