如何取消用户?

时间:2018-01-04 20:35:56

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

我知道如何禁止成员,我知道如何踢他们,但我不知道如何取消他们。我有以下代码输出错误:

  

discord.ext.commands.errors.CommandInvokeError:命令引发了一个   例外:AttributeError:' generator'对象没有属性' id'

代码:

@bot.command(pass_context=True)
@commands.has_role("Moderator")
async def unban2(ctx):
    mesg = ctx.message.content[8:]
    banned = client.get_user_info(mesg)
    await bot.unban(ctx.message.server, banned)
    await bot.say("Unbanned!")

2 个答案:

答案 0 :(得分:1)

unban用户,您需要 user object 。您似乎正在这样做的方法是在命令中传递 user_id ,然后根据该命令创建用户对象。你也可以使用下面解释的get_bans()来做,但我会先回答你的问题。

在命令

中传递user_id

在您的代码中,mseg user_id banned用户对象

mesg = ctx.message.content[8:]
banned = await client.get_user_info(mesg)

编辑:正如squaswin指出的那样,你需要等待get_user_info()

您将 user_id 定义为ctx.message.content[8:],在这种情况下,您的消息中的文字来自第8个字符以及第一个字符为0

根据您的代码,以下内容应该有效:

(以下数字只是为了显示角色位置)

!unban2 148978391295820384
012345678...

问题在于,如果您的命令名称或前缀更改了长度,那么您必须更改ctx.message.content[8:]中的索引以与消息中的 user_id 对齐

更好的方法是将 user_id 作为参数传递给您的命令:

async def unban(ctx, user_id):
    banned = await client.get_user_info(user_id)

现在您可以直接使用client.get_user_info()

使用get_bans()

您可以改为使用get_bans()获取被禁用户列表,然后使用该列表获取有效的用户对象。例如:

async def unban(ctx):
    ban_list = await self.bot.get_bans(ctx.message.server)

    # Show banned users
    await bot.say("Ban list:\n{}".format("\n".join([user.name for user in ban_list])))

    # Unban last banned user
    if not ban_list:
        await bot.say("Ban list is empty.")
        return
    try:
        await bot.unban(ctx.message.server, ban_list[-1])
        await bot.say("Unbanned user: `{}`".format(ban_list[-1].name))
    except discord.Forbidden:
        await bot.say("I do not have permission to unban.")
        return
    except discord.HTTPException:
        await bot.say("Unban failed.")
        return

要将其转换为一组有效的命令,您可以创建一个命令来显示被禁用户的索引列表,另一个命令可以根据用户的列表索引取消用户。

答案 1 :(得分:1)

get_user_info是一个协程。这意味着它必须awaitunbansay相同。
根据经验,除非您实际使用生成器,否则您获得的任何生成器错误都可能是由于没有等待协程。

banned = await bot.get_user_info(mesg)

哦,并且在文档中写的是这个函数可能会抛出错误,因此可能值得确保没有出错。

try:
    banned = await bot.get_user_info(mesg)
except discord.errors.NotFound:
    await bot.say("User not found")