From 856fd8df000a5017b958028074010a3b855a8ed4 Mon Sep 17 00:00:00 2001 From: liamcottle Date: Fri, 3 May 2024 23:48:15 +1200 Subject: [PATCH] save received lxmf messages to database --- database.py | 34 ++++++++++++++++++++++++++++++++++ web.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 database.py diff --git a/database.py b/database.py new file mode 100644 index 0000000..783de15 --- /dev/null +++ b/database.py @@ -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" diff --git a/web.py b/web.py index ad4be38..5a590a4 100644 --- a/web.py +++ b/web.py @@ -14,6 +14,8 @@ import asyncio import websockets import base64 +import database + class ReticulumWebChat: @@ -26,6 +28,13 @@ class ReticulumWebChat: self.config_file = webchat_config_file or "storage/config.json" self.load_config() + # init database + self.db = database.database + self.db.connect() + self.db.create_tables([ + database.LxmfMessage, + ]) + # init reticulum self.reticulum = RNS.Reticulum(reticulum_config_dir) self.identity = identity @@ -383,12 +392,15 @@ class ReticulumWebChat: "image_bytes": image_bytes, } + # convert 0.0-1.0 progress to 0.00-100 percentage + progress_percentage = round(lxmf_message.progress * 100, 2) + return { "hash": lxmf_message.hash.hex(), "source_hash": lxmf_message.source_hash.hex(), "destination_hash": lxmf_message.destination_hash.hex(), "state": self.convert_lxmf_state_to_string(lxmf_message), - "progress": lxmf_message.progress, + "progress": progress_percentage, "content": lxmf_message.content.decode('utf-8'), "fields": fields, } @@ -418,6 +430,21 @@ class ReticulumWebChat: def on_lxmf_delivery(self, message): 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 asyncio.run(self.websocket_broadcast(json.dumps({ "type": "lxmf.delivery",