我正在编写我的关卡系统,但我发现了一个问题。 由于我想做排名角色(即通过排名获得的角色)我做了这个脚本:
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")
答案 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)