【问题标题】:Discord.py - How can I make cogs per-serverDiscord.py - 如何为每个服务器制作 cogs
【发布时间】:2019-11-16 21:25:42
【问题描述】:

我有一个带有 cog 的公共机器人,但我刚刚测试过,如果我加载/卸载一个 cog,它会在它所在的每个服务器上加载/卸载该 cog,这对于公共机器人来说当然是可怕的

我将展示我的加载和卸载命令:

@client.command()
async def load(ctx, extension):
 client.load_extension(f"cogs.{extension}")

 await ctx.send(f"Successfully loaded the {extension} module :thumbsup: ")

@load.error
async def load_error(ctx, error):
 await ctx.send(f"The following error occured:```\n{error}\n```")

是加载命令,并且:

@client.command()
async def unload(ctx, extension):
 client.unload_extension(f"cogs.{extension}")

 await ctx.send(f"Successfully unloaded the {extension} module :thumbsup: ")

@unload.error
async def unload_error(ctx, error):
 await ctx.send(f"The following error occured:```\n{error}\n```")

是卸载命令

编辑:我不介意尝试我正在尝试之外的其他东西

【问题讨论】:

  • 你必须对你的 cog 进行编程,让它们知道从哪里调用命令并在某些行会中忽略它们。
  • 我可能不知道该怎么做,而且我无法为它加入的每个服务器设置它,因为任何人都可以邀请机器人

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


【解决方案1】:

您可以使用cog_check 来检查 cog 中的每个命令:例如

class MyCog(commands.Cog):
   def cog_check(self, ctx):
      return ctx.guild.id == 123

由于齿轮与机器人绑定,加载和卸载它们会影响机器人无处不在,没有比使用这个更好的方法来制作公会唯一的齿轮。

【讨论】:

    【解决方案2】:

    对此的解决方案是为您不想公开的 cogs 中的每个命令添加一个简单的检查

    #add a check to the top of the cog
    def isPrivateCommand():
        async def predicate(ctx):
            return ctx.guild.id == YOURGUILDIDHERE
        return commands.check(predicate)
    
    .
    .
    .
    
    @commands.command
    @isPrivateCommand()
    async def ...
    

    此检查应确保该命令仅在您的公会中执行(您在检查中输入的公会 ID)。

    有关检查的文档可以在here 中找到用于discord.py 重写

    编码愉快!

    【讨论】:

    • 这不是我的目标。我不知道如何解释它,我只是想要每台服务器的齿轮,这意味着有人可以将它加载到一台服务器中并且它赢了不影响其他服务器。例如,有人使用“.load chat”(加载聊天 cog)然后有人使用“.unload chat”(卸载聊天 cog)它将保持 cog 加载到他们加载它的服务器中,并保持它在他们在服务器上卸载它
    • 啊,好吧,我明白了——在这种情况下,您可以保存有关哪个服务器已将哪个 cog 加载到数据库中的信息,然后为每个命令添加自定义检查以检查该服务器是否具有该命令的 cog 是否已加载。除此之外,没有真正的方法来加载/卸载特定于 cogs 服务器的加载,因为加载发生在整个 bot 应用程序本身。希望这会有所帮助!
    【解决方案3】:

    cogs 属于机器人,而不是服务器。因此,您尝试做的事情是不可能的。 但是(我猜你想做一些像 dyno 必须在公会中激活命令的事情)

    您可以将所有“加载”命令的行会保存在数据库中,然后在所有命令被加载时添加检查

    example_data = {
        "command_name": "example",
        "loaded_guilds": []
    }
    
    
    def isCommandLoaded():
        async def predicate(ctx):
            return ctx.guild.id in example_data["loaded_guilds"]:
        return commands.check(predicate)
    
    
    
    @commands.command()
    @isCommandLoaded()
    async def example(self, ctx):
        """Example ..."""
    

    不仅仅是构建一个加载/卸载命令并将其保存到数据库

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 2020-12-12
      • 1970-01-01
      • 2019-04-30
      • 2020-11-13
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多