kopia lustrzana https://github.com/ogre/habboy
111 wiersze
2.2 KiB
Python
111 wiersze
2.2 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import string
|
|
|
|
"""
|
|
Sanitize sentence string.
|
|
Calc and verify CRC code.
|
|
"""
|
|
|
|
|
|
def _hex(Character):
|
|
_hexTable = "0123456789ABCDEF"
|
|
return _hexTable[Character]
|
|
|
|
|
|
def crc(i_str):
|
|
CRC = 0xFFFF
|
|
# xPolynomial = 0x1021;
|
|
|
|
for i in range(len(i_str)):
|
|
CRC ^= ord(i_str[i]) << 8
|
|
for j in range(8):
|
|
if CRC & 0x8000:
|
|
CRC = (CRC << 1) ^ 0x1021
|
|
else:
|
|
CRC <<= 1
|
|
|
|
result = ""
|
|
result += _hex((CRC >> 12) & 15)
|
|
result += _hex((CRC >> 8) & 15)
|
|
result += _hex((CRC >> 4) & 15)
|
|
result += _hex(CRC & 15)
|
|
|
|
return result
|
|
|
|
|
|
def verifyCrc(i_sent):
|
|
i_crc = i_sent[i_sent.rfind("*") + 1 :]
|
|
sent = i_sent[: i_sent.rfind("*")]
|
|
return i_crc == crc(sent)
|
|
|
|
|
|
def formatSentence(i_sent):
|
|
if not i_sent:
|
|
return []
|
|
|
|
lines = i_sent.split("\n")
|
|
result = []
|
|
|
|
for l in lines:
|
|
dollar_index = l.rfind("$")
|
|
l = l[dollar_index + 1 :]
|
|
|
|
star_index = l.find("*")
|
|
if star_index == -1:
|
|
continue
|
|
l = l[: star_index + 5]
|
|
|
|
sentence = l[:-5]
|
|
crc = l[-4:]
|
|
|
|
result.append(sentence + "*" + crc)
|
|
|
|
return result
|
|
|
|
def sentenceToCallsign(i_sent):
|
|
sentences = formatSentence(i_sent)
|
|
if not sentences:
|
|
return None
|
|
sentence = sentences[-1]
|
|
tokens = sentence.split(",")
|
|
if tokens:
|
|
return str(tokens[0])
|
|
return None
|
|
|
|
def sentenceToId(i_sent):
|
|
sentences = formatSentence(i_sent)
|
|
if not sentences:
|
|
return None
|
|
sentence = sentences[-1]
|
|
tokens = sentence.split(",")
|
|
if len(tokens) > 1:
|
|
return int(tokens[1])
|
|
return None
|
|
|
|
def getData(i_sent):
|
|
sentences = formatSentence(i_sent)
|
|
if not sentences:
|
|
return None
|
|
sentence = sentences[-1]
|
|
tokens = sentence.split(",")
|
|
|
|
if not tokens:
|
|
return None
|
|
|
|
# remove callsign
|
|
tokens = tokens[1:]
|
|
|
|
# remove CRC
|
|
tokens[-1] = tokens[-1][0 : tokens[-1].find("*")]
|
|
return tokens
|
|
|
|
|
|
if __name__ == "__main__":
|
|
s = formatSentence(
|
|
"$$$fro3,2141,224553,52.09318,21.00429,127,0,0,0,0,D*5094 DESCEND"
|
|
)[-1]
|
|
print(s)
|
|
print((sentenceToId(s)))
|
|
print((getData(s)))
|