@client.command(pass_context=True)
async def ani(ctx, member: discord.Member, nick):
if member == discord.Member:
member = ctx.message.author
await member.edit(nick=nick)
else:
member = ctx.message.author
await member.edit(nick=nick)
我阅读了多个教程和文档。我不明白为什么我的代码没有按预期工作。
请帮忙,提前致谢。
答案 0 :(得分:2)
您的代码存在一些问题,或者可以做得更好。我会在这里列出它们。
最初将您的变量定义为 None
:如果未提及某个成员,您的机器人将抛出一个错误,告诉您您错过了一个变量。如果您不包含 nick
的昵称,情况也是如此。为了解决这个问题,您可以通过在每个变量之后使用 None
(当然不包括 =None
)来使 ctx
成为默认变量。您可以稍后处理它们。
将 if member == discord.Member
更改为仅 if member
:由于您已经将成员定义为 discord.Member
对象,因此该语句不起作用。如果您之前将变量定义为 None
,那么您可以简单地使用 if member
来检查此变量是否not None
。如果是,它将立即转到 else
语句。
使用 try-except
语句捕获其他错误:为了避免错误在您的控制台中泛滥,您可以改为告诉 ctx.author
出了什么问题。使用 try
和 except
,您可以捕获诸如 Missing Permissions
或 Invalid Form Body
之类的错误。
在昵称前使用*:如果你的昵称变量前不使用星号,你会发现会发生以下情况:
下面的代码表达了上面的内容。
@client.command(pass_context=True)
async def ani(ctx, member: discord.Member=None, *, nick=None):
if nick == None:
nick = "A Cool Nickname"
try:
if member:
name_before = member.display_name
# Why not member.nick? If the member did not have a nickname to begin with,
# member.nick would return None
await member.edit(nick=nick)
else:
member = ctx.message.author
name_before = member.display_name
await member.edit(nick=nick)
await ctx.send(f"Changed {member.mention}'s nickname from {name_before} to {member.display_name}")
except Exception as e:
# 403 Forbidden (error code: 50013): Missing Permissions
# - You are above the bot in the role hierarchy
# - The bot does not have the ability to change nicknames
# 400 Bad Request (error code: 50035): Invalid Form Body
# - In nick: Must be 32 or fewer in length.
await ctx.send(str(e))
如果你想让它更复杂一点,你可以包含一个 typing.Optional
(import typing
),这将允许 ctx.author
更改自己的昵称而不必提及自己(并避免令人讨厌的错误)。您所要做的就是替换一行。
async def ani(ctx, member: typing.Optional[discord.Member]=None, *, nick=None):