diff --git a/README.md b/README.md index 7dc7835..7b4b81d 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,9 @@ Suggested names so far: * (s)pothole * Spot on API * API on Spot +* frankenspot +* spot(t)sammler +* On the Air ### TODO - Setup instructions - checkout, config.yml, pip ### TODO - systemd diff --git a/main.py b/main.py index bf48609..e53bd1e 100644 --- a/main.py +++ b/main.py @@ -33,6 +33,11 @@ if __name__ == '__main__': # Set up logging root = logging.getLogger() root.setLevel(logging.INFO) + handler = logging.StreamHandler(sys.stdout) + handler.setLevel(logging.INFO) + formatter = logging.Formatter("%(message)s") + handler.setFormatter(formatter) + root.addHandler(handler) logging.info("Starting...") # Shut down gracefully on SIGINT @@ -40,13 +45,13 @@ if __name__ == '__main__': # Create providers providers = [ - # POTA(), - # SOTA(), - # WWFF(), - # WWBOTA(), - # GMA(), - # HEMA(), - # ParksNPeaks(), + POTA(), + SOTA(), + WWFF(), + WWBOTA(), + GMA(), + HEMA(), + ParksNPeaks(), DXCluster("hrd.wa9pie.net", 8000), # DXCluster("dxc.w3lpl.net", 22) ] diff --git a/providers/dxcluster.py b/providers/dxcluster.py index 11c5852..37c56a9 100644 --- a/providers/dxcluster.py +++ b/providers/dxcluster.py @@ -49,8 +49,8 @@ class DXCluster(Provider): self.status = "Connecting" logging.info("DX Cluster " + self.hostname + " connecting...") self.telnet = telnetlib3.Telnet(self.hostname, self.port) - self.telnet.read_until("login: ".encode("utf-8")) - self.telnet.write((config["server-owner-callsign"] + "\n").encode("utf-8")) + self.telnet.read_until("login: ".encode("latin-1")) + self.telnet.write((config["server-owner-callsign"] + "\n").encode("latin-1")) connected = True logging.info("DX Cluster " + self.hostname + " connected.") except Exception as e: @@ -62,8 +62,8 @@ class DXCluster(Provider): while connected and self.run: try: # Check new telnet info against regular expression - telnet_output = self.telnet.read_until("\n".encode("utf-8")) - match = self.LINE_PATTERN.match(telnet_output.decode("utf-8")) + telnet_output = self.telnet.read_until("\n".encode("latin-1")) + match = self.LINE_PATTERN.match(telnet_output.decode("latin-1")) if match: spot_time = datetime.strptime(match.group(5), "%H%MZ") spot_datetime = datetime.combine(datetime.today(), spot_time.time()).replace(tzinfo=pytz.UTC) diff --git a/server/webserver.py b/server/webserver.py index 4799ca4..247321d 100644 --- a/server/webserver.py +++ b/server/webserver.py @@ -20,6 +20,8 @@ class WebServer: # Set up routing bottle.get("/api/spots")(self.serve_api_spots) + bottle.get("/")(self.serve_index) + bottle.get("/")(self.serve_static_file) # Start the web server def start(self): @@ -36,8 +38,16 @@ class WebServer: response.content_type = 'application/json' return spots_json + # Serve the home page. This would be accessible as /index.html but we need this workaround to make it available as / + def serve_index(self): + return bottle.static_file("index.html", root="webassets") -# Todo spot API arguments e.g. "since" based on received_time of spots, sources, sigs, dx cont, dxcc, de cont, band, mode, filter out qrt, filter pre-qsy + # Serve general static files from "webassets" directory + def serve_static_file(self, filepath): + return bottle.static_file(filepath, root="webassets") + + +# Todo spot API arguments e.g. "since" based on received_time of spots, sources, sigs, dx cont, dxcc, de cont, band, mode, filter out qrt, filter pre-qsy, sort order, list of fields # Todo serve status API # Todo serve apidocs # Todo serve website diff --git a/webassets/index.html b/webassets/index.html new file mode 100644 index 0000000..1b39c0f --- /dev/null +++ b/webassets/index.html @@ -0,0 +1,16 @@ + + + + Spot tool + + + + + + + + +
+ + + diff --git a/webassets/js/code.js b/webassets/js/code.js new file mode 100644 index 0000000..3682b52 --- /dev/null +++ b/webassets/js/code.js @@ -0,0 +1,13 @@ +$.getJSON('/api/spots', function(jsonData) { + let headers = Object.keys(jsonData[0]); + let table = $('').append(''); + headers.forEach(header => table.find('thead tr').append(``)); + + jsonData.forEach(row => { + let $tr = $(''); + headers.forEach(header => $tr.append(``)); + table.find('tbody').append($tr); + }); + + $('#table-container').html(table); +}); \ No newline at end of file
${header}
${row[header]}