Add Chattle protocol
This commit is contained in:
parent
c6266c1cae
commit
b328d07269
|
@ -0,0 +1,42 @@
|
||||||
|
import json
|
||||||
|
import struct
|
||||||
|
|
||||||
|
|
||||||
|
class Message:
|
||||||
|
"""
|
||||||
|
Data carrier for messages. Before a Message may be sent over the network, it must be encoded using the
|
||||||
|
`encode_message` function
|
||||||
|
"""
|
||||||
|
def __init__(self, buffer: bytes) -> None:
|
||||||
|
# The byte layout of the structure is a buffer of JSON data preceded by a 2-byte header that specifies how long
|
||||||
|
# it is.
|
||||||
|
message_length_size = 2
|
||||||
|
message_length = struct.unpack(">H", buffer[0:message_length_size])[0]
|
||||||
|
message = json.loads(buffer[message_length_size:(message_length_size + message_length)])
|
||||||
|
self.author = message["author"]
|
||||||
|
self.body = message["body"]
|
||||||
|
|
||||||
|
def as_command(self) -> str:
|
||||||
|
"""
|
||||||
|
Attempts to extract a command from the message.
|
||||||
|
|
||||||
|
:return: Contents of the command without the command character or an empty string if `self` is not a command.
|
||||||
|
"""
|
||||||
|
return (self.body[1:] if self.body.startswith("/") else "")
|
||||||
|
|
||||||
|
|
||||||
|
def encode_message(author: str, body: str) -> bytes:
|
||||||
|
"""
|
||||||
|
Encodes a message in the Chattle protocol format for transporting over a network connection.
|
||||||
|
|
||||||
|
:param author: Screen name of the user that the message originated from
|
||||||
|
:param body: Content of the message. Note that any trailing whitespace characters are stripped.
|
||||||
|
:return: An encoded byte buffer of the message that can be decoded by creating a `Message` instance from it.
|
||||||
|
"""
|
||||||
|
|
||||||
|
message = json.dumps({
|
||||||
|
"author": author,
|
||||||
|
"body": body.strip(),
|
||||||
|
}).encode("utf-8")
|
||||||
|
|
||||||
|
return (struct.pack(">H", len(message)) + message)
|
Loading…
Reference in New Issue