#!/usr/bin/env python3 # -*- coding: utf-8 -*- from typing import Self, Optional, Any from threading import Thread from time import sleep, time as timestamp from Interfaces.Application.AnPInterface import AnPInterface from Models.SessionModel import SessionModel class SessionsManager: def __init__(self:Self, anp:AnPInterface) -> None: self.anp:AnPInterface = anp self.__sessions:dict[str, SessionModel] = {} self.__thread:Thread = Thread(target = self.__autoclean) self.__timeout:float|int = self.anp.settings.get(("sessions_timeout", "timeout"), None, 3600) self.__clean_waiter:float|int = self.anp.settings.get(("sessions_clean_waiter", "clean_waiter"), None, 60) self.update() self.__thread.start() def update(self:Self) -> None:pass def reset(self:Self) -> None: self.__sessions = {} self.update() def __autoclean(self:Self) -> None: while self.anp.working(): id:str session:SessionModel time:float = timestamp() for id, session in tuple(self.__sessions.items()): if time - session.get("date_last", time) > self.__timeout: self.remove(id) sleep(self.__clean_waiter) def get(self:Self, id:str, key:str, default:Optional[Any] = None) -> Any|None: if id in self.__sessions: return self.__sessions[id].get(key, default) return default def set(self:Self, id:str, key:str, value:Any|None) -> bool: if id in self.__sessions: self.__sessions[id].set(key, value) return True return False def remove(self:Self, id:str) -> bool: if id in self.__sessions: del self.__sessions[id] return True return False