def dataReceived(self, data): self._to_process += bytearray(data) while self._to_process: bytes_to_process = len(self._to_process) if bytes_to_process < 12: break # Enough bytes received to construct a Packet and get # the size of the incoming data p = Packet.from_buffer(self._to_process[:12]) if bytes_to_process < p.size: break # Have enough bytes to process a complete packet p = Packet.from_buffer(self._to_process[:p.size]) self._to_process = self._to_process[p.size:] if p.is_response: self.factory.packets[p.sequence_number][1] = p.words self.notifySubscribers(p.sequence_number, *self.factory.packets.pop(p.sequence_number)) else: # ACK packet. For now, everything is OK! ack = Packet(p.sequence_number, is_response=True, is_client=True, words='OK') self.transport.write(str(ack.to_buffer())) self.notifySubscribers(p.sequence_number, [p.words[0]], p.words)
def recv(sock): # Pull enough to get the int headers and instantiate a Packet out = sock.recv(12) p = Packet.from_buffer(out) packet_size = len(p) # Pull one character at a time until we've recv'd # up to the reported size while len(out) < packet_size: out += sock.recv(1) return out
def test_packet_coversions(self): p = Packet(**packet_attrs) p_copy = Packet.from_buffer(p.to_buffer()) for attr in packet_attrs: assert getattr(p, attr) == getattr(p_copy, attr) # Make sure the copied packet's buffer is still mutable/readable p_copy.sequence_number = 1000 assert p_copy.sequence_number == 1000
def server_status(address, server_port=None, debug=False): # Mapping engine map names to human-readable names map_names = {'MP_Abandoned': 'Zavod 311', 'MP_Damage': 'Lancang Dam', 'MP_Flooded': 'Flood Zone', 'MP_Journey': 'Golmud Railway', 'MP_Naval': 'Paracel Storm', 'MP_Prison': 'Operation Locker', 'MP_Resort': 'Hainan Resort', 'MP_Siege': 'Siege of Shanghai', 'MP_TheDish': 'Rogue Transmission', 'MP_Tremors': 'Dawnbreaker', 'XP1_001': 'Silk Road', 'XP1_002': 'Altai Range', 'XP1_003': 'Guilin Peaks', 'XP1_004': 'Dragon Pass', 'XP0_Caspian': 'Caspian Border', 'XP0_Firestorm': 'Operation Firestorm', 'XP0_Metro': 'Operation Metro', 'XP0_Oman': 'Gulf of Oman', 'XP2_001': 'Lost Islands', 'XP2_002': 'Nansha strike', 'XP2_003': 'WaveBreaker', 'XP2_004': 'Operation Mortar', 'XP3_MarketPl': 'Pearl Market', 'XP3_Prpganda': 'Propaganda', 'XP3_UrbanGdn': 'Lumphini Garden', 'XP3_WtrFront': 'Sunken Dragon', 'XP4_Arctic': 'Operation Whiteout', 'XP4_SubBase': 'Hammerhead', 'XP4_Titan': 'Hangar 21', 'XP4_WlkrFtry': 'Giants of Karelia', 'MP_Bank': 'Bank Job', 'MP_Bloodout': 'The Block', 'MP_Desert05': 'Dustbowl', 'MP_Downtown': 'Downtown', 'MP_Eastside': 'Derailed', 'MP_Glades': 'Everglades', 'MP_Growhouse': 'Growhouse', 'MP_Hills': 'Hollywood Heights', 'MP_OffShore': 'Riptide'} # Mapping engine map modes to human-readable names game_modes = {'AirSuperiority0': 'Air Superiority', 'CaptureTheFlag0': 'Capture the Flag', 'CarrierAssaultSmall0': 'Carrier Assault', 'CarrierAssaultLarge0': 'Carrier Assault Large', 'Chainlink0': 'Chain Link', 'ConquestSmall0': 'Conquest Small', 'ConquestLarge0': 'Conquest Large', 'Elimination0': 'Defuse', 'Domination0': 'Domination', 'Obliteration': 'Obliteration', 'RushLarge0': 'Rush', 'SquadDeathMatch0': 'Squad DM', 'TurfWarLarge0': 'Conquest Large', 'TurfWarSmall0': 'Conquest Small', 'Heist0': 'Heist', 'Hotwire0': 'Hotwire', 'BloodMoney0': 'Blood Money', 'Hit0': 'Crosshair', 'Hostage0': 'Rescue', 'TeamDeathMatch0': 'Team DM', 'GunMaster0': 'Gun Master'} def recv(sock): # Pull enough to get the int headers and instantiate a Packet out = sock.recv(12) p = Packet.from_buffer(out) packet_size = len(p) # Pull one character at a time until we've recv'd # up to the reported size while len(out) < packet_size: out += sock.recv(1) return out try: port = int(server_port) except TypeError: port = 47200 server = address, port sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(server) serverinfo = Packet(1, False, True, 'serverinfo') sock.sendall(serverinfo.to_buffer()) response = Packet.from_buffer(recv(sock)) serverinfo = response.words listplayers = Packet(2, False, True, 'listPlayers all') sock.sendall(listplayers.to_buffer()) response = Packet.from_buffer(recv(sock)) listplayers = response.words sock.close() # Need both of these to go on assert serverinfo[0] == 'OK' assert listplayers[0] == 'OK' # Chomp on the listplayers output and loop out some namedtuples num_fields, the_rest = int(listplayers[1]), listplayers[2:] fields, num_players, players = ( the_rest[:num_fields], the_rest[num_fields], the_rest[num_fields + 1:] ) Player = namedtuple('Player', fields) player_list = list() while players: player_list.append(Player(*players[:num_fields])) players = players[num_fields:] # Print out pretty server name/players if debug: print 'server name: ' + serverinfo[1] print 'players : ' + serverinfo[2] print 'maxplayers : ' + serverinfo[3] print 'mode : ' + serverinfo[4] print 'map : ' + serverinfo[5] player_count = serverinfo[2] + '/' + serverinfo[3] current_map = map_names[serverinfo[5]] current_mode = game_modes[serverinfo[4]] server_name = serverinfo[1] return player_list, player_count, current_map, current_mode, server_name
def server_status(address, server_port=None, debug=False): # Mapping engine map names to human-readable names map_names = { 'MP_Abandoned': 'Zavod 311', 'MP_Damage': 'Lancang Dam', 'MP_Flooded': 'Flood Zone', 'MP_Journey': 'Golmud Railway', 'MP_Naval': 'Paracel Storm', 'MP_Prison': 'Operation Locker', 'MP_Resort': 'Hainan Resort', 'MP_Siege': 'Siege of Shanghai', 'MP_TheDish': 'Rogue Transmission', 'MP_Tremors': 'Dawnbreaker', 'XP1_001': 'Silk Road', 'XP1_002': 'Altai Range', 'XP1_003': 'Guilin Peaks', 'XP1_004': 'Dragon Pass', 'XP0_Caspian': 'Caspian Border', 'XP0_Firestorm': 'Operation Firestorm', 'XP0_Metro': 'Operation Metro', 'XP0_Oman': 'Gulf of Oman', 'XP2_001': 'Lost Islands', 'XP2_002': 'Nansha strike', 'XP2_003': 'WaveBreaker', 'XP2_004': 'Operation Mortar', 'XP3_MarketPl': 'Pearl Market', 'XP3_Prpganda': 'Propaganda', 'XP3_UrbanGdn': 'Lumphini Garden', 'XP3_WtrFront': 'Sunken Dragon', 'XP4_Arctic': 'Operation Whiteout', 'XP4_SubBase': 'Hammerhead', 'XP4_Titan': 'Hangar 21', 'XP4_WlkrFtry': 'Giants of Karelia', 'MP_Bank': 'Bank Job', 'MP_Bloodout': 'The Block', 'MP_Desert05': 'Dustbowl', 'MP_Downtown': 'Downtown', 'MP_Eastside': 'Derailed', 'MP_Glades': 'Everglades', 'MP_Growhouse': 'Growhouse', 'MP_Hills': 'Hollywood Heights', 'MP_OffShore': 'Riptide' } # Mapping engine map modes to human-readable names game_modes = { 'AirSuperiority0': 'Air Superiority', 'CaptureTheFlag0': 'Capture the Flag', 'CarrierAssaultSmall0': 'Carrier Assault', 'CarrierAssaultLarge0': 'Carrier Assault Large', 'Chainlink0': 'Chain Link', 'ConquestSmall0': 'Conquest Small', 'ConquestLarge0': 'Conquest Large', 'Elimination0': 'Defuse', 'Domination0': 'Domination', 'Obliteration': 'Obliteration', 'RushLarge0': 'Rush', 'SquadDeathMatch0': 'Squad DM', 'TurfWarLarge0': 'Conquest Large', 'TurfWarSmall0': 'Conquest Small', 'Heist0': 'Heist', 'Hotwire0': 'Hotwire', 'BloodMoney0': 'Blood Money', 'Hit0': 'Crosshair', 'Hostage0': 'Rescue', 'TeamDeathMatch0': 'Team DM', 'GunMaster0': 'Gun Master' } def recv(sock): # Pull enough to get the int headers and instantiate a Packet out = sock.recv(12) p = Packet.from_buffer(out) packet_size = len(p) # Pull one character at a time until we've recv'd # up to the reported size while len(out) < packet_size: out += sock.recv(1) return out try: port = int(server_port) except TypeError: port = 47200 server = address, port sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(server) serverinfo = Packet(1, False, True, 'serverinfo') sock.sendall(serverinfo.to_buffer()) response = Packet.from_buffer(recv(sock)) serverinfo = response.words listplayers = Packet(2, False, True, 'listPlayers all') sock.sendall(listplayers.to_buffer()) response = Packet.from_buffer(recv(sock)) listplayers = response.words sock.close() # Need both of these to go on assert serverinfo[0] == 'OK' assert listplayers[0] == 'OK' # Chomp on the listplayers output and loop out some namedtuples num_fields, the_rest = int(listplayers[1]), listplayers[2:] fields, num_players, players = (the_rest[:num_fields], the_rest[num_fields], the_rest[num_fields + 1:]) Player = namedtuple('Player', fields) player_list = list() while players: player_list.append(Player(*players[:num_fields])) players = players[num_fields:] # Print out pretty server name/players if debug: print 'server name: ' + serverinfo[1] print 'players : ' + serverinfo[2] print 'maxplayers : ' + serverinfo[3] print 'mode : ' + serverinfo[4] print 'map : ' + serverinfo[5] player_count = serverinfo[2] + '/' + serverinfo[3] current_map = map_names[serverinfo[5]] current_mode = game_modes[serverinfo[4]] server_name = serverinfo[1] return player_list, player_count, current_map, current_mode, server_name
sys.exit(1) try: port = int(sys.argv[2]) except IndexError: port = 47200 server = address, port sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(server) serverinfo = Packet(1, False, True, 'serverinfo') sock.sendall(serverinfo.to_buffer()) response = Packet.from_buffer(recv(sock)) serverinfo = response.words listplayers = Packet(2, False, True, 'listPlayers all') sock.sendall(listplayers.to_buffer()) response = Packet.from_buffer(recv(sock)) listplayers = response.words sock.close() # Need both of these to go on assert serverinfo[0] == 'OK' assert listplayers[0] == 'OK' # Print out pretty server name/players curated_serverinfo = (serverinfo[1], serverinfo[2], serverinfo[3])