mirror of
https://github.com/pablorevilla-meshtastic/meshview.git
synced 2026-08-06 17:02:48 +02:00
Add net view.
This commit is contained in:
+5
-1
@@ -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)
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block head %}
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/>
|
||||
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
|
||||
{% endblock %}
|
||||
|
||||
{% block css %}
|
||||
#packet_details{
|
||||
height: 95vh;
|
||||
overflow: scroll;
|
||||
}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div
|
||||
id="net"
|
||||
class="container text-center"
|
||||
hx-ext="sse"
|
||||
sse-connect="/events?portnum=1"
|
||||
>
|
||||
<div class="row">
|
||||
<div class="col-6" id="packet_list" sse-swap="net_packet" hx-swap="afterbegin">
|
||||
{% for packet in net_packets %}
|
||||
{% include 'net_packet.html' %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="col-6 sticky-top" id="packet_details">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock body %}
|
||||
@@ -0,0 +1,12 @@
|
||||
<div class="card mt-2">
|
||||
<div class="card-header">
|
||||
<span class="fw-bold">{{packet.from_node.long_name}}</span>
|
||||
<a href="/packet_details/{{packet.id}}" hx-trigger="click" hx-target="#packet_details" hx-get="/packet_details/{{packet.id}}" hx-swap="innerHTML scroll:top">🔎</a>
|
||||
</div>
|
||||
<div class="card-text text-start">
|
||||
<dl>
|
||||
<div>{{packet.import_time | format_timestamp}}</div>
|
||||
<div>{{packet.payload}}</div>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
@@ -28,7 +28,8 @@
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="card-title">
|
||||
<a hx-boost="false" href="#" hx-target="#packet_details" hx-get="/packet_details/{{packet.id}}" hx-swap="innerHTML scroll:top">{{packet.id}}</a>
|
||||
{{packet.id}}
|
||||
<a href="/packet_details/{{packet.id}}" hx-target="#packet_details" hx-get="/packet_details/{{packet.id}}" hx-swap="innerHTML scroll:top">🔎</a>
|
||||
<a href="/packet/{{packet.id}}">🔗</a>
|
||||
</div>
|
||||
<div class="card-text text-start">
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
<div id="map"/>
|
||||
|
||||
{% for seen in packets_seen %}
|
||||
<div class="card mt-2">
|
||||
<div class="card-header">
|
||||
|
||||
+37
-2
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user