kopia lustrzana https://github.com/mate-dev/meshtastic-matrix-relay
Merge pull request #51 from geoffwhittington/shortnames
Shortname supportfeature/plugins-parameters
commit
d60db97023
30
db_utils.py
30
db_utils.py
|
@ -9,6 +9,9 @@ def initialize_database():
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"CREATE TABLE IF NOT EXISTS longnames (meshtastic_id TEXT PRIMARY KEY, longname TEXT)"
|
"CREATE TABLE IF NOT EXISTS longnames (meshtastic_id TEXT PRIMARY KEY, longname TEXT)"
|
||||||
)
|
)
|
||||||
|
cursor.execute(
|
||||||
|
"CREATE TABLE IF NOT EXISTS shortnames (meshtastic_id TEXT PRIMARY KEY, shortname TEXT)"
|
||||||
|
)
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"CREATE TABLE IF NOT EXISTS plugin_data (plugin_name TEXT, meshtastic_id TEXT, data TEXT, PRIMARY KEY (plugin_name, meshtastic_id))"
|
"CREATE TABLE IF NOT EXISTS plugin_data (plugin_name TEXT, meshtastic_id TEXT, data TEXT, PRIMARY KEY (plugin_name, meshtastic_id))"
|
||||||
)
|
)
|
||||||
|
@ -81,7 +84,6 @@ def save_longname(meshtastic_id, longname):
|
||||||
)
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
|
|
||||||
def update_longnames(nodes):
|
def update_longnames(nodes):
|
||||||
if nodes:
|
if nodes:
|
||||||
for node in nodes.values():
|
for node in nodes.values():
|
||||||
|
@ -90,3 +92,29 @@ def update_longnames(nodes):
|
||||||
meshtastic_id = user["id"]
|
meshtastic_id = user["id"]
|
||||||
longname = user.get("longName", "N/A")
|
longname = user.get("longName", "N/A")
|
||||||
save_longname(meshtastic_id, longname)
|
save_longname(meshtastic_id, longname)
|
||||||
|
|
||||||
|
def get_shortname(meshtastic_id):
|
||||||
|
with sqlite3.connect("meshtastic.sqlite") as conn:
|
||||||
|
cursor = conn.cursor()
|
||||||
|
cursor.execute(
|
||||||
|
"SELECT shortname FROM shortnames WHERE meshtastic_id=?", (meshtastic_id,))
|
||||||
|
result = cursor.fetchone()
|
||||||
|
return result[0] if result else None
|
||||||
|
|
||||||
|
def save_shortname(meshtastic_id, shortname):
|
||||||
|
with sqlite3.connect("meshtastic.sqlite") as conn:
|
||||||
|
cursor = conn.cursor()
|
||||||
|
cursor.execute(
|
||||||
|
"INSERT OR REPLACE INTO shortnames (meshtastic_id, shortname) VALUES (?, ?)",
|
||||||
|
(meshtastic_id, shortname),
|
||||||
|
)
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
def update_shortnames(nodes):
|
||||||
|
if nodes:
|
||||||
|
for node in nodes.values():
|
||||||
|
user = node.get("user")
|
||||||
|
if user:
|
||||||
|
meshtastic_id = user["id"]
|
||||||
|
shortname = user.get("shortName", "N/A")
|
||||||
|
save_shortname(meshtastic_id, shortname)
|
7
main.py
7
main.py
|
@ -9,7 +9,7 @@ from nio import (
|
||||||
)
|
)
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
from typing import List
|
from typing import List
|
||||||
from db_utils import initialize_database, update_longnames
|
from db_utils import initialize_database, update_longnames, update_shortnames
|
||||||
from matrix_utils import (
|
from matrix_utils import (
|
||||||
connect_matrix,
|
connect_matrix,
|
||||||
join_matrix_room,
|
join_matrix_room,
|
||||||
|
@ -70,8 +70,9 @@ async def main():
|
||||||
# Start the Matrix client
|
# Start the Matrix client
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
# Update longnames
|
# Update longnames & shortnames
|
||||||
update_longnames(meshtastic_interface.nodes)
|
update_longnames(meshtastic_interface.nodes)
|
||||||
|
update_shortnames(meshtastic_interface.nodes)
|
||||||
|
|
||||||
matrix_logger.info("Syncing with server...")
|
matrix_logger.info("Syncing with server...")
|
||||||
await matrix_client.sync_forever(timeout=30000)
|
await matrix_client.sync_forever(timeout=30000)
|
||||||
|
@ -79,7 +80,7 @@ async def main():
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
matrix_logger.error(f"Error syncing with server: {e}")
|
matrix_logger.error(f"Error syncing with server: {e}")
|
||||||
|
|
||||||
await asyncio.sleep(60) # Update longnames every 60 seconds
|
await asyncio.sleep(60) # Update longnames & shortnames every 60 seconds
|
||||||
|
|
||||||
|
|
||||||
asyncio.run(main())
|
asyncio.run(main())
|
||||||
|
|
|
@ -93,13 +93,14 @@ async def join_matrix_room(matrix_client, room_id_or_alias: str) -> None:
|
||||||
|
|
||||||
|
|
||||||
# Send message to the Matrix room
|
# Send message to the Matrix room
|
||||||
async def matrix_relay(room_id, message, longname, meshnet_name):
|
async def matrix_relay(room_id, message, longname, shortname, meshnet_name):
|
||||||
matrix_client = await connect_matrix()
|
matrix_client = await connect_matrix()
|
||||||
try:
|
try:
|
||||||
content = {
|
content = {
|
||||||
"msgtype": "m.text",
|
"msgtype": "m.text",
|
||||||
"body": message,
|
"body": message,
|
||||||
"meshtastic_longname": longname,
|
"meshtastic_longname": longname,
|
||||||
|
"meshtastic_shortname": shortname,
|
||||||
"meshtastic_meshnet": meshnet_name,
|
"meshtastic_meshnet": meshnet_name,
|
||||||
}
|
}
|
||||||
await asyncio.wait_for(
|
await asyncio.wait_for(
|
||||||
|
@ -156,6 +157,7 @@ async def on_room_message(
|
||||||
text = event.body.strip()
|
text = event.body.strip()
|
||||||
|
|
||||||
longname = event.source["content"].get("meshtastic_longname")
|
longname = event.source["content"].get("meshtastic_longname")
|
||||||
|
shortname = event.source["content"].get("meshtastic_shortname", None)
|
||||||
meshnet_name = event.source["content"].get("meshtastic_meshnet")
|
meshnet_name = event.source["content"].get("meshtastic_meshnet")
|
||||||
suppress = event.source["content"].get("mmrelay_suppress")
|
suppress = event.source["content"].get("mmrelay_suppress")
|
||||||
local_meshnet_name = relay_config["meshtastic"]["meshnet_name"]
|
local_meshnet_name = relay_config["meshtastic"]["meshnet_name"]
|
||||||
|
@ -168,9 +170,11 @@ async def on_room_message(
|
||||||
full_display_name = f"{longname}/{meshnet_name}"
|
full_display_name = f"{longname}/{meshnet_name}"
|
||||||
if meshnet_name != local_meshnet_name:
|
if meshnet_name != local_meshnet_name:
|
||||||
logger.info(f"Processing message from remote meshnet: {text}")
|
logger.info(f"Processing message from remote meshnet: {text}")
|
||||||
short_longname = longname[:3]
|
|
||||||
short_meshnet_name = meshnet_name[:4]
|
short_meshnet_name = meshnet_name[:4]
|
||||||
prefix = f"{short_longname}/{short_meshnet_name}: "
|
# If shortname is None, truncate the longname to 3 characters
|
||||||
|
if shortname is None:
|
||||||
|
shortname = longname[:3]
|
||||||
|
prefix = f"{shortname}/{short_meshnet_name}: "
|
||||||
text = re.sub(
|
text = re.sub(
|
||||||
rf"^\[{full_display_name}\]: ", "", text
|
rf"^\[{full_display_name}\]: ", "", text
|
||||||
) # Remove the original prefix from the text
|
) # Remove the original prefix from the text
|
||||||
|
|
|
@ -6,7 +6,7 @@ from typing import List
|
||||||
|
|
||||||
from config import relay_config
|
from config import relay_config
|
||||||
from log_utils import get_logger
|
from log_utils import get_logger
|
||||||
from db_utils import get_longname
|
from db_utils import get_longname, get_shortname
|
||||||
from plugin_loader import load_plugins
|
from plugin_loader import load_plugins
|
||||||
|
|
||||||
matrix_rooms: List[dict] = relay_config["matrix_rooms"]
|
matrix_rooms: List[dict] = relay_config["matrix_rooms"]
|
||||||
|
@ -115,6 +115,7 @@ def on_meshtastic_message(packet, loop=None):
|
||||||
)
|
)
|
||||||
|
|
||||||
longname = get_longname(sender) or sender
|
longname = get_longname(sender) or sender
|
||||||
|
shortname = get_shortname(sender) or sender
|
||||||
meshnet_name = relay_config["meshtastic"]["meshnet_name"]
|
meshnet_name = relay_config["meshtastic"]["meshnet_name"]
|
||||||
|
|
||||||
formatted_message = f"[{longname}/{meshnet_name}]: {text}"
|
formatted_message = f"[{longname}/{meshnet_name}]: {text}"
|
||||||
|
@ -149,6 +150,7 @@ def on_meshtastic_message(packet, loop=None):
|
||||||
room["id"],
|
room["id"],
|
||||||
formatted_message,
|
formatted_message,
|
||||||
longname,
|
longname,
|
||||||
|
shortname,
|
||||||
meshnet_name,
|
meshnet_name,
|
||||||
),
|
),
|
||||||
loop=loop,
|
loop=loop,
|
||||||
|
|
Ładowanie…
Reference in New Issue