Discord.py-如何使每个服务器的齿轮

时间:2019-07-06 18:31:41

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

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

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

@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```")

是卸载命令

编辑:我不介意尝试其他方法

3 个答案:

答案 0 :(得分:0)

对此的一种解决方案是在不想公开的嵌齿轮中向每个命令添加一个简单的检查

#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重写

编码愉快!

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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 ..."""

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