discord.py - 停止玩游戏后删除角色

时间:2021-02-20 12:46:15

标签: python-3.x discord.py

我希望机器人在会员停止玩游戏后移除角色。

当会员不玩游戏时,就没有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

2 个答案:

答案 0 :(得分:0)

如果您在用户停止玩游戏后尝试从他中删除角色,您应该检查他在 before 中玩的游戏,因为它仍然保留着他的游戏正在玩。

您需要获得 game 两次,或者更确切地说,将其拆分为 game_beforegame_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
相关问题