Bot没有删除事件上的角色



问题:

我正在py-cord中创建一个事件,用于检测用户是否添加了角色。如果他有管理员权限,机器人会允许他,如果他只有manage_roles权限,机器人会从获得角色的人那里删除该角色。作为一个例子,假设我只有管理角色权限,我想给我的朋友添加一个角色,机器人会从我的朋友那里删除这个角色。如果我有管理员权限,机器人会让我

<标题>我的代码:
@bot.event
async def on_member_update(before, after):
if len(after.roles) > len(before.roles):
# A role was added to the member
added_roles = [role for role in after.roles if role not in before.roles]
for role in added_roles:
if role.id == 1093503503680405614:
# Check if the role ID matches the specified role ID
updater = after.guild.get_member(after.guild.me.id)
if updater.guild_permissions.administrator:
print("he has admin")
elif updater.guild_permissions.manage_roles:
print("he has NOT admin")
await after.remove_roles(role)
<标题>结果:

如果我没有管理员权限,机器人会让用户拥有角色并打印(&;他有admin&;)

<标题>回溯:

除了打印"he has admin";我定义的print函数没有回溯。

问题1

updater = after.guild.get_member(after.guild.me.id)

公会。Me将返回该服务器上与您的bot用户相关的成员。所以你把updater设为你的bot。由于您的bot可能在服务器上具有管理权限,因此该条件将始终为真。如何获得正确更新角色的用户?

问题2

on_member_update事件只提供beforeafter参数,分别是更新前后的Member对象。我们无法通过观察这些物体来找出是谁执行了这个动作。要找出谁更新了成员,唯一的方法是查看审计日志。

解决方案您需要查看审计日志以找出谁更新了成员的角色。例如,此函数返回更新所提供成员角色的最新主持人:

async def get_role_updater(member):
"""find out who updated this member's roles"""
guild = member.guild
action = discord.AuditLogAction.member_role_update
async for entry in guild.audit_logs(action=action, limit=5):
if entry.target == member:
return entry.user

我没有测试这段代码,但假设它按预期工作,您可以简单地在代码中使用这个函数:

@bot.event
async def on_member_update(before, after):
if len(after.roles) > len(before.roles):
# A role was added to the member
added_roles = [role for role in after.roles if role not in before.roles]
for role in added_roles:
if role.id == 1093503503680405614:
# Check if the role ID matches the specified role ID
updater = await get_role_updater(after)
if updater.guild_permissions.administrator:
print("he has admin")
elif updater.guild_permissions.manage_roles:
print("he has NOT admin")
await after.remove_roles(role)

我认为问题出在这部分:

added_roles = [role for role in after.roles if role not in before.roles]
for role in added_roles:
if role.id == 1093503503680405614:
# Check if the role ID matches the specified role ID

在"added_roles"中,我认为您正在添加角色对象。也许可以尝试用role.id for role in after.roles if role not in before.roles

替换[]中的文本

相关内容

最新更新