所以我一直在尝试创建两个命令——一个禁止许多用户,另一个解除多个用户的禁令;massban 和 massunban。
这两个命令对服务器中的用户有效,需要注意的是它对不在服务器内的 ID 无效。
这里的想法是做 !massban ID ID ID ID (...) 和 !massunban ID ID ID ID (...)
@commands.command(name="massban")
@commands.has_any_role("Admin", "Moderator", "Bot")
async def massban(self, context, *user_ids: int):
for u in user_ids:
user_object = self.client.get_user(u)
await context.guild.ban(user_object)
@commands.command(name="massunban")
@commands.has_any_role("Admin", "Moderator", "Bot")
async def massunban(self, context, *user_ids: int):
for u in user_ids:
user_object = self.client.get_user(u)
await context.guild.unban(user_object)
问题是这会返回如下错误
上述异常是以下异常的直接原因:
Traceback (most recent call last):
File "C:\Users\Dazz\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\ext\commands\bot.py", line 903, in invoke
await ctx.command.invoke(ctx)
File "C:\Users\Dazz\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 859, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "C:\Users\Dazz\AppData\Local\Programs\Python\Python38\lib\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: AttributeError: 'NoneType' object has no attribute 'id'
我一直在看文档,到处寻找这个问题的解决方案;我在一些 Discord 服务器上寻求帮助,但无济于事。
任何帮助将不胜感激。
答案 0 :(得分:0)
问题是,用户不会自动加载到缓存中。所以 Discord.py 无法从缓存中获取用户。此处的解决方案是使用 .fetch_user()
。这是一个您不应该使用但在这种情况下必须使用的 API 调用。
所以修改后的代码如下:
@commands.command(name="massban")
@commands.has_any_role("Admin", "Moderator", "Bot")
async def massban(self, context, *user_ids: int):
for u in user_ids:
user_object = await self.client.fetch_user(u)
await context.guild.ban(user_object)
@commands.command(name="massunban")
@commands.has_any_role("Admin", "Moderator", "Bot")
async def massunban(self, context, *user_ids: int):
for u in user_ids:
user_object = await self.client.fetch_user(u)
await context.guild.unban(user_object)
答案 1 :(得分:0)
添加到 FlexGames 答案中。在版本 1.6 中,如果您提供了 ID,discord.py UserConverter
已经获取给定的用户并检查 ID 是否有效。答案可以缩短。 UserConverter 还接受名称/提及/ID,这是一个奖励。此处说明UserConverter
这是精简版
@commands.command(name="massban")
@commands.has_any_role("Admin", "Moderator", "Bot")
async def massban(self, ctx, *users: discord.User):
# map calls ctx.guild.ban for each users
# asyncio.gather awaits each coroutine concurrently
await asyncio.gather(*map(ctx.guild.ban, users))
@commands.command(name="massunban")
@commands.has_any_role("Admin", "Moderator", "Bot")
async def massunban(self, ctx, *users: discord.User):
await asyncio.gather(*map(ctx.guild.unban, users))