有没有一种方法可以检查固定的邮件,并且仅使用discord.py清除某些成员的邮件?

时间:2020-06-05 22:20:55

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

我想发出类似于Dyne的清除命令,您可以在其中输入用户,并且不清除固定的内容,仅清除用户的消息(如果输入用户)。我试图做一个单独的检查功能,但它不会清除任何东西。我没有错误,只是不会清除。

@commands.command()
    @commands.has_permissions(manage_messages=True)
    async def purge(self, ctx, user: discord.Member = None, num: int = 10000):
        if user:
            def check_func(user: discord.Member, message: discord.Message):
                return not msg.pinned
                return user.id
            await ctx.message.delete()
            await ctx.channel.purge(limit=num, check=check_func)
            verycool = await ctx.send(f'{num} messages deleted.')
            await verycool.delete()

        else:
            await ctx.message.delete()
            await ctx.channel.purge(limit=num, check=lambda msg: not msg.pinned)
            verycool = await ctx.send(f'{num} messages deleted.')
            await verycool.delete()

我在服务器上具有“管理邮件”权限。有谁知道如何使check_func正常工作?

1 个答案:

答案 0 :(得分:0)

我所做的更改应该可以解决您的问题,并解决其他一些问题。

@commands.command()
@commands.has_permissions(manage_messages=True)
async def purge(self, ctx, num: int = None, user: discord.Member = None):
    if user:
        check_func = lambda msg: msg.author == user and not msg.pinned
    else:
        check_func = lambda msg: not msg.pinned

    await ctx.message.delete()
    await ctx.channel.purge(limit=num, check=check_func)
    await ctx.send(f'{num} messages deleted.', delete_after=5)

仅基于参数更改函数看起来更好,效率更高,因为否则您将重复代码。此外,您最后发送的邮件会立即被有效删除。 channel.send有一个参数delete_after,它将在给定的秒数后自动删除一条消息。我还没有提到其他一些语法问题,例如check函数仅接受一个参数,但是您解析了两个我也已解决的参数。从技术上讲,PEP8禁止将lambda存储在变量中,但我认为可以原谅。

编辑:您可以执行类似的操作,例如检查num == "*"并删除所有消息。