118 lines
2.4 KiB
Python
118 lines
2.4 KiB
Python
from departures import Departure
|
|
from requests.structures import CaseInsensitiveDict
|
|
import json
|
|
import requests
|
|
from time import sleep
|
|
from lora import LoraController
|
|
import threading
|
|
from api import API
|
|
from pathlib import Path
|
|
import yaml
|
|
import sys
|
|
|
|
class Main:
|
|
|
|
def __init__(self):
|
|
config = Path("config.yml")
|
|
try:
|
|
self.config = yaml.safe_load(config.read_text(encoding="utf-8-sig"))
|
|
except:
|
|
print("Invalid config file!")
|
|
sys.exit(-1)
|
|
self.ended = False
|
|
lora_controller = LoraController(self)
|
|
lora_controller.generate_token()
|
|
for d in self.config["devices"]:
|
|
lora_controller.new(d["id"], d["stop_id"])
|
|
self.controller = lora_controller
|
|
self.thread = threading.Thread(target=self.update_loop)
|
|
self.thread.start()
|
|
self.api = API(self)
|
|
|
|
def fetch(self, stop_id, limit):
|
|
|
|
url = "https://jizdnirady.pmdp.cz/odjezdy/vyhledat"
|
|
|
|
headers = CaseInsensitiveDict()
|
|
headers["Content-Type"] = "application/json"
|
|
|
|
data = {
|
|
"Stop": {
|
|
"StopId": stop_id
|
|
},
|
|
"DateAndTime": None,
|
|
"MaxResults": limit,
|
|
"FullResults": False
|
|
}
|
|
|
|
resp = requests.post(url, headers=headers, data=json.dumps(data), timeout=1000).json()
|
|
|
|
for c in resp:
|
|
did = f"{stop_id}|{abs(c['ConnectionId']['ConnectionId'])}"
|
|
if did not in Departure.storage:
|
|
Departure(
|
|
did,
|
|
stop_id,
|
|
c["Line"]["TractionType"],
|
|
c["Line"]["Name"],
|
|
c["LastStopName"],
|
|
c["DepartureTime"],
|
|
0 if not c["DelayMin"] else c["DelayMin"],
|
|
self.controller
|
|
)
|
|
else:
|
|
Departure.storage[did].update(
|
|
0 if not c["DelayMin"] else c["DelayMin"]
|
|
)
|
|
|
|
def update_loop(self):
|
|
refetch = 0
|
|
regenerate = 1
|
|
resend = 1
|
|
while True:
|
|
|
|
if self.ended:
|
|
break
|
|
|
|
if resend == 0:
|
|
for d in self.controller.devices:
|
|
d.resend()
|
|
|
|
if regenerate == 0:
|
|
self.controller.generate_token()
|
|
|
|
if refetch == 0:
|
|
self.controller.time()
|
|
for s in self.config["stops"]:
|
|
self.fetch(s["id"], 15)
|
|
|
|
refetch = (refetch + 1) % 3
|
|
regenerate = (regenerate + 1) % (6*30)
|
|
resend = (resend + 1) % 7
|
|
|
|
sleep(.1)
|
|
|
|
Departure.clear()
|
|
|
|
for _ in range(10):
|
|
sleep(1)
|
|
if self.ended:
|
|
break
|
|
|
|
def stop(self):
|
|
print("Stopping...")
|
|
self.api.server.stop()
|
|
self.ended = True
|
|
self.controller.message_pool = []
|
|
|
|
def input_loop(self):
|
|
try:
|
|
while not self.ended:
|
|
command = input()
|
|
if command in ["s", "stop"]:
|
|
self.stop()
|
|
except KeyboardInterrupt:
|
|
self.stop()
|
|
|
|
main = Main()
|
|
main.input_loop() |