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.
53 lines
1.5 KiB
53 lines
1.5 KiB
import io
|
|
|
|
from a2s.exceptions import BrokenMessageError
|
|
from a2s.defaults import default_encoding, default_timeout
|
|
from a2s.a2sstream import request
|
|
from a2s.byteio import ByteReader
|
|
|
|
|
|
|
|
A2S_RULES_RESPONSE = 0x45
|
|
A2S_CHALLENGE_RESPONSE = 0x41
|
|
|
|
class RulesResponse:
|
|
def __init__(self, rule_count, rules):
|
|
self.rule_count = rule_count
|
|
self.rules = rules
|
|
|
|
def rules(address, challenge=0, timeout=default_timeout):
|
|
resp_data = request(
|
|
address, b"\x56" + challenge.to_bytes(4, "little"), timeout)
|
|
reader = ByteReader(
|
|
io.BytesIO(resp_data), endian="<", encoding=default_encoding)
|
|
|
|
# A2S_RESPONSE misteriously seems to add a FF FF FF FF
|
|
# long to the beginning of the response which isn't
|
|
# mentioned on the wiki.
|
|
#
|
|
# Behaviour witnessed with TF2 server 94.23.226.200:2045
|
|
# As of 2015-11-22, Quake Live servers on steam do not
|
|
# Source: valve-python messages.py
|
|
if reader.peek(4) == b"\xFF\xFF\xFF\xFF":
|
|
reader.read(4)
|
|
|
|
response_type = reader.read_uint8()
|
|
if response_type == A2S_CHALLENGE_RESPONSE:
|
|
challenge = reader.read_int32()
|
|
return rules(address, challenge, timeout)
|
|
|
|
if response_type != A2S_RULES_RESPONSE:
|
|
raise BrokenMessageError(
|
|
"Invalid response type: " + str(response_type))
|
|
|
|
rule_count = reader.read_int16()
|
|
resp = RulesResponse(
|
|
rule_count=rule_count,
|
|
rules={
|
|
reader.read_cstring(): reader.read_cstring()
|
|
for rule_num in range(rule_count)
|
|
}
|
|
)
|
|
|
|
return resp
|
|
|
|
|