save received lxmf messages to database

This commit is contained in:
liamcottle
2024-05-03 23:48:15 +12:00
parent 175ad1abf3
commit 856fd8df00
2 changed files with 62 additions and 1 deletions

34
database.py Normal file
View File

@@ -0,0 +1,34 @@
from datetime import datetime
from peewee import *
database = SqliteDatabase('storage/reticulum-webchat.db')
class BaseModel(Model):
class Meta:
database = database
class LxmfMessage(BaseModel):
# id = primary key auto increment bigint
id = BigAutoField()
hash = CharField(unique=True) # unique lxmf message hash
source_hash = CharField(index=True)
destination_hash = CharField(index=True)
state = CharField() # state is converted from internal int to a human friendly string
progress = FloatField() # progress is converted from internal float 0.00-1.00 to float between 0.00/100 (2 decimal places)
content = TextField()
fields = TextField() # json string
created_at = DateTimeField(default=datetime.now)
updated_at = DateTimeField(default=datetime.now)
# override save to auto update updated_at when calling save()
def save(self, *args, **kwargs):
self.updated_at = datetime.now()
return super(LxmfMessage, self).save(*args, **kwargs)
# define database and table name
class Meta:
table_name = "lxmf_messages"

29
web.py
View File

@@ -14,6 +14,8 @@ import asyncio
import websockets import websockets
import base64 import base64
import database
class ReticulumWebChat: class ReticulumWebChat:
@@ -26,6 +28,13 @@ class ReticulumWebChat:
self.config_file = webchat_config_file or "storage/config.json" self.config_file = webchat_config_file or "storage/config.json"
self.load_config() self.load_config()
# init database
self.db = database.database
self.db.connect()
self.db.create_tables([
database.LxmfMessage,
])
# init reticulum # init reticulum
self.reticulum = RNS.Reticulum(reticulum_config_dir) self.reticulum = RNS.Reticulum(reticulum_config_dir)
self.identity = identity self.identity = identity
@@ -383,12 +392,15 @@ class ReticulumWebChat:
"image_bytes": image_bytes, "image_bytes": image_bytes,
} }
# convert 0.0-1.0 progress to 0.00-100 percentage
progress_percentage = round(lxmf_message.progress * 100, 2)
return { return {
"hash": lxmf_message.hash.hex(), "hash": lxmf_message.hash.hex(),
"source_hash": lxmf_message.source_hash.hex(), "source_hash": lxmf_message.source_hash.hex(),
"destination_hash": lxmf_message.destination_hash.hex(), "destination_hash": lxmf_message.destination_hash.hex(),
"state": self.convert_lxmf_state_to_string(lxmf_message), "state": self.convert_lxmf_state_to_string(lxmf_message),
"progress": lxmf_message.progress, "progress": progress_percentage,
"content": lxmf_message.content.decode('utf-8'), "content": lxmf_message.content.decode('utf-8'),
"fields": fields, "fields": fields,
} }
@@ -418,6 +430,21 @@ class ReticulumWebChat:
def on_lxmf_delivery(self, message): def on_lxmf_delivery(self, message):
try: try:
# convert lxmf message to dict
lxmf_message_dict = self.convert_lxmf_message_to_dict(message)
# save to database
lxmf_message_db = database.LxmfMessage(
hash=lxmf_message_dict["hash"],
source_hash=lxmf_message_dict["source_hash"],
destination_hash=lxmf_message_dict["destination_hash"],
state=lxmf_message_dict["state"],
progress=lxmf_message_dict["progress"],
content=lxmf_message_dict["content"],
fields=json.dumps(lxmf_message_dict["fields"]),
)
lxmf_message_db.save()
# send received lxmf message data to all websocket clients # send received lxmf message data to all websocket clients
asyncio.run(self.websocket_broadcast(json.dumps({ asyncio.run(self.websocket_broadcast(json.dumps({
"type": "lxmf.delivery", "type": "lxmf.delivery",