需要有关discord.py机器人的建议

时间:2019-11-23 07:04:15

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

编写我的第一个机器人。我正在尝试制作一个可以通过命令更改用户名和成员角色的机器人。

例如:!setnick [member] [newnick]; !giverole [成员] [角色]

我的角色命令很好用,但是我对更改昵称文档here感到困惑

    @bot.command(pass_context=True)
async def setnick(ctx, nickname):
    await change_nickname(server.get_member, nickname)
    await ctx.send(f"User's nickname has been changed.")

机器人运行,但是当我输入命令不一致时,它将返回此错误:

Ignoring exception in command setnick:
Traceback (most recent call last):
  File "FILEPATH", line 79, in wrapped
    ret = await coro(*args, **kwargs)
  File "FILEPATH", line 23, in setnick
    await change_nickname(server.get_member, nickname)
NameError: name 'change_nickname' is not defined

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "FILEPATH", line 863, in invoke
    await ctx.command.invoke(ctx)
  File "FILEPATH", line 728, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "FILEPATH", line 88, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: NameError: name 'change_nickname' is not defined

谢谢!

1 个答案:

答案 0 :(得分:2)

change_nickname是从类调用的函数,可以参考文档,您会注意到该函数在名为Client的类下。
这意味着您不能无所事事地调用change_nickname

  

例如,它类似于您的send(string)方法。您不能随便调用它,而是需要使用文本通道对象来调用它。
  因此,您之所以选择了ctx.send()而不是send()的原因。

您可能在登录机器人yourObjectName = new Client()时创建了一个客户端对象。找到它并用它来调用change_nickname(),就像这样:

await yourObjectName.change_nickname(server.get_member, nickname)