【问题标题】:discord.py message.author.id returns tracebackdiscord.py message.author.id 返回回溯
【发布时间】:2020-02-07 05:40:58
【问题描述】:

所以我试图让我的 discord.py 机器人只接受某些用户对某些命令的命令执行。我现在知道 ctx.author.id 表示机器人作者 ID。我听说message.author.id 应该可以工作,但使用message.author.id 会引发回溯,即臭名昭著的 NameError 错误。为什么以及如何解决?

@bot.command(description="Restarts The Bot's source file, use if bot freezes etc, [OWNER]")
async def shutdown(ctx):
     if ctx.author.id == 436646726204653589 or 525334420467744768 or 218142353674731520:
        embed = discord.Embed(color = 0xff0000)
        embed.add_field(name="Shutdown Command Sent, Bot Rebooting in 3 seconds", value = str, inline = False)
        await ctx.send(embed=embed)
        await asyncio.sleep(3)
        await bot.close()
        os.execl(sys.executable, sys.executable, * sys.argv)
        os.system("py -3 theBot.py")

bot.run(TOKEN)

【问题讨论】:

  • message 未在代码中的任何位置定义。其他人可能在它被定义后使用它,通常作为函数的参数。另请注意,您的if 条件应为if ctx.author.id in (436646726204653589, 525334420467744768, 218142353674731520)

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


【解决方案1】:

如果您使用the commands extension 并且shutdown 是命令,则ctxContext 对象。
Context.author 是命令消息的作者,是Message.author 的简写。
两者都是User 对象,您可以从中使用User.id

我不确定您所说的“机器人作者 ID”到底是什么意思,但如果您想获取机器人所有者的用户 ID,您可以使用 Bot.owner_id,如果机器人应用程序是团队,则可以使用 Bot.owner_ids而是基于。
否则,您可以使用Bot.user 获取代表机器人的ClientUser,然后使用ClientUser.id 获取其ID。

“未定义错误”实际上应该是 NameError,告诉您该变量未定义,正如它所说,message 未定义,您需要在使用它之前定义它。
您可以使用Context.message 获取触发正在执行的命令的Message

注意,if ctx.author.id == 436646726204653589 or 525334420467744768 or 218142353674731520: 将始终输入 if 语句
ctx.author.id == 436646726204653589 or 525334420467744768 or 218142353674731520 将始终为 Trueor has a lower precedence than ==。这意味着这等效地计算为
(ctx.author.id == 436646726204653589) or 525334420467744768 or 218142353674731520,整数525334420467744768 以及218142353674731520 将始终计算为True
相反,您想检查每个 ID 是否相等。这可以通过检查元组或集合中的成员身份来完成,例如
分别为ctx.author.id in (436646726204653589, 525334420467744768, 218142353674731520)ctx.author.id in {436646726204653589, 525334420467744768, 218142353674731520}
有关更多信息,请参阅此How to test multiple variables against a value? 问题。

另外,如果你没有在任何地方重新定义str(你不应该这样做,因为它是一个内置类),你将类本身作为嵌入值传递,输出将被转换为字符串并显示为<class 'str'>

此外,我不确定您为什么尝试使用 os.execl(sys.executable, sys.executable, * sys.argv) 自行执行 Python 可执行文件,但 os.execl 会立即替换当前进程,因此永远不会运行下一行。

【讨论】:

  • 未定义我的意思是 NameError 但我如何检查消息作者 ID 并将其与发布的 3 个 ID 进行比较?
  • 我已经在我的回答中提到了这一点。
猜你喜欢
  • 2022-01-09
  • 2019-12-13
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2021-12-28
  • 2018-07-07
  • 2017-12-07
  • 1970-01-01
相关资源
最近更新 更多