为什么我的不和谐机器人不能正确解除禁令?

时间:2021-05-13 03:16:59

标签: python python-3.x discord discord.py

我正在开发一个通用的 discord 机器人,我一直在努力使用 unban 命令。我用python编码了这个。代码如下:

    @client.command()
    @commands.has_permissions(administrator = True)
    async def unban(ctx, *, member):
        if member == None:
            await ctx.send("Please enter a username")
            return
        banned_users = await ctx.guild.bans()
        member_name, member_discriminator = member.split("#")
        for ban_entry in banned_users:
            user = ban_entry.user
            if (user.name, user.discriminator) == (member_name, member_discriminator):
                message2 = f"You have been unbanned from {ctx.guild.name}"
                await member.send(message2)
                await ctx.guild.unban(member)
                await ctx.send(f"{member} has been unbanned!")

这是它给出的例外:

Ignoring exception in command unban:
Traceback (most recent call last):
          File 
"C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:\Users\OneDrive\Desktop\Bot\Bot.py", line 40, in unban
    member_name, member_discriminator = member.split("#")
ValueError: not enough values to unpack (expected 2, got 1)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\discord\ext\commands\bot.py", line 939, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\discord\ext\commands\core.py", line 863, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\discord\ext\commands\core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: ValueError: not enough values to unpack (expected 2, got 1)

2 个答案:

答案 0 :(得分:2)

  • 您正在尝试拆分一个字符串并将其解包为两个变量。但是,当您拆分字符串时,该字符串没有任何“#”实例,并且只返回一个包含一个字符串(它是成员)的列表。它无法解压。
  • 您应该立即使用 commands.MemberConverter 将成员参数转换为成员对象。这个成员对象也是你需要解禁的。你不能解禁一个字符串...
  • 您无需检查 member 是否为 None,因为如果没有给出参数,该命令将返回错误。
  • 您不应该检查用户名和鉴别符是否相同,而应该使用 ID。
  • 正如@justhalf 所建议的,您应该在发送消息之前使用取消禁止方法。这是解除封禁失败的预防措施,但仍会向会员发送消息。

实施后,代码更短、更简单。

@client.command()
@commands.has_permissions(administrator = True)
async def unban(ctx, member:commands.MemberConverter):
    banned_users = await ctx.guild.bans()
    for ban_entry in banned_users:
        user = ban_entry.user
        if user.id == member.id:
            message2 = f"You have been unbanned from {ctx.guild.name}"
            await ctx.guild.unban(member)
            await member.send(message2)
            await ctx.send(f"{member} has been unbanned!")

答案 1 :(得分:0)

#unban  
@client.command(aliases=['ub'])
@commands.has_permissions(ban_members = True)
async def unban(ctx, *, member):
    banned_users = await ctx.guild.bans()
    member_name, member_discriminator = member.split("#")

    for ban_entry in banned_users:
        user = ban_entry.user

        if (user.name, user.discriminator) == (member_name, member_discriminator):
            await ctx.guild.unban(user)
            await ctx.send(f'**{user}** has been unbanned!')
            return

这个解除对我有用,你说[前缀]解除用户名和鉴别器

<块引用>

取消禁鸟#7893