aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas "Cakeisalie5" Touhey <thomas@touhey.fr>2018-09-13 23:08:37 +0200
committerThomas "Cakeisalie5" Touhey <thomas@touhey.fr>2018-09-13 23:08:37 +0200
commitf31695b9ba45c17a3eeab821d7eaf6976cd6195a (patch)
tree98647ae53f05c6cc110098d78e50b6d2f961fcc3
parent6b818669142af0efb9be50491ab2e760620548c4 (diff)
Corrected before-the-start fictional idle.
-rwxr-xr-xfingerd/_fiction.py96
-rwxr-xr-xfingerd/_util.py3
2 files changed, 73 insertions, 26 deletions
diff --git a/fingerd/_fiction.py b/fingerd/_fiction.py
index 83c3817..7ea569a 100755
--- a/fingerd/_fiction.py
+++ b/fingerd/_fiction.py
@@ -45,8 +45,10 @@ class _FictionalSession(_FingerSession):
def __add__(self, delta):
if isinstance(delta, _FictionalSessionDelta):
- if delta.is_idle is not None:
- self.is_idle = delta.is_idle
+ if delta.idle_since is not None:
+ self.idle_since = delta.idle_since
+ if delta.active_since is not None:
+ self.active_since = delta.active_since
super().__add__(delta)
return self
@@ -83,29 +85,42 @@ class _FictionalSession(_FingerSession):
pass
@property
- def is_idle(self):
- """ Is idle. """
+ def idle_since(self):
+ """ Idle since the given time. """
- return self.__is_idle
+ if not self.__is_idle:
+ return None
+ return self.__idle_last
- @is_idle.setter
- def is_idle(self, value):
- value = bool(value)
+ @idle_since.setter
+ def idle_since(self, value):
+ self.__is_idle = True
+ self.__idle_last = value
- if value == (not self.__is_idle):
- self.__idle_last = _dt.now()
+ @property
+ def active_since(self):
+ """ Active since the given time. """
+
+ if self.__is_idle:
+ return None
+ return self.__idle_last
- self.__is_idle = value
+ @active_since.setter
+ def active_since(self, value):
+ self.__is_idle = False
+ self.__idle_last = value
class _FictionalSessionDelta(_FingerSessionDelta):
""" User delta for the fingerd fictional user. """
- def __init__(self, *_, is_idle = None, idle = None, **kwargs):
+ def __init__(self, *_, idle_since = None, active_since = None, \
+ idle = None, **kwargs):
super().__init__(**kwargs)
- self.is_idle = is_idle
+ self.idle_since = idle_since
+ self.active_since = active_since
def __repr__(self):
- p = ('name', 'line', 'host', 'is_idle')
+ p = ('name', 'line', 'host', 'idle_since', 'active_since')
p = (f"{x} = {repr(getattr(self, x))}" for x in p \
if getattr(self, x) is not None)
return f"{self.__class__.__name__}({', '.join(p)})"
@@ -252,6 +267,38 @@ class _UserLogoutAction(_Action):
return self.__name
+class _UserIdleToggleAction(_Action):
+ """ A user has changed its idle status. """
+
+ def __init__(self, offset, login, name, idle):
+ super().__init__(offset)
+ self.__login = login
+ self.__name = name
+ self.__idle = bool(idle)
+
+ def __repr__(self):
+ p = (f"{x} = {repr(getattr(self, x))}" for x in ('time', 'login',
+ 'name', 'idle'))
+ return f"{self.__class__.__name__}({', '.join(p)})"
+
+ @property
+ def login(self):
+ """ The user's login. """
+
+ return self.__login
+
+ @property
+ def name(self):
+ """ The name of the session to create. """
+
+ return self.__name
+
+ @property
+ def idle(self):
+ """ The idle status. """
+
+ return self.__idle
+
class _UserSessionEditionAction(_Action):
""" A user has changed their session status. """
@@ -403,20 +450,13 @@ class FingerFiction:
name = data.get('session')
actions.append(_UserLogoutAction(time, login, name))
- elif typ in ('cd', 'idle', 'active'):
- # User edition.
+ elif typ in ('idle', 'active'):
+ # Idle change status.
login = data['login']
- if typ == 'cd':
- delta = _FictionalSessionDelta(wd = data['dir'])
- elif typ == 'idle':
- delta = _FictionalSessionDelta(is_idle = True)
- elif typ == 'active':
- delta = _FictionalSessionDelta(is_idle = False)
-
- actions.append(_UserSessionEditionAction(time, login,
- data.get('session'), delta))
+ actions.append(_UserIdleToggleAction(time, login,
+ data.get('session'), typ == 'idle'))
else:
raise Exception("invalid action type")
@@ -551,6 +591,12 @@ class FingerFictionInterface(_FingerInterface):
self.__users[a.login].sessions.add(session)
elif isinstance(a, _UserLogoutAction):
del self.__users[a.login].sessions[a.name]
+ elif isinstance(a, _UserIdleToggleAction):
+ session = self.__users[a.login].sessions[a.name]
+ if a.idle:
+ session.idle_since = self.__start + a.time
+ else:
+ session.active_since = self.__start + a.time
elif isinstance(a, _UserSessionEditionAction):
self.__users[a.login].sessions[a.name] += a.delta
diff --git a/fingerd/_util.py b/fingerd/_util.py
index 30d3fad..afe699c 100755
--- a/fingerd/_util.py
+++ b/fingerd/_util.py
@@ -171,7 +171,8 @@ class _FingerSessionManager:
if key is None:
self.__sessions.pop(0)
else:
- for i in [i for i, x in enumerate(l) if key == x.name][::-1]:
+ for i in [i for i, x in enumerate(self.__sessions) \
+ if key == x.name][::-1]:
self.__sessions.pop(i)
def __getitem__(self, key):