From 883bb30fea5c4ac195025bf1570989f372284d9c Mon Sep 17 00:00:00 2001 From: Filip Znachor Date: Thu, 8 Dec 2022 20:59:11 +0100 Subject: [PATCH] Moved config to yml file --- .gitignore | 2 +- server/api.py | 26 +++++++++-------- server/departures.py | 53 ++++------------------------------ server/lora.py | 24 +++++++-------- server/main.py | 69 +++++++++++++++++++++++++++++++++++++------- 5 files changed, 90 insertions(+), 84 deletions(-) diff --git a/.gitignore b/.gitignore index ce23bf4..5a4b515 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -config.py +config.yml *.pyc assets diff --git a/server/api.py b/server/api.py index cc6259c..d0bd630 100644 --- a/server/api.py +++ b/server/api.py @@ -1,12 +1,12 @@ -from bottle import route, template, error, run, get, ServerAdapter, static_file -from departures import Departure -from operator import itemgetter import threading +from operator import itemgetter +from wsgiref.simple_server import make_server, WSGIRequestHandler +from departures import Departure +from bottle import route, error, run, get, ServerAdapter, static_file class Server(ServerAdapter): server = None def run(self, handler): - from wsgiref.simple_server import make_server, WSGIRequestHandler if self.quiet: class QuietHandler(WSGIRequestHandler): def log_request(self, *args, **kw): @@ -17,8 +17,6 @@ class Server(ServerAdapter): def stop(self): self.server.shutdown() -server = Server(host="0.0.0.0", port=8080) - @route('/departures') def index(): resp = [] @@ -29,14 +27,18 @@ def index(): @get("/") def static(): - return static_file("index.html", root="static") + return static_file("index.html", root="static") @error(404) -def error404(error): +def error404(err): return '' -def start(): - run(quiet=True, server=server) +class API: -thread = threading.Thread(target=start) -thread.start() + def __init__(self, main): + self.server = Server(host=main.config["http"]["host"], port=main.config["http"]["port"]) + self.thread = threading.Thread(target=self.start) + self.thread.start() + + def start(self): + run(quiet=True, server=self.server) \ No newline at end of file diff --git a/server/departures.py b/server/departures.py index d6b9d2a..37f4a66 100644 --- a/server/departures.py +++ b/server/departures.py @@ -1,13 +1,6 @@ - - -from requests.structures import CaseInsensitiveDict -import json -import requests -from dateutil import parser -from datetime import datetime -from lora import lora_controller from math import floor - +from datetime import datetime +from dateutil import parser class Departure: @@ -33,43 +26,8 @@ class Departure: remove.append(did) for did in remove: Departure.storage.pop(did) - - @staticmethod - def fetch(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=100).json() - - for c in resp: - did = f"{stop_id}|{abs(c['ConnectionId']['ConnectionId'])}" - if did not in Departure.storage: - Departure( - did, - c["Line"]["TractionType"], - c["Line"]["Name"], - c["LastStopName"], - c["DepartureTime"], - 0 if not c["DelayMin"] else c["DelayMin"] - ) - else: - Departure.storage[did].update( - 0 if not c["DelayMin"] else c["DelayMin"] - ) - - def __init__(self, did, type, line, last_stop, departure, delay): + def __init__(self, did, type, line, last_stop, departure, delay, lora_controller): departure = (parser.parse(departure)).timestamp() if -(datetime.now().timestamp() - (departure + delay*60))/60 <= -1: return @@ -83,11 +41,12 @@ class Departure: self.last_stop = last_stop self.departure = departure self.delay = delay - lora_controller.data(self) + self.controller = lora_controller + self.controller.data(self) def update(self, delay): if delay != self.delay: - lora_controller.data(self) + self.controller.data(self) self.delay = delay def get_departure(self): diff --git a/server/lora.py b/server/lora.py index 13e1354..df9b7a7 100644 --- a/server/lora.py +++ b/server/lora.py @@ -1,6 +1,5 @@ import requests from requests.structures import CaseInsensitiveDict -import config import json import threading from time import sleep @@ -12,27 +11,29 @@ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) class LoraController: - def __init__(self): + def __init__(self, main): + self.main = main self.storage = dict() self.devices = [] # TODO: create separated message pool for each device self.message_pool = [] self.thread = None + self.token = "" def generate_token(self): - url = f"https://lora.plzen.eu/api/v2/login" + url = "https://lora.plzen.eu/api/v2/login" headers = CaseInsensitiveDict() headers["Content-Type"] = "application/json" data = { - "email": config.lora_api_username, - "password": config.lora_api_password + "email": self.main.config["lora_api"]["username"], + "password": self.main.config["lora_api"]["password"] } data = requests.post(url, verify=False, headers=headers, data=json.dumps(data)).json() - config.lora_api_token = data["token"] + self.token = data["token"] def new(self, id): self.devices.append(LoraDevice(self, id)) @@ -55,14 +56,14 @@ class LoraController: def thread_sending(self): while True: - if not len(self.message_pool): + if len(self.message_pool) == 0: break data = self.message_pool.pop(0) url = f"https://lora.plzen.eu/api/v2/nodes/{data[0]:0>16x}/queue" string = data[2]() headers = CaseInsensitiveDict() headers["Content-Type"] = "application/json" - headers["Authorization"] = f"Bearer {config.lora_api_token}" + headers["Authorization"] = f"Bearer {self.token}" payload = { "confirmed": True, "data": b64encode(string.encode("utf-8")).decode("ascii"), @@ -81,9 +82,4 @@ class LoraDevice: def send(self, msg): self.controller.send(self.id, self.port+1, msg) - self.port = (self.port + 1) % 15 - - -lora_controller = LoraController() - -lora_controller.new(0xbdea85badeedf1) + self.port = (self.port + 1) % 15 \ No newline at end of file diff --git a/server/main.py b/server/main.py index 20b5fb2..f20a608 100644 --- a/server/main.py +++ b/server/main.py @@ -1,18 +1,67 @@ from departures import Departure +from requests.structures import CaseInsensitiveDict +import json +import requests from time import sleep -from lora import lora_controller +from lora import LoraController import threading -from api import server +from api import API +from pathlib import Path +import yaml import sys -class MainLoop: +class Main: - def __init__(self, stop_id, controller): + def __init__(self, stop_id): + 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 self.stop_id = stop_id - self.controller = controller + lora_controller = LoraController(self) + lora_controller.new(0xbdea85badeedf1) + 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=100).json() + + for c in resp: + did = f"{stop_id}|{abs(c['ConnectionId']['ConnectionId'])}" + if did not in Departure.storage: + Departure( + did, + 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 @@ -27,7 +76,7 @@ class MainLoop: if refetch == 0: self.controller.time() - Departure.fetch(self.stop_id, 20) + self.fetch(self.stop_id, 20) refetch = (refetch + 1) % 3 regenerate = (regenerate + 1) % (6*30) @@ -36,14 +85,14 @@ class MainLoop: Departure.clear() - for i in range(10): + for _ in range(10): sleep(1) if self.ended: break def stop(self): print("Stopping...") - server.stop() + self.api.server.stop() self.ended = True self.controller.message_pool = [] @@ -70,5 +119,5 @@ class MainLoop: except KeyboardInterrupt: self.stop() -main_loop = MainLoop("40", lora_controller) -main_loop.input_loop() \ No newline at end of file +main = Main("40") +main.input_loop() \ No newline at end of file