# -*- coding: utf-8 -*- # Modular system for querying game servers. # # Author: Roman Vasiyarov # License: GPLv3 # $Id$ # # Savage 2 module # import sys import struct from datetime import datetime NAMES = [ "name", "version1", "version2", "version3", "hz1", "description", "hz2", "hz2_1", "hz2_2", "hz2_3", "address", "_0x000119_1", "_0x000119_2", "_0x000119_3", "nummods", "modslist", "clients", "clientsmax", "status", "map", "mapnext", "location", "playersmin", "gametype", "version", "unk1", "unk2", "unk3", # should be last "ping" ] #S2_MAGIC = 0xf197de9a # not a complete list unpack_sizes = { "B": 1, "b": 1, "H": 2, "h": 2, "I": 4, "i": 4, } def unpack(fmt, data): """ wrap struct.unpack() to add null-terminated strings 'z' format and pascal length-prefixed string 'p' format """ t = "<" if "!<=>@".find(fmt[0]) != -1: t = fmt[0] fmt = fmt[1:] import binascii out = [] n = 0 for f in fmt: if f == "z": r = data[n:].split(b"\0", 1)[0].decode("utf-8") n += len(r) + 1 elif f == "p": l = struct.unpack(t + "B", data[n])[0] sys.stderr.write("l: %s\n" % l) n += 1 r = struct.unpack(t + "{}s".format(l), data[n:n + l])[0].decode("utf-8") n += l else: r = struct.unpack(t + f, data[n:n + unpack_sizes[f]])[0] r = int(r) n += unpack_sizes[f] out.append(r) return out def process(pkt, verbose=False): n = 16 # "header" size seq = [None] * 4 out = "" if verbose: import binascii # ID PART(0,1+?) try: seq = struct.unpack("