Example #1
0
 def ensure_request_possible(self, request, player_number):
   client = self.prodj.cl.getClient(player_number)
   if client is None:
     raise dataprovider.TemporaryQueryError("DBClient: player {} not found in clientlist".format(player_number))
   critical_requests = ["metadata_request", "artwork_request", "preview_waveform_request", "beatgrid_request", "waveform_request"]
   critical_play_states = ["no_track", "loading_track", "cannot_play_track", "emergency"]
   if request in critical_requests and client.play_state in critical_play_states:
     raise dataprovider.TemporaryQueryError("DataProvider: delaying %s request due to play state: %s".format(request, client.play_state))
Example #2
0
 def socksnd(self, sock, data):
   try:
     sock.send(data)
   except BrokenPipeError as e:
     player_number = next((n for n, d in self.socks.items() if d[0] == sock), None)
     if player_number is None:
       raise dataprovider.FatalQueryError("socksnd failed with unknown sock")
     else:
       self.closeSocket(player_number)
       raise dataprovider.TemporaryQueryError("Connection to player {} lost".format(player_number))
Example #3
0
 def send_setup_packet(self, sock, player_number):
   query = {
     "transaction_id": 0xfffffffe,
     "type": "setup",
     "args": [{"type": "int32", "value": self.own_player_number}]
   }
   sock.send(packets.DBMessage.build(query))
   data = sockrcv(sock, 48)
   if len(data) == 0:
     raise dataprovider.TemporaryQueryError("Failed to connect to player {}".format(player_number))
   reply = packets.DBMessage.parse(data)
   logging.info("DBClient: connected to player {}".format(reply["args"][1]["value"]))
Example #4
0
 def get_server_port(self, player_number):
   if player_number not in self.remote_ports:
     client = self.prodj.cl.getClient(player_number)
     if client is None:
       raise dataprovider.TemporaryQueryError("failed to get remote port, player {} unknown".format(player_number))
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     sock.connect((client.ip_addr, packets.DBServerQueryPort))
     sock.send(packets.DBServerQuery.build({}))
     data = sockrcv(sock, 2)
     sock.close()
     port = packets.DBServerReply.parse(data)
     self.remote_ports[player_number] = (client.ip_addr, port)
     logging.info("DBClient port of player {}: {}".format(player_number, port))
   return self.remote_ports[player_number]
Example #5
0
 def receive_dbmessage(self, sock):
   parse_errors = 0
   receive_timeouts = 0
   data = b""
   while parse_errors < self.parse_error_count and receive_timeouts < self.receive_timeout_count:
     new_data = sockrcv(sock, 4096, 1)
     if len(new_data) == 0:
       receive_timeouts += 1
       continue
     data += new_data
     try:
       return packets.DBMessage.parse(data)
     except RangeError as e:
       logging.debug("DBClient: Received %d bytes but parsing failed, trying to receive more", len(data))
       parse_errors += 1
   raise dataprovider.TemporaryQueryError("Failed to receive dbmessage after {} tries and {} timeouts".format(parse_errors, receive_timeouts))