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 test_addGamePoolAmount(self):
        original: GamblingGame = GamblingUtil.create_game(
            123, "new_game", 5, ["hello", "hi"], 123)
        GamblingUtil.add_game_pool_amount(original, 300)
        original = GamblingUtil.get_game(original.id)

        assert original.pool == 300
    def test_updateGameStatus(self):
        game: GamblingGame = GamblingUtil.create_game(123, "new_game", 5,
                                                      ["hello", "hi"], 123)
        GamblingUtil.update_game_status(game, Util.GamblingStatus.ready, 123,
                                        456)
        result_game = GamblingUtil.get_game(game.id)

        assert game == result_game
    def test_addBetSuccess(self):
        original: GamblingGame = GamblingUtil.create_game(
            123, "new_game", 5, ["hello", "hi"], 123)
        GamblingUtil.update_game_status(original, Util.GamblingStatus.ready,
                                        123, 456)
        assert GamblingUtil.add_bet(original, 123, 10, 1)

        original: GamblingGame = GamblingUtil.get_game(original.id)
        assert original.pool == 10

        assert GamblingUtil.add_bet(original, 123, 10, 1)
        assert original.pool == 20
 async def betting_lock_command(self, ctx: commands.Context, *argv):
     send_target = None
     if ctx.channel == None:
         send_target = ctx.author
     else:
         send_target = ctx.channel
     if len(argv) != 1 or not argv[0].isdigit():
         await send_target.send('參數錯誤: `!betting lock 賭盤id`')
         return
     game_id = int(argv[0])
     game: GamblingGame = GamblingUtil.get_game(game_id)
     if game == None:
         await send_target.send('參數錯誤: 沒有ID為{}的賭盤'.format(game_id))
         return
     if game.creater_id != ctx.author.id:
         await send_target.send('權限錯誤: 你不是創建這個賭盤的人')
         return
     if game.status != Util.GamblingStatus.ready:
         await send_target.send('權限錯誤: 這個賭盤的狀態為:{}'.format(game.status.name)
                                )
         return
     GamblingUtil.update_game_status(game, Util.GamblingStatus.wait)
     await send_target.send('更新賭盤狀態為: {}'.format(
         Util.GamblingStatus.wait.name))
    async def betting_end_command(self, ctx: commands.Context, *argv):
        if len(argv) != 2:
            await ctx.channel.send('參數錯誤: `!betting lock 勝利編號 賭盤id`')
            return
        if not argv[1].isdigit() or not argv[0].isdigit():
            await ctx.channel.send('參數錯誤: `!betting lock 勝利編號 賭盤id`')
            return
        game_id = int(argv[1])
        option_index = int(argv[0])
        game: GamblingGame = GamblingUtil.get_game(int(argv[1]))
        if not game:
            await ctx.channel.send('參數錯誤: 找不到id 為{}的賭盤'.format(game_id))
            return
        if game.creater_id != ctx.author.id:
            await ctx.channel.send('權限錯誤: 你不是創建這個賭盤的人')
            return
        if game.status != Util.GamblingStatus.wait:
            await ctx.channel.send('權限錯誤: 這個賭盤的狀態為:{}'.format(game.status.name)
                                   )
            return
        betting_items = json.loads(game.item_list)
        if option_index < 0 or option_index > len(betting_items):
            await ctx.channel.send(f'參數錯誤: `勝利編號 {option_index} 為無效編號`')
            return

        #[第一項總注,第n項總注...,總項總注]
        member_charge_sum = [0] * len(betting_items)
        member_bet = {}
        winning_item = betting_items[option_index]
        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 member_id in member_bet:
            member: Member = self.database.get_member(member_id)
            if member == None:
                continue
            token_spent = 0
            if member_bet[member_id].get(winning_item, 0) != 0:
                token_spent = member_bet[member_id][winning_item]
            coin_won = 0
            winning_sum = member_charge_sum[option_index]
            if winning_sum != 0:
                coin_won = int(token_spent / winning_sum * game.base *
                               game.pool)
            user = await self.bot.fetch_user(member_id)
            if user == None:
                await ctx.channel.send('無法找到該id的用戶: {},跳過!')
                continue
            self.database.add_token(member_id, coin_won)
            member = self.database.get_member(member_id)
            await user.send('恭喜獲得{}點🍗, ...結餘:{}'.format(coin_won, member.coin))

        GamblingUtil.update_game_status(game,
                                        Util.GamblingStatus.end,
                                        winning_index=option_index)

        channel = await self.bot.fetch_channel(game.channel_id)
        if channel != None:
            msg = await channel.fetch_message(game.message_id)
            await msg.edit(embed=GamblingEmbed.get_betting_embed(
                self.bot, self.database, game))
            if msg.pinned:
                await msg.unpin()
        await ctx.channel.send('結算成功')