Odjezdova-tabule-MHD/server/departures.py

78 lines
1.8 KiB
Python

from math import floor
from operator import itemgetter
from datetime import datetime
from dateutil import parser
class Departure:
id_pool = []
storage = dict()
@staticmethod
def get(stop_id: str):
resp = []
for id in Departure.storage:
d = Departure.storage[id]
if d.stop_id == int(stop_id):
resp.append(d.json())
resp.sort(key=itemgetter("departure"))
return resp
@staticmethod
def get_id():
i = 0
while True:
i += 1
if i not in Departure.id_pool:
Departure.id_pool.append(i)
return i
@staticmethod
def clear():
remove = []
for did in Departure.storage:
d = Departure.storage[did]
if d.get_departure() < -3.5:
Departure.id_pool.remove(d.id)
remove.append(did)
for did in remove:
Departure.storage.pop(did)
def __init__(self, did, stop_id, type, line, last_stop, departure, delay, lora_controller):
departure = (parser.parse(departure)).timestamp()
if -(datetime.now().timestamp() - (departure + delay*60))/60 <= -1:
return
if len(last_stop) >= 21:
last_stop = last_stop[:20].strip() + "..."
self.did = did
self.stop_id = stop_id
self.id = Departure.get_id()
self.line = line
self.type = type
self.last_stop = last_stop
self.departure = departure
self.delay = delay
self.controller = lora_controller
self.controller.data(self)
Departure.storage[did] = self
def update(self, delay):
if delay != self.delay:
self.controller.data(self)
self.delay = delay
def get_departure(self):
return -(floor(((datetime.now().timestamp() - (self.departure + self.delay*60))/60)*10)/10)
def __repr__(self):
return f"{self.id}|{self.type}|{self.line}|{self.last_stop}|{(self.get_departure()*10):.0f}"
def json(self):
return {
'id': self.id,
'line': self.line,
'type': self.type,
'last_stop': self.last_stop,
'departure': self.get_departure(),
'delay': self.delay
}