限制命令

时间:2018-06-19 15:55:20

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

我得到了这段代码,它禁止除?hello中的那些用户ID之外的所有用户访问LIST_OF_ID命令,因此我通过将ctx.message.author.id替换为ctx.message.server.id来对此进行了修改,现在绕过了服务器也。所以我添加了这两个代码,但是现在它对用户和服务器均不起作用,仅适用于任何人。如何使其适用于服务器和用户。

LIST_OF_SERVER_IDS = ['3557657657647676', '36567565756766767']
LIST_OF_USER_IDS = ['3557657657647676', '36567565756766767'] 

def is_any_user(ids):
    def predicate(ctx):
        return ctx.message.author.id in ids
    return commands.check(predicate)

def is_any_server(ids):
    def predicate(ctx):
        return ctx.message.server.id in ids
    return commands.check(predicate)

@bot.command(pass_context=True)
@is_any_user(LIST_OF_USER_IDS)
@is_any_server(LIST_OF_SERVER_IDS)
async def hello(ctx):
     await bot.say("Hello {}".format(ctx.message.author.mention))

1 个答案:

答案 0 :(得分:1)

通过定义两个is_any_user装饰器,您只需保留最近定义的装饰器,然后丢失第一个装饰器。给服务器检查一个更具代表性的名称(毕竟,它不检查User,为什么在名称中使用“ user”)。然后,我们可以保留两个id的白名单。由于commands.check可以链接,因此我们只需用两个检查来修饰命令即可。

LIST_OF_SERVER_IDS = [3557657657647676, 36567565756766767, 343657687786435432]
LIST_OF_USER_IDS = [1, 2, 3]  
# Replace as needed.  Keep in mind that 0.16 ids are strings and 1.0 ids are integers


def is_any_user(ids):
    def predicate(ctx):
        return ctx.message.author.id in ids
    return commands.check(predicate)

def is_any_server(ids):
    def predicate(ctx):
        return ctx.message.server.id in ids
    return commands.check(predicate)

@bot.command(pass_context=True)
@is_any_user(LIST_OF_USER_IDS)
@is_any_server(LIST_OF_SERVER_IDS)
async def hello(ctx):
     await bot.say("Hello {}".format(ctx.message.author.mention))

编辑:

使用这些检查版本来尝试调试正在发生的事情

def is_any_user(ids):
    def predicate(ctx):
        if ctx.message.author.id in ids:
            print("Good author")
            return True
        else:
            print("Bad author")
            return False
    return commands.check(predicate)

def is_any_server(ids):
    def predicate(ctx):
        if ctx.message.server.id in ids:
            print("Good server")
            return True
        else:
            print("Bad server")
            return False
    return commands.check(predicate)

Edit2:

您可以编写检查以查看是否有人在用户白名单中 或从服务器白名单中的服务器访问命令。

def whitelists(users, servers):
    def predicate(ctx):
        return ctx.message.author.id in users or ctx.message.server.id in servers
    return commands.check(predicate)

@bot.command(pass_context=True)
@whitelists(LIST_OF_USER_IDS, LIST_OF_SERVER_IDS)
async def hello(ctx):
     await bot.say("Hello {}".format(ctx.message.author.mention))