40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
import time
|
|
import filter
|
|
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):
|
|
if not self._cached_calendar or self._cached_time + self._cache_duration < time.time():
|
|
self._cached_calendar = grabber.grab_calendar(self._ics_url)
|
|
if not self._cached_calendar:
|
|
return False
|
|
|
|
self._cached_time = time.time()
|
|
logger.info("Successfully cached calendar")
|
|
|
|
return True
|
|
|
|
def _response_callback(self, td_group: str, sh_group: str):
|
|
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):
|
|
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() |