2020-08-27 13:40:11 +02:00
|
|
|
import re
|
|
|
|
import json
|
|
|
|
|
|
|
|
"""
|
|
|
|
A file for Player utilities, focused around parsing chat and making it human readable.
|
|
|
|
|
|
|
|
The DefaultParser should be able to handle most situations currently,
|
|
|
|
however, there are known weakness's in the approach but as it stands,
|
|
|
|
it is better then other examples I have seen.
|
|
|
|
|
|
|
|
DefaultParser - Tested on mc-central, should work decent globally
|
|
|
|
"""
|
|
|
|
|
|
|
|
# TODO Parse banner messages, example: https://gyazo.com/c0a4cfee23a31fe8b6e4c7c7848e5e5a
|
|
|
|
|
|
|
|
|
|
|
|
def DefaultParser(data):
|
2020-08-27 13:44:18 +02:00
|
|
|
"""The default Player chat packet parser, designed to make chat human readable.
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
data : Chat Packet
|
|
|
|
The chat packet to be parsed.
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
message : str
|
|
|
|
The chat message in human readable form
|
|
|
|
False : bool
|
|
|
|
If the parser encounters an error during parsing
|
|
|
|
|
|
|
|
"""
|
2020-08-27 13:40:11 +02:00
|
|
|
try:
|
|
|
|
# Convert to valid python dict
|
|
|
|
data = json.loads(data)
|
|
|
|
|
|
|
|
# Create the prefix & text
|
|
|
|
prefixing = True
|
|
|
|
data = data["extra"]
|
|
|
|
stringDict = {"prefix": [], "message": []}
|
|
|
|
dm = False
|
|
|
|
|
|
|
|
if isinstance(data[len(data) - 1], str):
|
|
|
|
# Given the last item is a string, rather then dictionary
|
|
|
|
# we can safely assume that this is in fact a /msg
|
|
|
|
dm = True
|
|
|
|
|
|
|
|
for i, item in enumerate(data):
|
|
|
|
# Remove minecraft character stuff
|
|
|
|
if dm and i == len(data) - 1:
|
|
|
|
stringDict["message"].append(item)
|
|
|
|
continue
|
|
|
|
|
|
|
|
text = re.sub(
|
|
|
|
r"\§c|\§f|\§b|\§d|\§a|\§1|\§2|\§3|\§4|\§5|\§6|\§7|\§8|\§9|\§0",
|
|
|
|
"",
|
|
|
|
item["text"],
|
|
|
|
)
|
|
|
|
|
|
|
|
if text.lstrip().rstrip() == ":" and prefixing:
|
|
|
|
# No longer need to handle the before message
|
|
|
|
prefixing = False
|
|
|
|
continue
|
|
|
|
elif prefixing:
|
|
|
|
stringDict["prefix"].append(text)
|
|
|
|
elif not prefixing:
|
|
|
|
if "extra" in item:
|
|
|
|
# Chat parsing for text means this is most likely another nested dict in list situation
|
|
|
|
if len(item["extra"]) > 0:
|
|
|
|
if "text" in item["extra"][0]:
|
|
|
|
text = item["extra"][0]["text"]
|
|
|
|
stringDict["message"].append(text)
|
|
|
|
|
|
|
|
prefix = "".join(stringDict["prefix"])
|
|
|
|
text = " ".join(stringDict["message"]).rstrip().lstrip()
|
|
|
|
|
|
|
|
if len(prefix) > 0 and len(text) > 0:
|
|
|
|
message = ": ".join([prefix, text])
|
|
|
|
elif len(prefix) > 0:
|
|
|
|
message = prefix
|
|
|
|
elif len(text) > 0:
|
|
|
|
message = text
|
|
|
|
|
|
|
|
message = message.lstrip().rstrip()
|
|
|
|
|
|
|
|
return message
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
# print(f"Unable to parse: {data}\nException: {e}")
|
|
|
|
return False
|