# -*- coding: utf-8 -*- # Modular system for querying game servers. # # Author: Roman Vasiyarov # License: GPLv3 # $Id$ # # Murmur module # import sys import struct from datetime import datetime NAMES = [ "version", "seq1", "seq2", "clients", "maxclients", "bandwidth", # should be last "ping" ] def process(pkt): n = 24 # "header" size out = [] try: seq = struct.unpack(">IIIIII", pkt[:n]) out = list(seq) except: return [None] * (len(NAMES) - 1) # humanify version out[0] = "%d.%d.%d" % ( (out[0] & 0x00FF0000) >> 16, (out[0] & 0x0000FF00) >> 8, (out[0] & 0x000000FF), ) return out def query(sock, servers, verbose = False): if not sock or not len(servers): return ver = 0 seq1 = 0xdeadbeef # shoud be random seq2 = 0x9dfecb0f # probably same as above info = {} pkt = struct.pack(">III", ver, seq1, seq2) # send queries for sv in servers: if verbose: sys.stderr.write("sending query to %s...\n" % repr(sv)) info[sv] = [None, datetime.utcnow()] sock.sendto(pkt, 0, sv) return info