Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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 
Beispiel #6
0
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
Beispiel #7
0
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