# Provides a timed cleanup of the spot list. import logging from datetime import datetime, timedelta from threading import Timer from time import sleep import pytz class CleanupTimer: # Constructor def __init__(self, spot_list, cleanup_interval, max_spot_age): self.spot_list = spot_list self.cleanup_interval = cleanup_interval self.max_spot_age = max_spot_age self.cleanup_timer = None self.last_cleanup_time = datetime.min.replace(tzinfo=pytz.UTC) self.status = "Starting" # Start the cleanup timer def start(self): self.cleanup() # Stop any threads and prepare for application shutdown def stop(self): self.cleanup_timer.cancel() # Perform cleanup and reschedule next timer def cleanup(self): try: # Perform cleanup for spot in self.spot_list: if not spot.time or spot.time < datetime.now(pytz.UTC) - timedelta(seconds=self.max_spot_age): self.spot_list.remove(spot) self.status = "OK" self.last_cleanup_time = datetime.now(pytz.UTC) except Exception as e: self.status = "Error" logging.exception("Exception in Cleanup thread") sleep(1) self.cleanup_timer = Timer(self.cleanup_interval, self.cleanup) self.cleanup_timer.start()