用Python编程一个Discord机器人-有没有办法限制每个用户在某个通道中可以添加的反应数量?

用Python编程一个Discord机器人-有没有办法限制每个用户在某个通道中可以添加的反应数量?,python,discord.py,Python,Discord.py,我看到一些东西会限制对某条消息的一定数量的反应,但这并不是我想要的。我试图限制每个用户在某个频道中可以添加的反应次数(例如,每个人一次只能添加三个反应),但不太清楚如何做到这一点。我是编程新手,因此任何洞察都将不胜感激。您可以使用client.event或Cog.listener装饰程序来侦听特定事件。在本例中,我们将在\u reaction\u add上侦听。在上,如果反应量大于给定量(可能存储在db中),它将消除反应 @client.event 反应添加时的异步定义(反应,用户): 如果le

我看到一些东西会限制对某条消息的一定数量的反应,但这并不是我想要的。我试图限制每个用户在某个频道中可以添加的反应次数(例如,每个人一次只能添加三个反应),但不太清楚如何做到这一点。我是编程新手,因此任何洞察都将不胜感激。

您可以使用
client.event
Cog.listener
装饰程序来侦听特定事件。在本例中,我们将在\u reaction\u add上侦听
。在上,如果反应量大于给定量(可能存储在db中),它将消除反应

@client.event
反应添加时的异步定义(反应,用户):
如果len(反应信息反应)>反应极限:
等待反应。删除()
这将防止在达到唯一表情符号限制时添加更多的反应,
reaction\u limit
。这意味着,即使是在达到极限之前发生的先前反应也将被移除

在cog中,代码不会有太大的不同

@commands.Cog.listener()
添加(自身、反应、用户)时的异步定义:
如果len(反应信息反应)>反应极限:
等待反应。删除()
现在,如果消息未存储在缓存中,那么添加上的
的问题是它将不会被调用<但是,无论缓存状态如何,都将调用\u raw\u reaction\u add上的code>。这将是更好、更可行的解决方案,因为它不会受到应用程序在开发过程中无疑会经历的许多重置、关闭和重新加载的影响。以下是我将如何实现这一点:

#为了简洁起见,这将在cog之外完成。
@客户端事件
原始反应添加上的异步def(有效负载):
通道=客户端.get\u通道(有效负载.channel\u id)
如果channel.guild为“无”:
return#这只会发生在DMs的情况下。
msg=等待通道。获取消息(有效负载。消息\u id)
如果len(味精反应)>反应极限:
等待消息。移除\u反应(payload.emoji.id,payload.user\u id)

您可以使用
client.event
Cog.listener
装饰程序来侦听特定事件。在本例中,我们将在\u reaction\u add上侦听
。在上,如果反应量大于给定量(可能存储在db中),它将消除反应

@client.event
反应添加时的异步定义(反应,用户):
如果len(反应信息反应)>反应极限:
等待反应。删除()
这将防止在达到唯一表情符号限制时添加更多的反应,
reaction\u limit
。这意味着,即使是在达到极限之前发生的先前反应也将被移除

在cog中,代码不会有太大的不同

@commands.Cog.listener()
添加(自身、反应、用户)时的异步定义:
如果len(反应信息反应)>反应极限:
等待反应。删除()
现在,如果消息未存储在缓存中,那么添加上的
的问题是它将不会被调用<但是,无论缓存状态如何,都将调用\u raw\u reaction\u add上的code>。这将是更好、更可行的解决方案,因为它不会受到应用程序在开发过程中无疑会经历的许多重置、关闭和重新加载的影响。以下是我将如何实现这一点:

#为了简洁起见,这将在cog之外完成。
@客户端事件
原始反应添加上的异步def(有效负载):
通道=客户端.get\u通道(有效负载.channel\u id)
如果channel.guild为“无”:
return#这只会发生在DMs的情况下。
msg=等待通道。获取消息(有效负载。消息\u id)
如果len(味精反应)>反应极限:
等待消息。移除\u反应(payload.emoji.id,payload.user\u id)

如果我错了,您可以在评论中纠正我,但据我所知,您希望限制每个人在特定频道中每条消息的反应计数。你可以用不同的方法来做

  • 对于第一种方法,您可以使用嵌套的For循环获取所有反应用户,然后您可以签入
    on\u reaction\u add
    事件,如果添加新反应的人已经对此消息进行了例如3次反应
@client.event
反应添加时的异步定义(反应,用户):
channel=user.guild.get_channel()
如果reaction.message.channel==通道:
users=[reaction.message中的反应用户。wait reaction.users()中的反应用户。展平()
如果users.count(user)>=3:
等待反应。消息。移除反应(反应,用户)
  • 或者,您可以用另一种方法来实现这一点,而无需嵌套循环
@client.event
反应添加时的异步定义(反应,用户):
channel=user.guild.get_channel()
用户=[]
如果reaction.message.channel==通道:
对于i in reaction.message.reactions:
用户+=等待i.users().flatte()
如果users.count(user)>=3:
等待反应。消息。移除反应(反应,用户)
据我所知,第二个代码更优化

这两个选项都会阻止用户对特定频道中的一条消息使用3种以上的反应

编辑 如果要限制特定通道中所有消息的每个成员的反应量:

首先,您必须获取此频道的所有消息,您可以使用
discord.TextChannel.history()
来完成此操作。稍后,您必须了解这些消息的所有反应。之后,您可以在列表中获取反应用户,然后可以检查用户是否已经使用了3个反应

@client.event
安塞