def css_get_players(sock, chal=None): if chal == None: chal = css_get_challenge(sock) ms1 = fragmon.get_millis() sock.send(GET_PLAYERS + chal) sinfo = css_recv_multi_packet(sock) ms2 = fragmon.get_millis() ping = ms2 - ms1 header = sinfo[4] assert header == "D", "bad header for get players" player_count = ord(sinfo[5]) pos = 6 players = [] while pos < len(sinfo): plr = Player() plr.id, pos = query.parse_num(sinfo, pos, bytes=1) plr.name, pos = query.parse_str(sinfo, pos) plr.score, pos = query.parse_num(sinfo, pos, bytes=4) pos += 4 # XXX: player time not included players.append(plr) return ping, players, chal
def ut2_get_info(sock): ms1 = fragmon.get_millis() sock.send(SERVER_INFO) sinf = sock.recv(65535) ms2 = fragmon.get_millis() ping = ms2 - ms1 header = sinf[0] query_type = sinf[4] assert ord(query_type) == 0, 'invalid info reply' info = UT2Info(teamAname = 'Red', teamBname = 'Blue', teamAcolor=0xffb1b1, teamBcolor=0xa6acff) #start past headder and other fluff pos = 10 info.game_port, pos = query.parse_num(sinf, pos, bytes=4) #get game port #move past more fluff pos += 4 info.hostname, pos = ut_parse_str(sinf, pos) info.map, pos = ut_parse_str(sinf, pos) info.type, pos = ut_parse_str(sinf, pos) info.curplayers, pos = query.parse_num(sinf, pos, bytes=4) info.maxplayers, pos = query.parse_num(sinf, pos, bytes=4) info.ping = ping gt = info.type.lower() if gt.find('ctf') >= 0 or gt.find('team') or gt.find('onslaught') >= 0: info.mode = "team" else: info.mode = "1v1" return ping, info
def ut2_get_players(sock): if isinstance(sock, str): ping = 0 sinf = sock else: ms1 = fragmon.get_millis() sock.send(PLAYER_INFO) sinf = sock.recv(65535) ms2 = fragmon.get_millis() ping = ms2 - ms1 header = sinf[0] query_type = sinf[4] assert ord(query_type) == 2, 'invalid server info reply' pos = 5 #print repr(sinf) #print repr(sinf[pos:]) players =[] while pos < len(sinf): plr = Player() plr.id, pos = query.parse_num(sinf, pos, bytes=4) plr.name, pos = ut_parse_str(sinf, pos) plr.ping, pos = query.parse_num(sinf, pos, bytes=4) plr.score, pos = query.parse_num(sinf, pos, bytes=4, signed=True) stats, pos = query.parse_num(sinf, pos, bytes=4) if (stats & 1L<<29): plr.team = "Red" plr.teamid = 0 elif (stats & 1L<<30): plr.team = "Blue" plr.teamid = 1
def ut2_get_rules(sock): if isinstance(sock, str): ping = 0 sinf = sock else: ms1 = fragmon.get_millis() sock.send(GAME_INFO) sinf = sock.recv(65535) ms2 = fragmon.get_millis() ping = ms2 - ms1 print 'RULES', repr(sinf) header = sinf[0] query_type = sinf[4] print 'RULEHEAD', ord(header), ord(query_type) assert ord(query_type) == 1, 'invalid server info reply' pos = 5 cvars = [] cvar = [] key = True while pos < len(sinf): s, pos = ut_parse_str(sinf, pos) cvar.append(s) if not key: cvars.append(Rule(cvar[0], cvar[1])) cvar = [] key = not key return ping, cvars
def q4_query(serv, port): ms1 = fragmon.get_millis() s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect((serv, port)) s.send(QUERYCMD) respbuf = s.recv(RESPSIZE) ms2 = fragmon.get_millis() ping = ms2 - ms1 assert respbuf[:len(QUERYRESP)] == QUERYRESP, 'invalid response from server' #print 'RESPBUF', repr(respbuf) respbuf = respbuf[QUERYHEADLEN:] #find the end of the server variables varend = respbuf.find('\x00\x00\x00') assert varend >= 0, 'invalid response from server' vbuf = respbuf[:varend] pbuf = respbuf[varend+3:-5] #-5, last 5 bytes don't seem to be very meaningful... pi, rules, overview = q4_make_goods(vbuf) players = q4_make_players(pbuf, pi) overview.ping = ping overview.curplayers = len(players) return overview, players, rules
def css_get_rules(sock, chal=None): if chal == None: chal = css_get_challenge(sock) ms1 = fragmon.get_millis() sock.send(GET_RULES + chal) sinfo = css_recv_multi_packet(sock) ms2 = fragmon.get_millis() ping = ms2 - ms1 header = sinfo[4] assert header == "E", "bad header for get rules" pos = 5 rules_count, pos = query.parse_num(sinfo, pos, bytes=2) rules = [] while pos < len(sinfo): key, pos = query.parse_str(sinfo, pos) value, pos = query.parse_str(sinfo, pos) rules.append(Rule(key, value)) return ping, rules, chal
def css_get_info(sock): ms1 = fragmon.get_millis() sock.send(GET_SINFO) sinfo = css_recv_multi_packet(sock) ms2 = fragmon.get_millis() ping = ms2 - ms1 header = sinfo[4] # CS:source or old half-life if header == "I": cs_source = True info = css_get_info_source(sinfo, 6) elif header == "m": cs_source = False info = css_get_info_hl1(sinfo, 5) else: assert False, "Unknown HL packet!" info.ping = ping info.mode = "team" return ping, info