discorddiscord.py

Reroll Giveaway command not responding when command run?


I am trying to make a discord giveaway reroll command. The problem is that when the command is run it is not responding/rerolling the giveaway. I've looked on multiple sites with the same command and all of them did not work/have a fix for this. I also tried without the embeds to see if that was the problem with the code. Below is the reroll command code - (if the giveaway command code is needed I can provide it)

    @client.command()
    @commands.has_permissions(kick_members=True)
    async def reroll(ctx, channel : discord.TextChannel, id_ : int):
        try:
            new_msg = await channel.fetch_message(id_)
        except:
            embed = discord.Embed(title="Command Error ⛔ - GameBot", description=f"**The Id Of A Channel Was Entered Incorrectly!** 🎉", color=0x992d22)
            await ctx.send(embed=embed)
            return
        
        users = await new_msg.reactions[0].users().flatten()
        users.pop(users.index(client.user))

        winner = random.choice(users)

        embed = discord.Embed(title="Giveaways 🎉 - GameBot", description=f"**Giveaway Has Been Rerolled!** \n \n**Winner -** \n`{winner.mention}`", color=0xe74c3c)
        await ctx.send(embed=embed)

Below is the giveaway command code -

@client.command()
    @commands.has_permissions(kick_members=True)
    async def giveaway(ctx):
        embed = discord.Embed(title="Giveaway Setup 🎉 - GameBot", description=f'**{ctx.author.mention} Giveaway Setup Is Now Starting... Please Answer These Questions Within 30 Seconds!**', color=0xe74c3c)
        await ctx.send(embed=embed)

        questions = ["**What Channel Should The Giveaway Be Hosted In?** `EX : #general` 🎉",
                    "**What Is The Duration Of The Giveaway?** `EX : S/M/H/D` 🎉",
                    "**What Is The Giveaway Prize?** `EX : Gift Card` 🎉"]

        answers = []

        def check(m):
            return m.author == ctx.author and m.channel == ctx.channel

        for i in questions:
            await ctx.send(i)

            try:
                msg = await client.wait_for('message', timeout=30.0, check=check)
            except asyncio.TimeoutError:
                embed = discord.Embed(title="Command Error ⛔ - GameBot", description=f"**Please Answer All Of The Questions In Time... Be Prepared!** 🎉", color=0x992d22)
                await ctx.send(embed=embed)
            else:
                answers.append(msg.content)
        
        try:
            c_id = int(answers[0][2:-1])
        except:
            embed = discord.Embed(title="Command Error ⛔ - GameBot", description=f"**Please Provide A Valid Channel For Me To Host The Giveaway In!** `EX : #general` 🎉", color=0x992d22)
            await ctx.send(embed=embed)
            return

        channel = client.get_channel(c_id)

        time = convert(answers[1])
        if time == -1:
            embed = discord.Embed(title="Command Error ⛔ - GameBot", description=f"**The Time Constraint You Answered With Was Not A Valid Unit!** `EX : S/M/H/D` 🎉", color=0x992d22)
            await ctx.send(embed=embed)
            return
        elif time == -2:
            embed = discord.Embed(title="Command Error ⛔ - GameBot", description=f"**The Time Must Include An Integer!** `EX : 1S, 1M, 1H, 1D` 🎉", color=0x992d22)
            await ctx.send(embed=embed)
            return

        prize = answers[2]

        embed = discord.Embed(title="Giveaway Setup 🎉 - GameBot", description=f'**Giveaway Channel -** \n`{channel.mention}` \n**Duration -** \n`{answers[1]}`', color=0xe74c3c)
        await ctx.send(embed=embed)


        givembed = discord.Embed(title="Giveaways 🎉 - GameBot", description=f'**Giveaway Prize/Description -** \n`{prize}`', color=0x2ecc71)

        givembed.add_field(name = "**Host -**", value=ctx.author.mention)

        givembed.set_footer(text = f"Ending {answers[1]} From Now! 🎉")

        my_msg = await channel.send(embed=givembed)


        await my_msg.add_reaction("🎉")


        await asyncio.sleep(time)


        new_msg = await channel.fetch_message(my_msg.id)


        users = await new_msg.reactions[0].users().flatten()
        users.pop(users.index(client.user))

        winner = random.choice(users)

        embed = discord.Embed(title="Giveaways 🎉 - GameBot", description=f"**Giveaway Has Ended!** \n \n**Winner -** \n`{winner.mention}` \n**Prize -** \n`{prize}`", color=0xe74c3c)
        await ctx.send(embed=embed)

Solution

  • Almost everything about the code is correct. However I guess you are requesting the users in a wrong/not working way. You can try to request the users in another way, this seems to be the source where the error comes from.

    Try out the following:

    users = [u for u in await new_msg.reactions[0].users().flatten() if u != client.user]
    
    winner = random.choice(users)
    

    The full code would be:

    @client.command()
    @commands.has_permissions(kick_members=True)
    async def giveaway(ctx):
    # Giveaway code
    
    
    @client.command()
    @commands.has_permissions(kick_members=True)
    async def reroll(ctx, channel: discord.TextChannel, id_: int):
        try:
            new_msg = await channel.fetch_message(id_)
        except:
            embed = discord.Embed(title="Command Error ⛔ - GameBot",
                                  description=f"**The Id Of A Channel Was Entered Incorrectly!** 🎉", color=0x992d22)
            await ctx.send(embed=embed)
            return
    
        user_list = [u for u in await new_msg.reactions[0].users().flatten() if u != client.user]
    
        winner = random.choice(user_list)
    
        embed = discord.Embed(title="Giveaways 🎉 - GameBot",
                              description=f"**Giveaway Has Been Rerolled!** \n \n**Winner -** \n`{winner.mention}`",
                              color=0xe74c3c)
        await ctx.send(embed=embed)