def parse(users, channel, packet, packetID):
		if len(users.server.cache.captchaCaches) >= 100:
			letter = random.choice(list(users.server.cache.captchaCaches))
			img = users.server.cache.captchaCaches[letter]
		else:
			letter, img = users.server.captcha.getCaptcha(4)
			users.server.cache.captchaCaches[letter] = img

		channel.player.captcha = letter.upper()

		width, height = img.size
		pixelsCount = 0

		pixels = ByteArray()
		p2 = ByteArray()
		p2.writeByte(0)
		p2.writeShort(width)
		p2.writeShort(height)

		for row in range(height):
			for col in range(width):
				pix = img.getpixel((col, row))
				pixels.writeUnsignedByte(pix[0])
				pixels.writeUnsignedByte(pix[1])
				pixels.writeUnsignedByte(pix[2])
				pixels.writeUnsignedByte(0)
				pixelsCount += 1

		p2.writeShort(pixelsCount)
		p2.writeBytes(pixels.toByteArray())

		zlibCompress = zlib.compress(p2.toByteArray())

		p3 = ByteArray()
		p3.writeInt(len(zlibCompress))
		p3.writeBytes(zlibCompress)

		users.sendPacket(channel, [26, 20], p3.toByteArray())
    def sendFriendsList(self, player):
        p = ByteArray()
        if player.marriage in self.users.players:
            marriage = self.users.players[player.marriage]
            p.writeBytes(self.getPlayerOnlineData(player, marriage))
        elif self.users.checkPlayerNameExist(player.marriage):
            name, tag = player.marriage.split("#")
            pool = self.server.database.execute(
                "SELECT * FROM users WHERE playerName = %s AND playerTag = %s",
                (name, tag))
            results = self.server.database.fetchone(pool)
            p.writeBytes(self.getPlayerDBData(player, results))
        else:
            p.writeBytes(self.getPlayerNoData())

        p.writeShort(len(player.friendsList))
        for friend in player.friendsList:
            if friend in self.users.players:
                f = self.users.players[friend]
                p.writeBytes(self.getPlayerOnlineData(player, f))
            elif self.users.checkPlayerNameExist(friend):
                name, tag = friend.split("#")
                pool = self.server.database.execute(
                    "SELECT * FROM users WHERE playerName = %s AND playerTag = %s",
                    (name, tag))
                results = self.server.database.fetchone(pool)
                p.writeBytes(self.getPlayerDBData(player, results))
            else:
                p.writeBytes(self.getPlayerNoData())

        self.sendTribullePacket(player, 34, p.toByteArray())
    def joinTribulle(self, player):
        self.users.sendPacket(player.channel, [60, 4],
                              ByteArray().writeBoolean(True).toByteArray())

        p = ByteArray().writeByte(player.gender).writeInt(player.playerID)

        if player.marriage in self.users.players:
            marriage = self.users.players[player.marriage]
            p.writeBytes(self.getPlayerOnlineData(player, marriage))
        elif self.users.checkPlayerNameExist(player.marriage):
            name, tag = player.marriage.split("#")
            pool = self.server.database.execute(
                "SELECT * FROM users WHERE playerName = %s AND playerTag = %s",
                (name, tag))
            results = self.server.database.fetchone(pool)
            p.writeBytes(self.getPlayerDBData(player, results))
        else:
            p.writeBytes(self.getPlayerNoData())

        p.writeShort(len(player.friendsList))
        for friend in player.friendsList:
            if friend in self.users.players:
                f = self.users.players[friend]
                p.writeBytes(self.getPlayerOnlineData(player, f))
            elif self.users.checkPlayerNameExist(friend):
                name, tag = friend.split("#")
                pool = self.server.database.execute(
                    "SELECT * FROM users WHERE playerName = %s AND playerTag = %s",
                    (name, tag))
                results = self.server.database.fetchone(pool)
                p.writeBytes(self.getPlayerDBData(player, results))
            else:
                p.writeBytes(self.getPlayerNoData())

        p.writeShort(len(player.ignoredsList))
        for ignored in player.ignoredsList:
            p.writeUTF(ignored)

        if player.tribe != None:
            p.writeUTF(self.session.tribe.tribeName).writeInt(
                self.session.tribe.tribeID).writeUTF(
                    self.session.tribe.tribeMessage).writeInt(
                        self.session.tribe.tribeHouse).writeUTF(
                            self.session.tribe.tribeRanks).writeInt(
                                self.session.user["tribe_rank"])
        else:
            p.writeUTF("").writeInt(0).writeUTF("").writeInt(0).writeUTF(
                "").writeInt(0)

        self.sendTribullePacket(player, 3, p.toByteArray())

        for friend in self.getFriendsClass(player):
            self.server.tribulle.sendFriendConnected(player, friend)