def connect(self): if self.serverpeer is not None: raise network.AlreadyConnected("We are already connected to a server") if self.mode is None: self.mode = ClientMode.Server if self.mode is not ClientMode.Server: raise network.NotInServerMode("You can't connect to a server while client is not in server mode") self.log.debug("[CONNECT] to server %s" % (self.serveraddress)) try: self.serverpeer = self.host.connect(enet.Address(self.serveraddress.host, self.serveraddress.port), 1, 0) except (IOError, MemoryError): raise network.NetworkException("Unable to connect to server. Maybe invalid or irresolvable server address.") self.mode = ClientMode.Server event = self.host.service(SERVER_TIMEOUT) if event.type != enet.EVENT_TYPE_CONNECT: self.reset() raise network.UnableToConnect("Unable to connect to server") self.log.debug("[CONNECT] done") if self.localport is None and hasattr(socket, 'fromfd'): s = socket.fromfd(self.host.socket.fileno(), socket.AF_INET, socket.SOCK_DGRAM) self.localport = s.getsockname()[1] if self.localport is not None: self.log.debug("[CONNECT] localport=%s" % (self.localport)) if self.extport is None: self.extport = self.upnp_connect(self.localport) if self.extport is None: self.extport = self.natpmp_connect(self.localport) else: self.log.debug("[CONNECT] Unable to determine local port");
def connect(self): if self.serverpeer is not None: raise network.AlreadyConnected( "We are already connected to a server") if self.mode is None: self.mode = ClientMode.Server if self.mode is not ClientMode.Server: raise network.NotInServerMode( "You can't connect to a server while client is not in server mode" ) self.log.debug("[CONNECT] to server %s" % (self.serveraddress)) try: self.serverpeer = self.host.connect( enet.Address(self.serveraddress.host, self.serveraddress.port), 1, 0) except (IOError, MemoryError): raise network.NetworkException( "Unable to connect to server. Maybe invalid or irresolvable server address." ) self.mode = ClientMode.Server event = self.host.service(SERVER_TIMEOUT) if event.type != enet.EVENT_TYPE_CONNECT: self.reset() raise network.UnableToConnect("Unable to connect to server") self.log.debug("[CONNECT] done")
def chat(self, message): if self.mode is not ClientMode.Server: raise network.NotInServerMode("We are not connected to any server") if self.game is None: raise network.NotInGameLobby("We are not in a game lobby") self.log.debug("[CHAT] %s" % (message)) self.send(packets.client.cmd_chatmsg(message)) return True
def p2p_connect(self): if self.mode is not ClientMode.Peer2Peer: raise network.NotInServerMode( "You can't create the p2p network while client is not in p2p mode" ) start = False for player in self.game.players: if self.name == player.name: start = True continue if not start: continue self.log.debug("[P2P CONNECT] to player %s (%s)" % (player.name, player.address)) player.peer = self.host.connect( enet.Address(player.address.host, player.address.port), 1, 0) self.log.debug("[P2P CONNECT] Waiting") waiting = len(self.game.players) - 1 while waiting > 0: event = self.host.service(CLIENT_TIMEOUT) if event.type == enet.EVENT_TYPE_NONE: break elif event.type == enet.EVENT_TYPE_DISCONNECT: break elif event.type == enet.EVENT_TYPE_CONNECT: player = None for _player in self.game.players: if _player.address == event.peer.address: player = _player if player is None: event.peer.disconnect() self.flush() event.peer.reset() continue if player.peer is None: player.peer = event.peer if not player.ready: player.ready = True waiting -= 1 self.log.debug("[P2P CONNECT] Got connection from %s (%s)" % (player.name, player.address)) for player in self.game.players: if self.name == player.name: continue if not player.ready: self.reset() self.log.warning("Unable to connect to %s (%s)" % (player.name, player.address)) raise network.UnableToConnect("Unable to connect to %s (%s)" % (player.name, player.address)) self.log.debug("[P2P CONNECT] done")
def listgames(self, mapname = None, maxplayers = None, onlyThisVersion = False): if self.mode is not ClientMode.Server: raise network.NotInServerMode("We are not connected to any server") self.log.debug("[LIST]") self.send(packets.client.cmd_listgames(self.version if onlyThisVersion else -1, mapname, maxplayers)) packet = self.recv_packet([packets.cmd_error, packets.server.data_gameslist]) if packet is None: raise network.CommandError("No reply from server") elif isinstance(packet[1], packets.cmd_error): raise network.CommandError(packet[1].errorstr) elif not isinstance(packet[1], packets.server.data_gameslist): raise network.CommandError("Unexpected packet") return packet[1].games
def setprops(self, lang): if self.mode is None: raise network.NotConnected() if self.mode is not ClientMode.Server: raise network.NotInServerMode("We are not in server mode") self.log.debug("[SETPROPS]") self.send(packets.client.cmd_sessionprops(lang)) packet = self.recv_packet([packets.cmd_ok]) if packet is None: raise network.FatalError("No reply from server") elif not isinstance(packet[1], packets.cmd_ok): raise network.CommandError("Unexpected packet") return True
def creategame(self, mapname, maxplayers): if self.mode is not ClientMode.Server: raise network.NotInServerMode("We are not connected to any server") self.log.debug("[CREATE] mapname=%s maxplayers=%d" % (mapname, maxplayers)) self.send(packets.client.cmd_creategame(self.version, mapname, maxplayers, self.name)) packet = self.recv_packet([packets.cmd_error, packets.server.data_gamestate]) if packet is None: raise network.CommandError("No reply from server") elif isinstance(packet[1], packets.cmd_error): raise network.CommandError(packet[1].errorstr) elif not isinstance(packet[1], packets.server.data_gamestate): raise network.CommandError("Unexpected packet") self.game = packet[1].game return self.game
def leavegame(self): if self.mode is not ClientMode.Server: raise network.NotInServerMode("We are not connected to any server") if self.game is None: raise network.NotInGameLobby("We are not in a game lobby") self.log.debug("[LEAVE]") self.send(packets.client.cmd_leavegame()) packet = self.recv_packet([packets.cmd_error, packets.cmd_ok]) if packet is None: raise network.CommandError("No reply from server") elif isinstance(packet[1], packets.cmd_error): raise network.CommandError(packet[1].errorstr) elif not isinstance(packet[1], packets.cmd_ok): raise network.CommandError("Unexpected packet") self.game = None return True
def joingame(self, uuid): if self.mode is not ClientMode.Server: raise network.NotInServerMode("We are not connected to any server") if not isinstance(uuid, UUID): uuid = UUID(uuid) self.log.debug("[JOIN] %s" % (uuid)) self.send(packets.client.cmd_joingame(uuid, self.version, self.name)) packet = self.recv_packet([packets.cmd_error, packets.server.data_gamestate]) if packet is None: raise network.CommandError("No reply from server") elif isinstance(packet[1], packets.cmd_error): raise network.CommandError(packet[1].errorstr) elif not isinstance(packet[1], packets.server.data_gamestate): raise network.CommandError("Unexpected packet") self.game = packet[1].game return self.game
def leavegame(self, stealth=False): if self.mode is None: raise network.NotConnected() if self.mode is not ClientMode.Server: raise network.NotInServerMode("We are not in server mode") if self.game is None: raise network.NotInGameLobby("We are not in a game lobby") self.log.debug("[LEAVE]") if stealth: self.game = None return self.send(packets.client.cmd_leavegame()) packet = self.recv_packet([packets.cmd_ok]) if packet is None: raise network.FatalError("No reply from server") elif not isinstance(packet[1], packets.cmd_ok): raise network.CommandError("Unexpected packet") self.game = None return True
def joingame(self, uuid, password="", fetch=False): if self.mode is None: raise network.NotConnected() if self.mode is not ClientMode.Server: raise network.NotInServerMode("We are not in server mode") self.log.debug("[JOIN] %s" % (uuid)) self.send(packets.client.cmd_joingame( uuid = uuid, clientver = self.version, clientid = self.clientid, playername = self.name, playercolor = self.color, password = password, fetch = fetch)) packet = self.recv_packet([packets.server.data_gamestate]) if packet is None: raise network.FatalError("No reply from server") elif not isinstance(packet[1], packets.server.data_gamestate): raise network.CommandError("Unexpected packet") self.game = packet[1].game return self.game
def creategame(self, mapname, maxplayers, gamename, maphash="", password=""): if self.mode is None: raise network.NotConnected() if self.mode is not ClientMode.Server: raise network.NotInServerMode("We are not in server mode") self.log.debug("[CREATE] mapname=%s maxplayers=%d" % (mapname, maxplayers)) self.send(packets.client.cmd_creategame( clientver = self.version, clientid = self.clientid, playername = self.name, playercolor = self.color, gamename = gamename, mapname = mapname, maxplayers = maxplayers, maphash = maphash, password = password)) packet = self.recv_packet([packets.server.data_gamestate]) if packet is None: raise network.FatalError("No reply from server") elif not isinstance(packet[1], packets.server.data_gamestate): raise network.CommandError("Unexpected packet") self.game = packet[1].game return self.game
def _assert_connection(self): if self._mode is None: raise network.NotConnected() if self._mode is not ClientMode.Server: raise network.NotInServerMode("We are not in server mode")