You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.0 KiB
122 lines
3.0 KiB
import typing |
|
import datetime |
|
import dataclasses |
|
|
|
import crypto |
|
import message_codec |
|
|
|
|
|
def create_frame(frame_type, recipient, originator, content, password): |
|
main_frame = f"{frame_type}#{recipient}#{originator}#{content}" |
|
|
|
checksum = crypto.find_checksum(main_frame) |
|
auth_code = crypto.find_auth_code(password, main_frame) |
|
|
|
return f"\nLEONET {main_frame} {checksum} {auth_code} TENOEL\n" |
|
|
|
|
|
@dataclasses.dataclass |
|
class MsgFrame: |
|
recipient: str |
|
originator: str |
|
message: str |
|
timestamp: dataclasses.InitVar[typing.Optional[str]] = None |
|
message_id: dataclasses.InitVar[typing.Optional[str]] = None |
|
|
|
def __post_init__(self, message_id, timestamp): |
|
if timestamp is not None: |
|
self.timestamp = timestamp |
|
else: |
|
self.timestamp = datetime.datetime.utcnow().isoformat() |
|
|
|
if message_id is not None: |
|
self.message_id = message_id |
|
else: |
|
safe_message = message_codec.encode(self.message) |
|
body = f"{self.timestamp}&{safe_message}" |
|
self.message_id = crypto.find_checksum(body) |
|
|
|
self.frame_recipient = self.recipient |
|
|
|
def encode(self, password=""): |
|
safe_message = message_codec.encode(self.message) |
|
body = f"{self.timestamp}&{safe_message}" |
|
message_id = crypto.find_checksum(body) |
|
full_body = f"{body};{message_id}" |
|
|
|
return create_frame( |
|
"MSG", self.recipient, self.originator, full_body, password |
|
) |
|
|
|
def gen_ack(self): |
|
return frames.AckFrame( |
|
self.recipient, |
|
self.originator, |
|
self.message_id, |
|
) |
|
|
|
def gen_nak(self): |
|
return frames.NakFrame( |
|
self.recipient, |
|
self.originator, |
|
self.message_id, |
|
) |
|
|
|
|
|
@dataclasses.dataclass |
|
class QryFrame: |
|
recipient: str |
|
originator: str |
|
message_id: str |
|
|
|
def __post_init__(self): |
|
self.frame_recipient = self.recipient |
|
|
|
def encode(self, password=""): |
|
return create_frame( |
|
"QRY", self.recipient, self.originator, self.message_id, password |
|
) |
|
|
|
def gen_ack(self): |
|
return frames.AckFrame( |
|
self.recipient, |
|
self.originator, |
|
self.message_id, |
|
) |
|
|
|
def gen_nak(self): |
|
return frames.NakFrame( |
|
self.recipient, |
|
self.originator, |
|
self.message_id, |
|
) |
|
|
|
|
|
@dataclasses.dataclass |
|
class AckFrame: |
|
recipient: str |
|
originator: str |
|
message_id: str |
|
|
|
def __post_init__(self): |
|
self.frame_recipient = self.originator |
|
|
|
def encode(self, password=""): |
|
return create_frame( |
|
"ACK", self.recipient, self.originator, self.message_id, password |
|
) |
|
|
|
|
|
@dataclasses.dataclass |
|
class NakFrame: |
|
recipient: str |
|
originator: str |
|
message_id: str |
|
|
|
def __post_init__(self): |
|
self.frame_recipient = self.originator |
|
|
|
def encode(self, password=""): |
|
return create_frame( |
|
"NAK", self.recipient, self.originator, self.message_id, password |
|
)
|
|
|