mirror of
https://github.com/pablorevilla-meshtastic/meshview.git
synced 2026-03-04 23:27:46 +01:00
Adding screenshots
This commit is contained in:
+1
-1
@@ -6,7 +6,7 @@ acme_challenge =
|
||||
|
||||
[mqtt]
|
||||
server = mqtt.bayme.sh
|
||||
topics = ['msh/US/bayarea/#', 'msh/US/CA/mrymesh/#']
|
||||
topics = ["msh/US/bayarea/#"]
|
||||
port = 1883
|
||||
username = meshdev
|
||||
password = large4cats
|
||||
|
||||
@@ -6,6 +6,7 @@ from meshview import database
|
||||
from meshview import store
|
||||
from meshview import web
|
||||
from meshview import http
|
||||
import json
|
||||
|
||||
|
||||
async def load_database_from_mqtt(mqtt_server: str , mqtt_port: int, topic: str, mqtt_user: str | None = None, mqtt_passwd: str | None = None):
|
||||
@@ -23,10 +24,11 @@ async def main(config):
|
||||
mqtt_user: str = config["mqtt"]["username"]
|
||||
if config["mqtt"]["password"] != "":
|
||||
mqtt_passwd: str = config["mqtt"]["password"]
|
||||
mqtt_topics = json.loads(config["mqtt"]["topics"])
|
||||
|
||||
async with asyncio.TaskGroup() as tg:
|
||||
tg.create_task(
|
||||
load_database_from_mqtt(config["mqtt"]["server"], int(config["mqtt"]["port"]), config["mqtt"]["topics"], mqtt_user, mqtt_passwd)
|
||||
load_database_from_mqtt(config["mqtt"]["server"], int(config["mqtt"]["port"]), mqtt_topics, mqtt_user, mqtt_passwd)
|
||||
)
|
||||
tg.create_task(
|
||||
web.run_server(
|
||||
|
||||
@@ -33,6 +33,7 @@ async def get_topic_envelopes(mqtt_server, mqtt_port, topics, mqtt_user, mqtt_pa
|
||||
mqtt_server, port=mqtt_port , username=mqtt_user, password=mqtt_passwd , identifier=identifier,
|
||||
) as client:
|
||||
for topic in topics:
|
||||
print(topic)
|
||||
await client.subscribe(topic)
|
||||
async for msg in client.messages:
|
||||
try:
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<div class="container" > Weekly Mesh check-in. We will keep it open on every Wednesday from 5:00pm for checkins so you do not have to rush.<br>
|
||||
The message format should be (LONG NAME) - (CITY YOU ARE IN) #BayMeshNet.<br><br>
|
||||
</div>
|
||||
<div class="container" hx-ext="sse" sse-connect="/net_events" sse-swap="net_packet" hx-swap="afterbegin">
|
||||
<div class="container">
|
||||
{% for packet in packets %}
|
||||
{% include 'chat_packet.html' %}
|
||||
{% else %}
|
||||
|
||||
+1
-37
@@ -1573,7 +1573,7 @@ async def net(request):
|
||||
raise # Let aiohttp handle HTTP exceptions properly
|
||||
|
||||
except Exception as e:
|
||||
print("Error processing chat request")
|
||||
print("Error processing net request")
|
||||
return web.Response(
|
||||
text="An internal server error occurred.",
|
||||
status=500,
|
||||
@@ -1581,42 +1581,6 @@ async def net(request):
|
||||
)
|
||||
|
||||
|
||||
@routes.get("/net_events")
|
||||
async def net_events(request):
|
||||
chat_packet = env.get_template("net_packet.html")
|
||||
|
||||
# Precompile regex for performance (case insensitive)
|
||||
seq_pattern = re.compile(r"seq \d+$")
|
||||
|
||||
with notify.subscribe(node_id=0xFFFFFFFF) as event:
|
||||
async with sse_response(request) as resp:
|
||||
while resp.is_connected():
|
||||
try:
|
||||
await asyncio.wait_for(event.wait(), timeout=10)
|
||||
except asyncio.TimeoutError:
|
||||
continue # Timeout occurred, loop again
|
||||
|
||||
if event.is_set():
|
||||
# Ensure event.packets is valid before accessing it
|
||||
packets = [
|
||||
p for p in (event.packets or [])
|
||||
if p.portnum == PortNum.TEXT_MESSAGE_APP
|
||||
]
|
||||
event.clear()
|
||||
|
||||
try:
|
||||
for packet in packets:
|
||||
ui_packet = Packet.from_model(packet)
|
||||
if not seq_pattern.match(ui_packet.payload) and "baymeshnet" in ui_packet.payload.lower():
|
||||
await resp.send(
|
||||
chat_packet.render(packet=ui_packet),
|
||||
event="net_packet",
|
||||
)
|
||||
except ConnectionResetError:
|
||||
print("Client disconnected from SSE stream.")
|
||||
return # Gracefully exit on disconnection
|
||||
|
||||
|
||||
@routes.get("/map")
|
||||
async def map(request):
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user