Hi, pls help me for my rank command and my rank system.
My /rank command does not work (my code is below). My link with the image does not work and I would like to have a code allowing me to modify the level and the xp.
THANKS
Code :
import discord
from discord import app_commands
from discord.ext import commands
import json
import asyncio
import random
intents = discord.Intents.default()
intents.typing = False # Désactive la réception d'événements de saisie
intents.presences = False # Désactive la réception d'événements de présence (statut)
bot = commands.Bot(command_prefix="?", intents=intents)
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
m = {}
@bot.event
async def on_ready():
global m
try:
with open("users.json", "r") as j:
m = json.load(j)
except FileNotFoundError:
m = {}
# Initialisez xp_required pour les utilisateurs qui n'ont pas cette clé
for user_id, user_data in m.items():
if "xp_required" not in user_data:
user_data["xp_required"] = 100
print("Bot is ready")
try:
synced = await bot.tree.sync(guild=discord.Object(id=1155538848630194236))
print(f"Synced {len(synced)} commands")
except Exception as e:
print(e)
@bot.event
async def on_message(message):
global m
if message.author != bot.user:
user_id = str(message.author.id)
if user_id not in m:
m[user_id] = {"xp": 0, "level": 1, "xp_required": 100}
xp_per_message = random.randint(
1, 10
) # Génère un nombre aléatoire entre 1 et 10 pour chaque message
m[user_id]["xp"] += xp_per_message
await check_level_up(message.author.id, user_id)
await save_data()
await bot.process_commands(message)
async def check_level_up(author_id, user_id):
current_xp = m[user_id]["xp"]
current_level = m[user_id]["level"]
required_xp = m[user_id]["xp_required"]
if current_xp >= required_xp:
m[user_id]["level"] += 1
m[user_id]["xp"] = 0 # Réinitialisez l'XP à zéro
m[user_id]["xp_required"] = 100 * (
current_level + 1
) # Mettez à jour l'XP nécessaire pour le prochain niveau
user = await bot.fetch_user(author_id) # Obtenez l'utilisateur à partir de l'ID
await send_level_up_embed(
user, current_level + 1, m[user_id]["xp"], required_xp
)
async def send_level_up_embed(user, new_level, current_xp, xp_required):
# Construisez l'URL de l'image en intégrant les informations de l'utilisateur
avatar_url = user.avatar.url # Obtenez l'URL de l'avatar de l'utilisateur
image_url = f"https://agg-api.vercel.app/rankcard?username={user.name}&xp={current_xp}&maxxp={xp_required}&level={new_level}&avatar={avatar_url}&blur=true&background=https://cdn.discordapp.com/attachments/1125453826489598014/1128268449060237342/Untitled_design_2.png&xpcolor=C1AFEB"
embed = discord.Embed(
title="Félicitations !",
description=f"{user.mention}, vous êtes passé au niveau {new_level} !",
color=discord.Color.green(),
)
# Ajoutez l'URL de l'image personnalisée à l'embed
embed.set_image(url=image_url)
channel = bot.get_channel(1155893201329197076) # Remplacez par l'ID de votre salon
if channel:
await channel.send(embed=embed)
@bot.tree.command(
guild=discord.Object(id=1155538848630194236),
name="rank",
description="Affiche votre rank sur le serveur",
)
async def rank(ctx):
user_id = str(ctx.author.id)
if user_id in m:
user_data = m[user_id]
level = user_data["level"]
xp = user_data["xp"]
xp_required = user_data["xp_required"]
await ctx.send(
f"{ctx.author.mention}, Votre niveau est {level}, votre XP est {xp}, et"
f" l'XP requise pour le niveau suivant est {xp_required}."
)
else:
await ctx.send(
"Vous n'avez pas encore gagné d'XP. Commencez à discuter pour gagner de"
" l'XP !"
)
async def save_data():
with open("users.json", "w") as j:
json.dump(m, j)
TOKEN = "hidden"
bot.run(TOKEN)
My code is in french.
Thanks