def on_data(self, data):
        cmd, data = message.player.unpack(data)
        if cmd == message.PLAYER_JOIN_ROOM:
            try:
                room = RoomManager.player_join_room(data.roomid, self)
            except RoomManager.RoomNotFound:
                logger.warning(
                    "Player {0} Try to join a NONE exist room {1}".format(
                        id(self), data.roomid))
                self.put_data(message.player.pack_join_room_error_response(14))
                return
            except RoomManager.RoomFull:
                logger.warning("Player {0} Try to join a FULL room {1}".format(
                    id(self), data.roomid))
                self.put_data(message.player.pack_join_room_error_response(15))
                return

            marines = MarineFactory.create_marines(room.terrain.size,
                                                   PLAYER_MARINE_AMOUNT)
            self.marine_batch_add(marines, data.color)
            self.put_data(
                message.player.pack_join_room_response(room.id,
                                                       room.terrain.size,
                                                       marines))
            return

        if cmd == message.PLAYER_CREATE_MARINE:
            raise NotImplementedError("Player Create Marine Not Implemented")

        if cmd == message.PLAYER_OPERATE_MARINE:
            self.marine_operate(data.id, data.status, data.targetPostion)
    def on_data(self, data):
        cmd, data = message.observer.unpack(data)
        if cmd == message.OBSERVER_CREATE_ROOM:
            # TODO a observer only can create one room
            room = RoomManager.create_room(data.map, MAX_PLAYERS, MAX_SECONDS)
            RoomManager.observer_join_room(room.id, self)

            msg = message.observer.pack_create_room_message(0, room.id, room.terrain.size)
            self.put_data(msg)
            return

        if cmd == message.OBSERVER_JOIN_ROOM:
            raise NotImplementedError("Observer Join Room Not Implemented")

        if cmd == message.OBSERVER_MARINE_REPORT:
            self.room.notify_players(data)
            return
    def on_data(self, data):
        cmd, data = message.observer.unpack(data)
        if cmd == message.OBSERVER_CREATE_ROOM:
            # TODO a observer only can create one room
            room = RoomManager.create_room(data.map, MAX_PLAYERS, MAX_SECONDS)
            RoomManager.observer_join_room(room.id, self)

            msg = message.observer.pack_create_room_message(
                0, room.id, room.terrain.size)
            self.put_data(msg)
            return

        if cmd == message.OBSERVER_JOIN_ROOM:
            raise NotImplementedError("Observer Join Room Not Implemented")

        if cmd == message.OBSERVER_MARINE_REPORT:
            self.room.notify_players(data)
            return
    def on_data(self, data):
        cmd, data = message.player.unpack(data)
        if cmd == message.PLAYER_JOIN_ROOM:
            try:
                room = RoomManager.player_join_room(data.roomid, self)
            except RoomManager.RoomNotFound:
                logger.warning("Player {0} Try to join a NONE exist room {1}".format(id(self), data.roomid))
                self.put_data(message.player.pack_join_room_error_response(14))
                return
            except RoomManager.RoomFull:
                logger.warning("Player {0} Try to join a FULL room {1}".format(id(self), data.roomid))
                self.put_data(message.player.pack_join_room_error_response(15))
                return

            marines = MarineFactory.create_marines(room.terrain.size, PLAYER_MARINE_AMOUNT)
            self.marine_batch_add(marines, data.color)
            self.put_data(message.player.pack_join_room_response(room.id, room.terrain.size, marines))
            return

        if cmd == message.PLAYER_CREATE_MARINE:
            raise NotImplementedError("Player Create Marine Not Implemented")

        if cmd == message.PLAYER_OPERATE_MARINE:
            self.marine_operate(data.id, data.status, data.targetPostion)