我希望机器人在会员停止玩游戏后移除角色。
当会员不玩游戏时,就没有game = [i for i in after.activities if str(i.type) == "ActivityType.playing"]
了。
所以当我想删除角色时它找不到 game[0].name
。
我该如何解决这个问题?
@client.event
async def on_member_update(before, after):
game = [i for i in after.activities if str(i.type) == "ActivityType.playing"]
if game:
game_name = game[0].name
role = discord.utils.get(after.guild.roles, name=game_name)
if role == None:
await after.guild.create_role(name=game_name, hoist=True, mentionable=True)
await after.add_roles(role)
elif before.activities and not game:
game_name = game[0].name
role = discord.utils.get(after.guild.roles, name=game_name)
if role in after.roles:
await after.remove_roles(role)
<块引用>
File "C:\Users\BUGA\Documents\VSCODE\Python Projects\activity role\main.py", line 35, in on_member_update
game_name = game[0].name
IndexError: list index out of range
答案 0 :(得分:0)
如果您在用户停止玩游戏后尝试从他中删除角色,您应该检查他在 before
中玩的游戏,因为它仍然保留着他的游戏正在玩。
您需要获得 game
两次,或者更确切地说,将其拆分为 game_before
和 game_after
。
类似于:
@client.event
async def on_member_update(before, after):
game_before = [i for i in before.activities if str(i.type) == "ActivityType.playing"]
game_after = [i for i in after.activities if str(i.type) == "ActivityType.playing"]
if game_after:
game_name = game_after[0].name
role = discord.utils.get(after.guild.roles, name=game_name)
if role == None:
await after.guild.create_role(name=game_name, hoist=True, mentionable=True)
await after.add_roles(role)
elif game_before:
game_name = game_before[0].name
role = discord.utils.get(after.guild.roles, name=game_name)
if role in after.roles:
await after.remove_roles(role)
答案 1 :(得分:0)
您的问题发生是因为您只检查 Activity
中的 after
,因此如果您尝试从 after
中获取游戏名称,当然它会返回 { {1}} 在用户停止玩游戏后,您尝试访问游戏名称:
None
在第二个如果你应该检查之前的游戏名称,像这样:
game_name = game[0].name