def pull_processor(self, data): _action = data['action'] # from game_server or client: api_key if _action == actions.connect: end_user = db.get_user_from_api_key(data['api_key']) self.connected[end_user.user.shared_key] = time.time() print logging.debug("Connect " + data['api_key'], "[Info]") elif _action == actions.alive: self.connected[data['shared_key']] = float(data['time']) # from client api_key, elif _action == actions.get_games: # TODO if client doesnt exist then raise error client = db.get_user_from_api_key(data['api_key']) print logging.debug(actions.get_games, '[Info]') self.send({'shared_key': client.user.shared_key, }, action=actions.get_games, key=client.server_shared_key) # from game server elif _action == actions.game_list: # replace server shared key with client shared key data['shared_key'] = data['client_shared_key'] key = data['client_shared_key'] # remove that field data = data_filter(data, ['client_shared_key', ]) # publish to that key self.send(data, action=actions.game_list, key=key) # from client select game shared_key elif _action == actions.select_game: client = db.get_user_from_shared_key(data['shared_key']) self.send(data, action=actions.select_game, key=client.server_shared_key) # from client new game: shared_key elif _action == actions.new_game: client = db.get_user_from_shared_key(data['shared_key']) data['session_key'] = session_key_gen() # send server self.send(data, action=actions.new_game, key=client.server_shared_key) data = data_filter(data, ['shared_key', ]) # send to client self.send(data, action=actions.game_session, key=client.user.shared_key) # from client, to make things faster server_shared_key is also sent elif _action == actions.event: key = data['server_shared_key'] data = data_filter(data, ['server_shared_key']) self.send(data, action=actions.event, key=key) # from server. forward this to all clients elif _action == actions.game_state: session_key = data['session_key'] data = data_filter(data, ['session_key']) self.send(data, action=actions.game_state, key=session_key)
def dead_buster(self): while True: iterator = self.connected.keys()[:] for client_shared_key in iterator: if time.time() - self.connected[client_shared_key] > float(config.ALIVE_TIMEOUT): try: client = db.get_user_from_shared_key(client_shared_key) print logging.debug("disconnect " + client.user.shared_key, "[INFO]") data = {'shared_key': client.user.shared_key} self.send(data, action=actions.dead, key=client.server_shared_key) del self.connected[client.user.shared_key] except: # todo take care of servers not responding also. You have to remove all the clients if the server is not responding pass time.sleep(5)