def createGif(img: Image):
        avatar = img.resize(
            (RickrollGenerator._avatar_size, RickrollGenerator._avatar_size))
        avatar = Util.createCircle(avatar,
                                   RickrollGenerator._getMaskImagePath())
        avatar = Util.enlargeImage(avatar)
        rick = Image.open(RickrollGenerator.getRickrollPath())
        frames = []
        index = 0
        for frame in ImageSequence.Iterator(rick):
            x = POSITION[index]["x"]
            y = POSITION[index]["y"]
            d = POSITION[index]["degree"]
            avatarR = Util.rotateImage(avatar, d)
            frame = frame.convert("RGBA")
            frame.paste(avatarR,
                        (x - int(RickrollGenerator._avatar_size / 2 + 20),
                         y - int(RickrollGenerator._avatar_size / 2 + 20)),
                        avatarR)

            b = io.BytesIO()
            frame.save(b, format="GIF")
            frame = Image.open(b)

            frames.append(frame)
            index += 1
        frames[0].save(RickrollGenerator.getRickrollOutPath(),
                       save_all=True,
                       append_images=frames[1:])
        return RickrollGenerator.getRickrollOutPath()
Exemple #2
0
    async def rick_group(self, ctx:commands.Context, user:User):
        if user.bot:
            avatar = Util.downloadUserAvatar(user=ctx.message.author)
        else: 
            avatar = Util.downloadUserAvatar(user=user)
        imagePath = RickrollGenerator.createGif(avatar)

        embedMsg = Embed()
        embedMsg.set_image(url='attachment://rickrolled.gif')

        img = File(imagePath, filename="rickrolled.gif")
        await ctx.send(file=img, embed=embedMsg)
 async def betting_start_command(self, ctx: commands.Context, *argv):
     if len(argv) != 1 or not argv[0].isdigit():
         await ctx.channel.send('參數錯誤: 請使用`!betitng start 賭局id`')
         return
     game_id = int(argv[0])
     game: GamblingGame = GamblingUtil.get_game(game_id)
     if game == None:
         await ctx.channel.send(
             '參數錯誤: 無法找到id 為:{} 的賭盤。請使用`!betitng list`查詢。'.format(game_id))
         return
     if game.creater_id != ctx.author.id:
         await ctx.channel.send('權限錯誤: 這個賭盤不是你創建的!')
         return
     if game.guild_id != ctx.guild.id:
         await ctx.channel.send('權限錯誤: 這個賭盤不是在這裡創建的,創建的伺服為: {}'.format(
             self.bot.get_guild(game.guild_id).name))
         return
     if game.status != Util.GamblingStatus.init:
         await ctx.channel.send('權限錯誤: 這個賭盤的狀態為: {},無法開始。'.format(
             Util.GamblingStatus(game.status).name))
         return
     embed = GamblingEmbed.get_betting_embed(game)
     msg = await ctx.channel.send(embed=embed)
     await msg.pin()
     GamblingUtil.update_game_status(game, Util.GamblingStatus.ready,
                                     ctx.channel.id, msg.id)
    def _drawXpAndCoin(self) -> None:
        draw = ImageDraw.Draw(self.image)
        common_size = 27
        common_font = ImageFont.truetype(font=self.fontPath,
                                         size=common_size,
                                         encoding='utf-8')

        text_list_1 = ('硬幣:', str(self.coinNumber))
        text_list_fill_1 = ('#E1E100', '#F9F900')[::-1]
        text_list_2 = (str(self.xpNumber), '/', "{:0.2f}".format(
            Util.get_rank_exp(self.levelNumber + 1)), 'XP')
        text_list_fill_2 = ('#FFFFFF', '#ADADAD', '#ADADAD', '#ADADAD')[::-1]

        x_base = 934 - 60 - 30
        y = 171 + 15
        for i, t in enumerate(text_list_2[::-1]):
            offset = draw.textsize(t, font=common_font)
            x_base -= (offset[0] + 5)
            draw.text((x_base, y),
                      t,
                      fill=text_list_fill_2[i],
                      font=common_font)
        x_base -= 15
        for i, t in enumerate(text_list_1[::-1]):
            offset = draw.textsize(t, font=common_font)
            x_base -= (offset[0] + 5)
            draw.text((x_base, y),
                      t,
                      fill=text_list_fill_1[i],
                      font=common_font)
 def __findMessageRecord(guild_id: int,
                         message_id: int) -> Util.ReactionType:
     query = ReactionMessage.select().where(
         ReactionMessage.guild_id == guild_id,
         ReactionMessage.message_id == message_id)
     if query.exists():
         reactionMsg: ReactionMessage = query.get()
         return Util.ReactionType(reactionMsg.message_type)
     return Util.ReactionType.UNKNOWN
