import time import filter import dater import handler from http.server import HTTPServer import logger import grabber class Server: def __init__(self, host: str, port: int, cache_duration: int, ics_url: str): self._host = host self._port = port self._cache_duration = cache_duration self._ics_url = ics_url self._cached_calendar = None self._cached_time = -cache_duration def _cache_calendar(self) -> bool: if not self._cached_calendar or self._cached_time + self._cache_duration < time.time(): calendar = grabber.grab_calendar(self._ics_url) if not calendar: return False dater.date_calendar(calendar) self._cached_calendar = calendar self._cached_time = time.time() logger.info("Successfully cached calendar") return True def _response_callback(self, td_group: str, sh_group: str) -> str | None: if not self._cache_calendar(): return None filtered_calendar = filter.filter_calendar(self._cached_calendar, td_group, sh_group) return filtered_calendar.serialize() def serve(self) -> None: handler_class = handler.generate_class(self._response_callback) server = HTTPServer((self._host, self._port), handler_class) logger.info(f"Listening on {self._host}:{self._port}") server.serve_forever()