【发布时间】:2021-07-25 01:16:10
【问题描述】:
我有一个机器人试图找出成员加入服务器时使用的邀请。
创建邀请后,机器人会将邀请列表保存到字典中,其中公会 ID 作为键,Invites 的列表作为值。
当成员加入服务器时,机器人会获取邀请列表并比较它们的使用情况。如果新获取的列表中的邀请比上次保存的使用次数多,那么我们知道邀请已被使用并告诉服务器,否则我们什么也不做
这是我的代码
class AdminCog(commands.Cog):
def __init__(self, bot: commands.Bot):
super().__init__(bot)
self.list_invites = {}
@commands.Cog.listener()
async def on_invite_create(self, invite: Invite):
self.list_invites[str(invite.guild.id)] = await invite.guild.invites()
announce_channel = ANNOUNCE_CHANNEL_ID
await announce_channel.send(f"{invite.inviter.mention} created an invite for channel "
f"{invite.channel.mention} with {invite.max_uses} max uses and "
f"a lifetime of {invite.max_age}")
@commands.Cog.listener()
@has_admin_role()
async def on_member_join(self, member: Member):
guild = member.guild
announce_channel = ANNOUNCE_CHANNEL_ID
new_invites = await member.guild.invites()
for old, new in zip(self.list_invites[str(guild.id)], new_invites):
if old.uses < new.uses:
await announce_channel.send(
f"{member.mention} a été invité par {new.inviter.mention} ({new.uses} invitations)")
self.list_invites[str(guild.id)] = new_invites
我知道一旦找到邀请,我可以在 for 中添加 break,但我不确定第一次满足条件时是否是正确的邀请,所以我将它们全部检查一遍。
问题在于,显然,当只有一个人加入服务器时,机器人认为它是通过大量邀请被邀请的
虽然这显然不可能发生,但正如您所见,邀请的使用次数仅针对一位邀请者提出
我的理论是 await invite.guild.invites() 返回一个缓存列表而不是实际列表,或者可能两次调用 await invite.guild.invites() 以不同的顺序给出列表。
你怎么看?我错过了什么吗?
【问题讨论】:
-
它实际上是在向您返回当前有效的邀请。
-
@BhavyadeepYadav 是的,这就是我想要的,当一个成员加入时,我只是比较邀请的旧保存与新的保存(在 1 个成员加入后),所以我应该只找到 1 个邀请使用次数增加了
-
哦!我需要一些时间。让我浏览一些文档,然后我会回到这个。
标签: python discord discord.py