Exemple #6
0
 def __update_rank_if_qualified(self, member_id: int):
     member = Member.get_by_id(member_id)
     new_rank = member.rank
     while (member.exp > Util.get_rank_exp(new_rank + 1)):
         new_rank += 1
     if new_rank != member.rank:
         member.rank = new_rank
         member.save()
     return member.rank
 async def __updateUserRole(self, guild: Guild, user: User, member: Member,
                            rank: int, channelToUse: GuildChannel,
                            internal: bool):
     if user:
         if member:
             newRoles = RoleUtil.getKfpRolesFromLevel(guild.id, rank)
             if len(newRoles) > 0:
                 for newRole in newRoles:
                     newGuildRole: Role = guild.get_role(newRole.role_id)
                     if newGuildRole:
                         if not newGuildRole in user.roles:
                             # 用戶有新身份組
                             # 先移除所有不符合的身份組
                             oldRoles: KfpRole = RoleUtil.getCurrentRoles(
                                 guild.id,
                                 Util.RoleCategory(newRole.category))
                             if oldRoles:
                                 oldGuildRoles = []
                                 for oldRole in oldRoles:
                                     guildRole = guild.get_role(
                                         oldRole.role_id)
                                     if guildRole and guildRole in user.roles:
                                         oldGuildRoles.append(guildRole)
                                 for oldGuildRole in oldGuildRoles:
                                     await user.remove_roles(oldGuildRole)
                             # 添加新的身份組
                             await user.add_roles(newGuildRole)
                             if internal:
                                 print(
                                     "adding role {} to member {} successed!"
                                     .format(newGuildRole.name, user.name))
                             else:
                                 embed = Embed()
                                 embed.description = '恭喜<@!{}> 成為 {}'.format(
                                     user.id, newGuildRole.name)
                                 await channelToUse.send(embed=embed)
    async def betting_bte_command(self, ctx: commands.Context, *argv):
        guild = ctx.guild
        channel = ctx.channel
        ##
        if channel == None:
            await ctx.author.send('請到開啟賭牌的頻道下注!!')
            return
        if guild == None:
            await ctx.author.send('無法處理的伺服器!')
            return
        if not self.database.has_channel(guild.id, channel.id,
                                         Util.ChannelType.AUTO_DELETE):
            await ctx.message.delete()
        flag = False
        if len(argv) < 2:
            flag = True
        elif not argv[0].isdigit() or not argv[1].isdigit():
            flag = True
        if flag:
            await ctx.author.send('參數錯誤: `!bet 加注數量 下注編號 [賭局ID]`')
            return
        bet_amount = int(argv[0])  # 加注數量
        choice_id = int(argv[1])  # 下注編號

        _bettings = GamblingUtil.get_active_game_in_channel(
            guild.id, ctx.channel.id)
        ready_games = []
        game: GamblingGame
        for game in _bettings:
            if game.status == Util.GamblingStatus.ready:
                ready_games.append(game)
        if len(ready_games) == 0:
            await ctx.author.send('參數錯誤: 這個頻道沒有開啟的賭局!')
            return
        if len(ready_games) > 1:
            if len(argv) <= 2:
                tem_betting_list = ''
                for game in ready_games:
                    tem_betting_list += '\n賭局名:{}, id: {}'.format(
                        game.name, game.id)
                await ctx.author.send('這個頻道有複數賭局開啟中\n請指定賭局`!bet 下注數 賭局ID`' +
                                      tem_betting_list)
                return
            if not argv[2].isdigit():
                await ctx.author.send('參數錯誤: 賭局ID必須是數字')
            betting_id = int(argv[2])
            flag = True
            for game in ready_games:
                if betting_id == game.id:
                    flag = False
                    break
            if flag:
                ctx.author.send('參數錯誤: 這個<#{}>沒有ID為: {}的賭局'.format(
                    ctx.channel.id, betting_id))
            ready_games = game
        elif len(ready_games) == 1:
            ready_games = ready_games[0]
        else:
            await ctx.channel.send('未預期的錯誤: <@!326752816238428164>快修阿!')
            return
        game: GamblingGame = ready_games
        if game.status != Util.GamblingStatus.ready:
            await ctx.author.send('權限錯誤: 現在的賭局狀態為: {}不能下注'.format(
                Util.GamblingStatus(game.status).name))
            return
        if bet_amount < 1:
            await ctx.author.send('參數錯誤: 下注🍗不能為此數: {}'.format(bet_amount))
            return
        # 所有可下注選項
        betting_item_list = json.load(game.item_list)
        if not choice_id < len(betting_item_list):
            await ctx.author.send('參數錯誤: 不存在編號: {}'.format(choice_id))
            return
        member = self.database.get_member(ctx.author.id)
        if member == None:
            member = self.database.add_member(ctx.author.id)
        require_amount = bet_amount * game.base
        if member.coin < require_amount:
            await ctx.author.send('道德錯誤: 你的🍗不夠啦! ...剩餘{},下注{}'.format(
                member.coin, require_amount))
            return
        self.database.add_coin(member, -1 * require_amount)
        GamblingUtil.add_bet(game=game,
                             user_id=member.member_id,
                             amount=require_amount,
                             item_index=choice_id)

        await ctx.author.send('你成功對{} 下注了{}點🍗。...餘額為: {}。'.format(
            betting_item_list[choice_id], require_amount, member.coin))
