Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对这个不和谐的问题感到困惑。py重写+;反应灯代码-需要解释吗_Python_Bots_Chatbot_Discord.py_Discord.py Rewrite - Fatal编程技术网

Python 对这个不和谐的问题感到困惑。py重写+;反应灯代码-需要解释吗

Python 对这个不和谐的问题感到困惑。py重写+;反应灯代码-需要解释吗,python,bots,chatbot,discord.py,discord.py-rewrite,Python,Bots,Chatbot,Discord.py,Discord.py Rewrite,所以,虽然我们都知道,我肯定知道整个复制粘贴别人的代码,它神奇地工作了,但在弄清楚这些代码实际上是如何工作和起作用时,它失去了一些上下文和理解 我正在使用,并调用了一段代码,以便创建允许在我的应用程序中自分配角色的代码。bot是100%功能性的,并按预期工作。现在,我对它们的代码做了一些改动,因此我的方法位于不同的位置,并且从不同的区域调用 这就是我困惑的地方: 我有一个名为isadmin()的方法,每当需要完成检查以确定发出命令的用户是否是管理员时,就会调用该方法。管理员角色在.env文件中定

所以,虽然我们都知道,我肯定知道整个复制粘贴别人的代码,它神奇地工作了,但在弄清楚这些代码实际上是如何工作和起作用时,它失去了一些上下文和理解

我正在使用,并调用了一段代码,以便创建允许在我的应用程序中自分配角色的代码。bot是100%功能性的,并按预期工作。现在,我对它们的代码做了一些改动,因此我的方法位于不同的位置,并且从不同的区域调用

这就是我困惑的地方:

我有一个名为
isadmin()
的方法,每当需要完成检查以确定发出命令的用户是否是管理员时,就会调用该方法。管理员角色在.env文件中定义,我正在使用dotenv模块检索该文件。非常直截了当的东西。(稍后我将重写该部分,并希望将所有管理员角色id放入一个文件中,然后从那里获取它们。)然而,我对该方法的第三个参数的确切作用感到困惑<代码>消息=错误

每当我为此编写COG时,我都会这样调用此方法,而不会将“msg”参数传递给它,如下所示:

现在,在我的
on_message()
listener方法中,它传递
msg
参数,然后执行一些与ping命令无关但与bot的自分配角色部分功能相关的代码

据我所知,此工作流的工作方式是这样的,我将使用ping命令作为示例,该命令由
r.ping
命令调用

  • on_message()侦听服务器中发送的所有消息
  • 用户在通道中发出的Ping命令
  • on_message()听到消息并检查用户是否是管理员,但也传递
    msg
    参数
  • ping命令从
    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