首页 > 解决方案 > Discord py 清除通道

问题描述

我正在尝试让我的 Discord 机器人从指定频道中删除一些消息,但出现错误

AttributeError: 'int' object has no attribute 'purge'

功能如下

await clearChannel(3, 837017813357035560)
@bot.event
async def clearChannel(number, channel):
    await channel.purge(limit=number)

标签: pythondiscord.py

解决方案


欢迎来到 Discord.py!

这里有一些问题。

  • 您应该使用@bot.command()装饰器-您对此感到困惑@bot.event

  • 命令并非旨在由其他代码触发 - 从这个意义上说,它们不是常规方法。您的用户将!clearChannel在 Discord 聊天中触发命令,其中!是您为bot对象设置的前缀。

  • 您的用户不必手动传递通道 ID 以使命令正常工作。对于最终用户来说,这将是不必要的复杂处理。相反,您应该只从发送命令消息的位置自动获取通道 ID。

您的代码应如下所示;

@commands.has_permissions(administrator=True)
@bot.command()
async def clear(ctx, number: int):
  await ctx.channel.purge(limit=number)

我添加了一些东西;

  • 我添加了一项检查以确保只有管理员才能使用此命令。如果您不验证可能会损坏服务器的命令,一旦部署了您的机器人,任何用户都可以删除他们想要的任意数量的消息。

  • number: int是类型提示。它将尝试将number参数解析为 int,当您将其传递给purge方法时,您需要它。如果它不能被解析,例如它包含非数字字符,你可以处理它。使用类型提示还可以提高代码的可读性。

编辑:

看来我误解了你的问题。我猜你正在寻找一种非命令方法,然后你可以在事件或类似的东西中实现它。

要做到这一点,它基本上是相同的。

async def clear_channel(channels, limit: int): # channels should be a list of discord.Channel objects
  for channel in channels:
    await channel.purge(limit=limit)

您可以通过向管理员询问频道 ID 并使用get_channel()获取discord.Channel对象,然后将其附加到要传递到上述方法的列表中来获取需要传入的频道列表。还有一种更用户友好的方法是通过传入频道名称并以这种方式获取频道对象,但我将把它留给你;)


推荐阅读