From e3969e12d646173e52713c5995963b9bf72cfb6c Mon Sep 17 00:00:00 2001 From: Jason Michalski Date: Fri, 26 Jul 2024 21:32:18 -0700 Subject: [PATCH] Add net view. --- meshview/store.py | 6 +++- meshview/templates/net.html | 32 +++++++++++++++++++++ meshview/templates/net_packet.html | 12 ++++++++ meshview/templates/packet.html | 3 +- meshview/templates/packet_details.html | 2 ++ meshview/web.py | 39 ++++++++++++++++++++++++-- 6 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 meshview/templates/net.html create mode 100644 meshview/templates/net_packet.html diff --git a/meshview/store.py b/meshview/store.py index 6f18023..9f84739 100644 --- a/meshview/store.py +++ b/meshview/store.py @@ -153,7 +153,7 @@ async def get_fuzzy_nodes(query): return result.scalars() -async def get_packets(node_id=None, portnum=None, since=None, limit=500): +async def get_packets(node_id=None, portnum=None, since=None, limit=500, before=None, after=None): async with database.async_session() as session: q = select(Packet) @@ -165,6 +165,10 @@ async def get_packets(node_id=None, portnum=None, since=None, limit=500): q = q.where(Packet.portnum == portnum) if since: q = q.where(Packet.import_time > (datetime.datetime.utcnow() - since)) + if before: + q = q.where(Packet.import_time < before) + if after: + q = q.where(Packet.import_time > after) if limit is not None: q = q.limit(limit) diff --git a/meshview/templates/net.html b/meshview/templates/net.html new file mode 100644 index 0000000..ef0e9f3 --- /dev/null +++ b/meshview/templates/net.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} + +{% block head %} + + +{% endblock %} + +{% block css %} + #packet_details{ + height: 95vh; + overflow: scroll; + } +{% endblock %} + +{% block body %} +
+
+
+ {% for packet in net_packets %} + {% include 'net_packet.html' %} + {% endfor %} +
+
+
+
+
+{% endblock body %} diff --git a/meshview/templates/net_packet.html b/meshview/templates/net_packet.html new file mode 100644 index 0000000..7582a1f --- /dev/null +++ b/meshview/templates/net_packet.html @@ -0,0 +1,12 @@ +
+
+ {{packet.from_node.long_name}} + 🔎 +
+
+
+
{{packet.import_time | format_timestamp}}
+
{{packet.payload}}
+
+
+
diff --git a/meshview/templates/packet.html b/meshview/templates/packet.html index 01ec48b..e430d32 100644 --- a/meshview/templates/packet.html +++ b/meshview/templates/packet.html @@ -28,7 +28,8 @@
- {{packet.id}} + {{packet.id}} + 🔎 🔗
diff --git a/meshview/templates/packet_details.html b/meshview/templates/packet_details.html index 5ce85ed..a7697e1 100644 --- a/meshview/templates/packet_details.html +++ b/meshview/templates/packet_details.html @@ -1,3 +1,5 @@ +
+ {% for seen in packets_seen %}
diff --git a/meshview/web.py b/meshview/web.py index 8bfc03d..95c5e2f 100644 --- a/meshview/web.py +++ b/meshview/web.py @@ -1,6 +1,5 @@ import asyncio import io - from collections import Counter from dataclasses import dataclass import datetime @@ -342,6 +341,7 @@ async def events(request): portnum = int(portnum) packet_template = env.get_template("packet.html") + net_packet_template = env.get_template("net_packet.html") with notify.subscribe(node_id) as event: async with sse_response(request) as resp: while resp.is_connected(): @@ -364,14 +364,21 @@ async def events(request): event.clear() try: for packet in packets: + ui_packet = Packet.from_model(packet) await resp.send( packet_template.render( is_hx_request="HX-Request" in request.headers, node_id=node_id, - packet=Packet.from_model(packet), + packet=ui_packet, ), event="packet", ) + if ui_packet.portnum == PortNum.TEXT_MESSAGE_APP and '#baymeshnet' in ui_packet.payload.lower(): + await resp.send( + net_packet_template.render(packet=ui_packet), + event="net_packet", + ) + for packet in uplinked: await resp.send( packet_template.render( @@ -845,6 +852,34 @@ async def graph_network(request): ) +@routes.get("/net") +async def graph_net(request): + if "date" in request.query: + start_date = datetime.date.fromisoformat(request.query["date"]) + else: + start_date = datetime.date.today() + while start_date.weekday() != 2: + start_date = start_date - datetime.timedelta(days=1) + + start_time = datetime.datetime.combine(start_date, datetime.time(0,0)) + + text_packets = [ + Packet.from_model(p) + for p in await store.get_packets( + portnum=PortNum.TEXT_MESSAGE_APP, + after=start_time, + before=start_time + datetime.timedelta(hours=1), + ) + ] + net_packets = [p for p in text_packets if '#baymeshnet' in p.payload.lower()] + + template = env.get_template("net.html") + return web.Response( + text=template.render(net_packets=net_packets), + content_type="text/html", + ) + + async def run_server(bind, port, tls_cert): app = web.Application() app.add_routes(routes)