首页 > 解决方案 > python bot阻止访问命令

问题描述

如果命令不是特定不和谐服务器的成员,是否可以阻止对命令的访问。例子:

如果 bot 安装在多个服务器中。

因此,如果来自任何服务器类型的任何成员,?ping只有当他是主服务器的成员时它才应该工作。否则,机器人会使用自定义消息回复。

class NonMember(commands.CommandError):
    def __init__(self, server_id, *args, **kwargs):
        self.server_id = server_id
        super().__init__(*args, **kwargs)

def is_member_of(server_id):
    def predicate(ctx):
        server = bot.get_server(server_id)
        if not server:
            raise commands.CommandError("Cannot poll members of server with id {}".format(server_id))
        if bool(server.get_member(ctx.message.author.id)):
            return True
        else:
            raise NonMember
    return commands.check(predicate)

@bot.event
async def on_command_error(error, ctx):
    if isinstance(error, NonMember):
        await bot.send_message(ctx.message.channel, "{} Not an member. ".format(error.user.mention))

@bot.command(pass_context=True)
@is_member_of("1234")
async def ping(ctx):
    msg = "Pong {0.author.mention}".format(ctx.message)
    await bot.say(msg)

标签: pythonpython-3.xdiscorddiscord.py

解决方案


您可以编写一个commands.check用于Server.get_member尝试在给定服务器中查找成员的方法。就像是

class NonMember(commands.CommandError):
    def __init__(self, server_id, *args, **kwargs):
        self.server_id = server_id
        super().__init__(*args, **kwargs)

@bot.event
async def on_command_error(error, ctx):
    if isinstance(error, NonMember):
        await bot.send_message(ctx.message.channel, "{} Not an member. ".format(error.user.mention))

def is_member_of(server_id):
    def predicate(ctx):
        server = bot.get_server(server_id)
        if not server:
            raise commands.CommandError("Cannot poll members of server with id {}".format(server_id))
        if bool(server.get_member(ctx.message.author.id)):
            return True
        else:
            raise NonMember(server_id)
    return commands.check(predicate)

@bot.command(pass_context=True)
@is_member_of("1234")
async def ping(ctx):
    msg = "Pong {0.author.mention}".format(ctx.message)
    await bot.say(msg)

推荐阅读