即使用户没有该角色,discord.py 也匹配排名角色

时间:2021-01-12 07:25:39

标签: discord.py

我正在编写我的关卡系统,但我发现了一个问题。 由于我想做排名角色(即通过排名获得的角色)我做了这个脚本:

async def role_up_by_xp_comand(cursor, check_level, user):
    if check_level == 1:
        recluta = get(user.guild.roles, id=690962671847342171)
        ambientato = get(user.guild.roles, id=690962461255270440)
        presente = get(user.guild.roles, id=690962769511710811)
        attivo = get(user.guild.roles, id=690962456897650755)
        rilevante = get(user.guild.roles, id=690962450211799070)
        veterano = get(user.guild.roles, id=690962271962267758)
        booster = get(user.guild.roles, id=726498072581898250)
        storico = get(user.guild.roles, id=690967861404893234)
        print(recluta, ambientato, presente, attivo, rilevante, veterano, booster, storico)
        cursor.execute(f"SELECT user_level FROM users WHERE client_id = {str(user.id)}")
        level = cursor.fetchall()
        lvl_user = level[0][0]
        print(str(lvl_user))
        if storico or booster:
            print(f"{user.name} ha un ruolo attività fisso quindi non non posso aumentargli il ruolo")
            return
        if 5 >= lvl_user <= 9:
            await user.remove_roles(recluta)
            await user.add_roles(ambientato)
            print(f"{user.name} è ufficialmente ambientato")
        elif 10 >= lvl_user <= 14:
            print("Ci sei arrivato")
            if recluta:
                print("Ci sei arrivato 2 volte")
                await user.remove_roles(recluta)
                await user.add_roles(presente)
                print(f"{user.name} è ufficialmente presente")
            elif ambientato:
                print("Ci sei arrivato 2 volte x2")
                print(user, ambientato, presente)
                await user.remove_roles(ambientato)
                await user.add_roles(presente)
                print(f"{user.name} è ufficialmente presente")
        elif 15 >= lvl_user <= 19:
            if recluta:
                await user.remove_roles(recluta)
                await user.add_roles(attivo)
                print(f"{user.name} è ufficialmente attivo")
            elif ambientato:
                await user.remove_roles(ambientato)
                await user.add_roles(attivo)
                print(f"{user.name} è ufficialmente attivo")
            elif presente:
                await user.remove_roles(presente)
                await user.add_roles(attivo)
                print(f"{user.name} è ufficialmente attivo")
        elif 20 >= lvl_user <= 24:
            if recluta:
                await user.remove_roles(recluta)
                await user.add_roles(rilevante)
                print(f"{user.name} è ufficialmente attivo")
            elif ambientato:
                await user.remove_roles(ambientato)
                await user.add_roles(attivo)
                print(f"{user.name} è ufficialmente attivo")
            elif presente:
                await user.remove_roles(presente)
                await user.add_roles(rilevante)
                print(f"{user.name} è ufficialmente attivo")
            elif attivo:
                await user.remove_roles(attivo)
                await user.add_roles(rilevante)
                print(f"{user.name} è ufficialmente rilevante")
        elif 25 >= lvl_user:
            if recluta:
                await user.remove_roles(recluta)
                await user.add_roles(veterano)
                print(f"{user.name} è ufficialmente veterano")
            elif ambientato:
                await user.remove_roles(ambientato)
                await user.add_roles(veterano)
                print(f"{user.name} è ufficialmente veterano")
            elif presente:
                await user.remove_roles(presente)
                await user.add_roles(veterano)
                print(f"{user.name} è ufficialmente veterano")
            elif attivo:
                await user.remove_roles(attivo)
                await user.add_roles(veterano)
                print(f"{user.name} è ufficialmente veterano")
            elif rilevante:
                await user.remove_roles(rilevante)
                await user.add_roles(veterano)
                print(f"{user.name} è ufficialmente veterano")

问题是,尽管已经正确设置了角色(user 来自 discord.Member),即使用户看到第一个 if (if storico or booster:)没有那两个角色他接受条件。有时它会给我像 None 这样的角色,即使它们设置正确,有时它也会给它们正确的但它们仍然不起作用。我不明白发生了什么我发送了完整的脚本:

@client.command()
async def xp(ctx, xp: int, member: discord.Member=None):
    embed = discord.Embed(
        color=0xa61022
    )
    if not xp:
        embed.set_author(
            name="Per favore specifica quanto xp deve ricevere l'utente!",
        )
        await ctx.send(embed=embed, delete_after=10.0)
        return
    if not member:
        embed.set_author(
            name="Per favore specifica l'utente!",
        )
        await ctx.send(embed=embed, delete_after=10.0)
        return
    if member.bot:
        embed.set_author(
            name="Non puoi dare xp ai bot!",
        )
        await ctx.send(embed=embed, delete_after=10.0)
        return
    cursor = levelsystem_db.cursor()
    cursor.execute(f"SELECT user_xp FROM users WHERE client_id = {str(member.id)}")
    result = cursor.fetchall()
    print(result)
    print(len(result))
    if (len(result) == 0):
        print("L'utente non è stato aggiunto al database.")
        cursor.execute(f"INSERT INTO users VALUES({str(member.id)} ,{str(xp)} , 0)")
        levelsystem_db.commit()
        print("Aggiunta completata")
        print(f"{member.name} ha ricevuto {str(xp)} xp")
        check_level = await level_up(cursor, xp, member)
        print(check_level)
        await role_up_by_xp_comand(cursor, check_level, member)
    else:
        newXP = result[0][0] + xp
        print(f"Gli xp di {member.name} sono aggiornati a {newXP}")
        cursor.execute(f"UPDATE users SET user_xp = {str(newXP)} WHERE client_id = {str(member.id)}")
        levelsystem_db.commit()
        print(f"Aggiornamento degli xs di {member.name} completato.")
        check_level = await level_up(cursor, newXP, member)
        print(check_level)
        await role_up_by_xp_comand(cursor, check_level, member)
    embed = discord.Embed(
        color=0x03c03c
    )
    embed.set_author(
        name=f'Ho dato {xp}xp a {member.name}',
    )
    await ctx.send(embed=embed, delete_after=10.0)

