【问题标题】:python bot block access to commandpython bot阻止访问命令
【发布时间】:2023-03-24 17:25:01
【问题描述】:

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

如果机器人安装在多个服务器上。

因此,如果来自任何服务器类型?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)

【问题讨论】:

  • 您在错误的地方提出了错误。如果 bool 检查失败,您想引发错误。类似if bool(...): return True else: raise MemberError(...)
  • 你需要把return bool(...)改成if bool(...): return True else: raise NonMember(...)
  • 您好 Patrick,是的,一切正常,但我还有一个问题。该自定义 on_command_error 不适用于 DM。我试过 await bot.send_message(ctx.message.channel,await bot.send_message(ctx.message.author, 有什么需要改变的吗?

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


【解决方案1】:

您可以编写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)

【讨论】:

  • 是输入主服务器ID。 @is_member_of(7687878788) 在这里?
  • 是的,不过如果你使用的是异步分支,它应该是一个字符串。
  • @Demotry CommandError 来自 commands 扩展。我会在我的答案中编辑它
  • 服务器 ID 的成员和非成员出现另一个错误。上面更新的错误代码。我在这里用假身份证替换了那个身份证。
  • Client.get_server 正在返回 None。这意味着它无法找到具有该 ID 的服务器。你是把它作为字符串还是整数传递?
猜你喜欢
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 2012-10-15
  • 2018-10-21
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多