es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

discord.py perfil personalizado con biografía

Estoy intentando codificar un bot de Discord donde todos los usuarios tienen un perfil personalizable. Cada vez que ejecutan el comando !perfil, el bot mostrará un embed con una biografía. El embed tendrá un color personalizado elegido por el usuario y otra información como sus monedas, etc. Quiero hacer que cuando ejecuten algo como !bio prueba, el embed de su perfil tendrá el mensaje prueba, y si ejecutan !bio Lorem, su biografía personalizada se editará a Lorem, y así sucesivamente. Sin embargo, cuando intenté hacer el comando !bio prueba, no funciona.

def saveJson(data, file):
    json.dump(data, open(file, "w"), indent = 4)

@client.command(aliases=["b"])
async def bio(ctx, *, message):
  user = ctx.author.id
  username = str(ctx.author)
    description['usuarios'].append({
      'id': user,
      'nombre': username,
      'descripcion': [message]
    })
    saveJson(description, "./perfil.json")

Más adelante, en el comando de perfil, mi bot encontrará la parte de la descripción en el archivo JSON y la mostrará cada vez que alguien revise tu perfil.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, debes modificar la función bio del comando de manera que lea los datos existentes de profile.json, encuentre el perfil del usuario, actualice el campo de biografía con el nuevo mensaje y luego lo guarde de nuevo en el archivo JSON. A continuación, se muestra una versión de la función que debería funcionar:

    @client.command(aliases=["b"])
    async def bio(ctx, *, message):
        with open("profile.json") as f:
            data = json.load(f)
    
        user_id = str(ctx.author.id)
        user_profile = next((p for p in data["users"] if p["id"] == user_id), None)
        if user_profile is None:
            user_profile = {"id": user_id, "name": str(ctx.author), "description": ""}
            data["users"].append(user_profile)
    
        user_profile["description"] = message
        saveJson(data, "profile.json")
    
        embed = discord.Embed(
            title="Perfil",
            color=user_profile.get("color", discord.Color.blue()).value,
        )
        embed.add_field(name="Nombre", value=user_profile["name"], inline=False)
        embed.add_field(name="Biografía", value=user_profile["description"], inline=False)
        embed.set_thumbnail(url=ctx.author.avatar_url)
    
        await ctx.send(embed=embed)
    

    Esta versión del comando bio realiza lo siguiente:

    1. Lee el archivo profile.json existente y carga su contenido en un diccionario de Python.
    2. Encuentra el perfil del usuario en el diccionario en función de su ID de usuario de Discord (ctx.author.id), o crea un nuevo perfil vacío si todavía no lo tiene.
    3. Actualiza el campo description del perfil del usuario con el nuevo message.
    4. Guarda el diccionario modificado de nuevo en profile.json.
    5. Crea un objeto Embed para mostrar el perfil actualizado del usuario.
    6. Envía el objeto Embed como mensaje en el canal de Discord donde se invocó el comando.

    Ten en cuenta que esta versión del comando bio también incluye algunas funcionalidades adicionales:

    • Crea un color predeterminado de Embed azul, pero permite a los usuarios personalizar su color agregando un campo color a su perfil.
    • Incluye el avatar de Discord del usuario como miniatura en el Embed del perfil.
    • Envía el Embed del perfil como respuesta al comando del usuario, en lugar de esperar a que ejecuten un comando separado !profile.

Comments are closed.