async def level_up(cursor, NewXP, user):
    channel = client.get_channel(640563710104043530)
    cursor.execute(f"SELECT user_level FROM users WHERE client_id = {str(user.id)}")
    level = cursor.fetchall()
    lvl_start = level[0][0]
    lvl_end = int(NewXP ** (1/4))
    print(str(lvl_start), str(lvl_end))
    if (str(lvl_end) < str(lvl_start)) or (str(lvl_start) < str(lvl_end)):
        await channel.send(f"{user.mention} è salito al livello {lvl_end}")
        print(f"Il livello di {user.name} si sta aggiornando al livello {lvl_end}")
        cursor.execute(f"UPDATE users SET user_level = {str(lvl_end)} WHERE client_id = {str(user.id)}")
        levelsystem_db.commit()
        print(f"Aggiornamento del livello di {user.name} completato.")
        check_level = 1
        return check_level
    else:
        print("Non è abbastanza!")
        check_level = 0
        return check_level

async def role_up_by_xp_comand(cursor, check_level, user):
    if check_level == 1:
        recluta = get(user.guild.roles, id=690962671847342171)
        ambientato = get(user.guild.roles, id=690962461255270440)
        presente = get(user.guild.roles, id=690962769511710811)
        attivo = get(user.guild.roles, id=690962456897650755)
        rilevante = get(user.guild.roles, id=690962450211799070)
        veterano = get(user.guild.roles, id=690962271962267758)
        booster = get(user.guild.roles, id=726498072581898250)
        storico = get(user.guild.roles, id=690967861404893234)
        print(recluta, ambientato, presente, attivo, rilevante, veterano, booster, storico)
        cursor.execute(f"SELECT user_level FROM users WHERE client_id = {str(user.id)}")
        level = cursor.fetchall()
        lvl_user = level[0][0]
        print(str(lvl_user))
        if storico or booster:
            print(f"{user.name} ha un ruolo attività fisso quindi non non posso aumentargli il ruolo")
            return
        if 5 >= lvl_user <= 9:
            await user.remove_roles(recluta)
            await user.add_roles(ambientato)
            print(f"{user.name} è ufficialmente ambientato")
        elif 10 >= lvl_user <= 14:
            print("Ci sei arrivato")
            if recluta:
                print("Ci sei arrivato 2 volte")
                await user.remove_roles(recluta)
                await user.add_roles(presente)
                print(f"{user.name} è ufficialmente presente")
            elif ambientato:
                print("Ci sei arrivato 2 volte x2")
                print(user, ambientato, presente)
                await user.remove_roles(ambientato)
                await user.add_roles(presente)
                print(f"{user.name} è ufficialmente presente")
        elif 15 >= lvl_user <= 19:
            if recluta:
                await user.remove_roles(recluta)
                await user.add_roles(attivo)
                print(f"{user.name} è ufficialmente attivo")
            elif ambientato:
                await user.remove_roles(ambientato)
                await user.add_roles(attivo)
                print(f"{user.name} è ufficialmente attivo")
            elif presente:
                await user.remove_roles(presente)
                await user.add_roles(attivo)
                print(f"{user.name} è ufficialmente attivo")
        elif 20 >= lvl_user <= 24:
            if recluta:
                await user.remove_roles(recluta)
                await user.add_roles(rilevante)
                print(f"{user.name} è ufficialmente attivo")
            elif ambientato:
                await user.remove_roles(ambientato)
                await user.add_roles(attivo)
                print(f"{user.name} è ufficialmente attivo")
            elif presente:
                await user.remove_roles(presente)
                await user.add_roles(rilevante)
                print(f"{user.name} è ufficialmente attivo")
            elif attivo:
                await user.remove_roles(attivo)
                await user.add_roles(rilevante)
                print(f"{user.name} è ufficialmente rilevante")
        elif 25 >= lvl_user:
            if recluta:
                await user.remove_roles(recluta)
                await user.add_roles(veterano)
                print(f"{user.name} è ufficialmente veterano")
            elif ambientato:
                await user.remove_roles(ambientato)
                await user.add_roles(veterano)
                print(f"{user.name} è ufficialmente veterano")
            elif presente:
                await user.remove_roles(presente)
                await user.add_roles(veterano)
                print(f"{user.name} è ufficialmente veterano")
            elif attivo:
                await user.remove_roles(attivo)
                await user.add_roles(veterano)
                print(f"{user.name} è ufficialmente veterano")
            elif rilevante:
                await user.remove_roles(rilevante)
                await user.add_roles(veterano)
                print(f"{user.name} è ufficialmente veterano")

1 个答案:

答案 0 :(得分:0)

不是检查用户是否具有该角色,而是检查公会是否知道该角色。

booster = get(user.guild.roles, id=726498072581898250)
storico = get(user.guild.roles, id=690967861404893234)

以上将从公会中检索具有该 id 的角色,而不是用户。 如果这些角色存在,那么它们将被返回。由于 if storico or booster: 会检查其中任何一个是否为空,因此除非服务器上不存在这些角色,否则此语句将始终为真。

要检查实际用户的角色,您需要访问 roles 属性,如下所述:https://discordpy.readthedocs.io/en/latest/api.html#Member

我手头没有 IDE,但检查成员是否具有该角色可能类似于:

booster = get(user.roles, id=726498072581898250)