FreeDATA/modem/message_p2p.py

105 lines
4.3 KiB
Python
Raw Permalink Normal View History

2024-01-18 10:35:44 +00:00
import datetime
import api_validations
import base64
import json
2024-01-27 11:07:07 +00:00
from message_system_db_manager import DatabaseManager
from message_system_db_messages import DatabaseManagerMessages
2024-02-02 18:37:02 +00:00
#import command_message_send
2024-01-27 11:07:07 +00:00
2024-02-24 20:49:53 +00:00
def message_received(event_manager, state_manager, data, statistics):
2024-01-27 11:07:07 +00:00
decompressed_json_string = data.decode('utf-8')
received_message_obj = MessageP2P.from_payload(decompressed_json_string)
2024-01-29 16:50:28 +00:00
received_message_dict = MessageP2P.to_dict(received_message_obj)
2024-02-24 20:49:53 +00:00
DatabaseManagerMessages(event_manager).add_message(received_message_dict, statistics, direction='receive', status='received', is_read=False)
2024-01-29 16:50:28 +00:00
2024-02-24 20:49:53 +00:00
def message_transmitted(event_manager, state_manager, data, statistics):
2024-02-07 18:43:10 +00:00
decompressed_json_string = data.decode('utf-8')
payload_message_obj = MessageP2P.from_payload(decompressed_json_string)
payload_message = MessageP2P.to_dict(payload_message_obj)
2024-02-24 21:10:41 +00:00
# Todo we need to optimize this - WIP
DatabaseManagerMessages(event_manager).update_message(payload_message["id"], update_data={'status': 'transmitted'})
DatabaseManagerMessages(event_manager).update_message(payload_message["id"], update_data={'statistics': statistics})
2024-02-07 18:43:10 +00:00
2024-02-24 20:49:53 +00:00
def message_failed(event_manager, state_manager, data, statistics):
2024-01-29 16:50:28 +00:00
decompressed_json_string = data.decode('utf-8')
2024-02-02 18:37:02 +00:00
payload_message_obj = MessageP2P.from_payload(decompressed_json_string)
payload_message = MessageP2P.to_dict(payload_message_obj)
2024-02-24 21:10:41 +00:00
# Todo we need to optimize this - WIP
DatabaseManagerMessages(event_manager).update_message(payload_message["id"], update_data={'status': 'failed'})
DatabaseManagerMessages(event_manager).update_message(payload_message["id"], update_data={'statistics': statistics})
2024-01-18 10:35:44 +00:00
class MessageP2P:
2024-01-29 16:50:28 +00:00
def __init__(self, id: str, origin: str, destination: str, body: str, attachments: list) -> None:
self.id = id
2024-01-18 10:35:44 +00:00
self.timestamp = datetime.datetime.now().isoformat()
self.origin = origin
self.destination = destination
self.body = body
self.attachments = attachments
@classmethod
def from_api_params(cls, origin: str, params: dict):
2024-02-02 18:37:02 +00:00
destination = params['destination']
if not api_validations.validate_freedata_callsign(destination):
destination = f"{destination}-0"
2024-01-18 10:35:44 +00:00
2024-02-02 18:37:02 +00:00
if not api_validations.validate_freedata_callsign(destination):
raise ValueError(f"Invalid destination given ({params['destination']})")
2024-01-18 10:35:44 +00:00
body = params['body']
attachments = []
if 'attachments' in params:
for a in params['attachments']:
api_validations.validate_message_attachment(a)
attachments.append(cls.__decode_attachment__(a))
2024-01-18 10:35:44 +00:00
2024-01-29 16:50:28 +00:00
timestamp = datetime.datetime.now().isoformat()
2024-02-02 18:37:02 +00:00
if 'id' not in params:
msg_id = f"{origin}_{destination}_{timestamp}"
else:
msg_id = params["id"]
2024-01-29 16:50:28 +00:00
2024-02-02 18:37:02 +00:00
return cls(msg_id, origin, destination, body, attachments)
2024-01-18 10:35:44 +00:00
@classmethod
def from_payload(cls, payload):
payload_message = json.loads(payload)
attachments = list(map(cls.__decode_attachment__, payload_message['attachments']))
2024-01-29 16:50:28 +00:00
return cls(payload_message['id'], payload_message['origin'], payload_message['destination'],
payload_message['body'], attachments)
2024-01-18 10:35:44 +00:00
def get_id(self) -> str:
return f"{self.origin}_{self.destination}_{self.timestamp}"
def __encode_attachment__(self, binary_attachment: dict):
encoded_attachment = binary_attachment.copy()
encoded_attachment['data'] = str(base64.b64encode(binary_attachment['data']), 'utf-8')
return encoded_attachment
2024-01-18 10:35:44 +00:00
def __decode_attachment__(encoded_attachment: dict):
decoded_attachment = encoded_attachment.copy()
decoded_attachment['data'] = base64.b64decode(encoded_attachment['data'])
return decoded_attachment
2024-01-29 16:50:28 +00:00
def to_dict(self):
2024-01-18 10:35:44 +00:00
"""Make a dictionary out of the message data
"""
return {
2024-01-29 16:50:28 +00:00
'id': self.id,
2024-01-18 10:35:44 +00:00
'origin': self.origin,
'destination': self.destination,
'body': self.body,
'attachments': list(map(self.__encode_attachment__, self.attachments)),
2024-01-18 10:35:44 +00:00
}
def to_payload(self):
"""Make a byte array ready to be sent out of the message data"""
json_string = json.dumps(self.to_dict())
return json_string
2024-01-27 11:07:07 +00:00