Ejemplo n.º 1
0
	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");
Ejemplo n.º 2
0
 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")
Ejemplo n.º 3
0
	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
Ejemplo n.º 4
0
    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")
Ejemplo n.º 5
0
	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
Ejemplo n.º 6
0
	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
Ejemplo n.º 7
0
	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
Ejemplo n.º 8
0
	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
Ejemplo n.º 9
0
	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
Ejemplo n.º 10
0
	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
Ejemplo n.º 11
0
	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
Ejemplo n.º 12
0
	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
Ejemplo n.º 13
0
 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")