# -*- 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", "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 """ t = "<" if "!<=>@".find(fmt[0]) != -1: t = fmt[0] fmt = fmt[1:] out = [] n = 0 for f in fmt: if f != "z": r = struct.unpack(t + f, data[n:n + unpack_sizes[f]])[0] r = int(r) n += unpack_sizes[f] else: r = data[n:].split(b"\0", 1)[0].decode("utf-8") n += len(r) + 1 out.append(r) return out def process(pkt, verbose=False): n = 12 # "header" size seq = [None] * 5 out = "" try: seq = struct.unpack("