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()
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
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))
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))