我知道如何禁止成员,我知道如何踢他们,但我不知道如何取消他们。我有以下代码输出错误:
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!")
答案 0 :(得分:1)
要unban用户,您需要 user object 。您似乎正在这样做的方法是在命令中传递 user_id ,然后根据该命令创建用户对象。你也可以使用下面解释的get_bans()来做,但我会先回答你的问题。
在您的代码中,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()获取被禁用户列表,然后使用该列表获取有效的用户对象。例如:
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
是一个协程。这意味着它必须await
与unban
和say
相同。
根据经验,除非您实际使用生成器,否则您获得的任何生成器错误都可能是由于没有等待协程。
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")