Exemple #9
0
    def get_betting_embed(bot: commands.Bot, database: KfpDb,
                          game: GamblingGame):
        guild: Guild = bot.get_guild(game.guild_id)
        if guild == None:
            return Embed(title='錯誤',
                         description='無法處理的伺服id: {}'.format(game.guild_id))
        embed = Embed()
        embed.colour = Color(randint(0, 0xffffff))
        embed.title = game.name
        _description = ''
        if game.status == Util.GamblingStatus.ready:
            _description += '請各位輸入`!bet 下注數 下注編號 {}` 開始下注!。\n'.format(game.id)
        if game.status == Util.GamblingStatus.wait:
            _description += '停止下注!'
        _description += '#目前所有選項的期望賠率都是一樣的,有人有想法可以聯絡<@326752816238428164>\n'
        if game.status == Util.GamblingStatus.ready:
            _description += '<@{}>可以輸入`!betting lock {}`來停止下注。'.format(
                game.creater_id, game.id)
        if game.status == Util.GamblingStatus.wait:
            _description += '<@{}>可以輸入`!betting end 勝利編號 {}`來結算賭盤。'.format(
                game.creater_id, game.id)
        embed.description = _description

        betting_items = json.loads(game.item_list)
        #[第一項總注,第n項總注...,總項總注]
        member_charge_sum = [0] * len(betting_items)
        member_bet = {}
        bets = GamblingUtil.get_bets(game)

        bet: GamblingBet
        for bet in bets:
            member_charge_sum[bet.item_index] += bet.charge
            member_bet[bet.member_id] = member_bet.get(bet.member_id,
                                                       0) + bet.charge

        for i, target_name in enumerate(betting_items):
            if member_charge_sum[i] > 0:
                embed.add_field(name='編號: {} #'.format(i) + target_name,
                                value='賠率: {:.3f}'.format(
                                    float((game.pool / member_charge_sum[i]))),
                                inline=False)
            else:
                embed.add_field(name='編號: {} #'.format(i) + target_name,
                                value='賠率: ?',
                                inline=False)
        embed.add_field(name='賭局id', value=str(game.id))
        embed.add_field(name='獎金池', value=str(game.pool * game.base))
        embed.add_field(name='每注單位', value=str('{}🍗'.format(game.base)))
        embed.add_field(name='刷新速度', value='5s')
        embed.add_field(name='狀態', value=Util.GamblingStatus(game.status).name)
        embed.add_field(name='====我是分隔線====', value='#', inline=False)
        inline_flasg = False
        for member_id in member_bet:
            member = guild.get_member(int(member_id))
            if member == None:
                continue
            value = ''
            for bet_item in member_bet[member_id]:
                if game.status == Util.GamblingStatus.end.value:
                    if bet_item == betting_items[game.winning_index]:
                        value += '{}:得到{}點🍗\n'.format(
                            bet_item, member_bet[member_id][bet_item] /
                            member_charge_sum[game.winning_index] *
                            member_charge_sum[-1] * game.base)
                    else:
                        value += '{}:輸掉{}點🍗拉\n'.format(
                            bet_item,
                            member_bet[member_id][bet_item] * game.base)
                else:
                    value += '{}:{}注\n'.format(bet_item,
                                               member_bet[member_id][bet_item])
            embed.add_field(name=member.display_name,
                            value=value[:-1],
                            inline=inline_flasg)
            if not inline_flasg:
                inline_flasg = True

        return embed
 def test_experienceCalculation(self):
     assert "386080.00" == "{:0.2f}".format(Util.get_rank_exp(57))
     assert "166355.00" == "{:0.2f}".format(Util.get_rank_exp(42))
     assert "226305.00" == "{:0.2f}".format(Util.get_rank_exp(47))