Discord.py 昵称更改

时间:2021-06-13 01:50:18

标签: python discord.py

@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)

我阅读了多个教程和文档。我不明白为什么我的代码没有按预期工作。

请帮忙,提前致谢。

1 个答案:

答案 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 出了什么问题。使用 tryexcept,您可以捕获诸如 Missing PermissionsInvalid Form Body 之类的错误。

  • 在昵称前使用*:如果你的昵称变量前不使用星号,你会发现会发生以下情况:

What will happen without the *

下面的代码表达了上面的内容。

@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))

above code working


如果你想让它更复杂一点,你可以包含一个 typing.Optional (import typing),这将允许 ctx.author 更改自己的昵称而不必提及自己(并避免令人讨厌的错误)。您所要做的就是替换一行。

async def ani(ctx, member: typing.Optional[discord.Member]=None, *, nick=None):

Works the same way as before, but better