Python 对这个不和谐的问题感到困惑。py重写+;反应灯代码-需要解释吗
所以,虽然我们都知道,我肯定知道整个复制粘贴别人的代码,它神奇地工作了,但在弄清楚这些代码实际上是如何工作和起作用时,它失去了一些上下文和理解 我正在使用,并调用了一段代码,以便创建允许在我的应用程序中自分配角色的代码。bot是100%功能性的,并按预期工作。现在,我对它们的代码做了一些改动,因此我的方法位于不同的位置,并且从不同的区域调用 这就是我困惑的地方: 我有一个名为Python 对这个不和谐的问题感到困惑。py重写+;反应灯代码-需要解释吗,python,bots,chatbot,discord.py,discord.py-rewrite,Python,Bots,Chatbot,Discord.py,Discord.py Rewrite,所以,虽然我们都知道,我肯定知道整个复制粘贴别人的代码,它神奇地工作了,但在弄清楚这些代码实际上是如何工作和起作用时,它失去了一些上下文和理解 我正在使用,并调用了一段代码,以便创建允许在我的应用程序中自分配角色的代码。bot是100%功能性的,并按预期工作。现在,我对它们的代码做了一些改动,因此我的方法位于不同的位置,并且从不同的区域调用 这就是我困惑的地方: 我有一个名为isadmin()的方法,每当需要完成检查以确定发出命令的用户是否是管理员时,就会调用该方法。管理员角色在.env文件中定
isadmin()
的方法,每当需要完成检查以确定发出命令的用户是否是管理员时,就会调用该方法。管理员角色在.env文件中定义,我正在使用dotenv模块检索该文件。非常直截了当的东西。(稍后我将重写该部分,并希望将所有管理员角色id放入一个文件中,然后从那里获取它们。)然而,我对该方法的第三个参数的确切作用感到困惑<代码>消息=错误
每当我为此编写COG时,我都会这样调用此方法,而不会将“msg”参数传递给它,如下所示:
现在,在我的on_message()
listener方法中,它传递msg
参数,然后执行一些与ping命令无关但与bot的自分配角色部分功能相关的代码
据我所知,此工作流的工作方式是这样的,我将使用ping命令作为示例,该命令由r.ping
命令调用
msg
参数admin.py
调用,然后检查(再次?)用户是否是管理员,如果他/她是管理员,则继续执行该命令msg
参数,如果它已经在检查用户是否是侦听器中的管理员,我是否必须在实际命令本身中再次检查?这不是有点多余吗
下面是文件中的isadmin()
方法
老实说,我不知道为什么会这样。如果您有权访问
ctx.author
您有权访问ctx.message
,因为ctx.author
只是该消息的作者,似乎是多余的。然而,我强烈建议你使用这个。例如,我有:
def是所有者():
定义谓词(ctx):
在ctx.bot.config()[“所有者”]中返回ctx.author.id
返回命令。检查(谓词)
我用这个做装饰
#utils/checks/checks.py
从utils.checks导入检查
@检查。是_所有者()
@commands.group(hidden=True,不区分大小写=True,description=“加载模块”)
异步def加载(自、ctx):
如果不是ctx.U子命令:
返回等待ctx.发送帮助(ctx.命令)
例如,你可以
def是_admin():
定义谓词(ctx):
role_id=123123#将其替换为os.getenv(“无论您的管理员角色在哪里”)
返回[x.id for x in ctx.author.roles]中的角色\u id
返回命令。检查(谓词)
在我看来,它更干净,更容易使用/理解
# admin.py
# Simple ping pong command
@commands.command()
async def ping(self, ctx):
if helpers.isadmin(ctx):
print("Running Command from admin.py")
await ctx.send('Pong!')
# message.py
@commands.Cog.listener()
async def on_message(self, message):
if helpers.isadmin(message, msg=True):
# Execute some code here for the self-assigning roles
# helpers.py
def isadmin(self, ctx, msg=False):
# Checks if command author has one of .env admin role IDs
try:
check = (
[role.id for role in ctx.author.roles]
if msg
else [role.id for role in ctx.message.author.roles]
)
if self.admin_a in check or self.admin_b in check or self.admin_c in check:
return True
return False
except AttributeError:
# Error raised from 'fake' users, such as webhooks
return False