import feedparser from typing import List, Tuple, Optional from datetime import datetime import requests import json KSP_URL = "https://ksp.mff.cuni.cz" def task_link(task_code: str, solution : bool = False): return f"{KSP_URL}/viz/{task_code}/{'reseni' if solution else ''}" def catalog(year : Optional[int] = None, tasks : bool = False): year_str = "" if year is not None: year_str = f"year={year}" tasks_str = f"tasks={str(tasks).lower()}" page = requests.get(f"{KSP_URL}/api/tasks/catalog?{year_str}&{tasks_str}") return json.loads(page.text) def active_deadlines() -> List[Tuple[str, datetime]]: deadlines = [] now = datetime.now().astimezone() cat = catalog() for series in cat: series_deadlines = [series["deadline"]] if "deadline2" in series: series_deadlines.append(series["deadline2"]) series_deadlines = list(map(datetime.fromisoformat, series_deadlines)) for series_deadline in series_deadlines: if now < series_deadline: deadlines.append((series["id"], series_deadline)) break return deadlines async def ksp_feed() -> feedparser.util.FeedParserDict: return feedparser.parse(f"{KSP_URL}/ksp.feed") def strip_id(id_): text = f"{KSP_URL}/" if id_.startswith(text): id_ = id_[len(text):] return id_