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.

Cómo tener un menú de selección de roles (comandos de slash de py_cord)

Hola, estoy trabajando en un bot de Discord y estoy tratando de agregar la selección de un rol como argumento para este comando. Debería lucir algo como esto:

Imagen

Aquí está mi código actualmente:

@bot.slash_command(name="setrankroles", guild_ids=[898725831164178442])
async def setroles(ctx,
    role: Option(discord.Role,"¿Qué rol estás asignando?"),
    rank: Option(str, "¿Qué rango corresponde a ese rol?", choices=valid_ranks),
):

Esto produce el siguiente error:

Traceback (most recent call last):
  File "/home/maximummaxx/Documents/Coding/Python/Valorant_dc/main.py", line 205, in <module>
    role: Option(discord.Role,"¿Qué rol estás asignando?"),
  File "/home/maximummaxx/Documents/Coding/Python/Valorant_dc/env/lib/python3.9/site-packages/discord/commands/commands.py", line 510, in __init__
    to_assign = input_type() if isinstance(input_type, type) else input_type
TypeError: __init__() missing 3 required keyword-only arguments: 'guild', 'state', and 'data'

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el error está siendo causado por el argumento discord.Role en tu código. El objeto discord.Role requiere argumentos adicionales (guild, state y data) que deben pasarse para inicializarse correctamente.

    Para solucionar esto, puedes pasar los argumentos requeridos a discord.Role o cambiar el tipo de argumento a str y convertir manualmente la entrada a discord.Role en tu código.

    Aquí tienes un ejemplo de cómo convertir manualmente la entrada a discord.Role:

    @bot.slash_command(name="setrankroles", guild_ids=[898725831164178442])
    async def setroles(ctx,
        role: str,
        rank: Option(str, "¿Qué rango corresponde a ese rol?", choices=valid_ranks)
    ):
        role_obj = discord.utils.get(ctx.guild.roles, name=role)
        if role_obj is None:
            await ctx.send("Nombre de rol no válido.")
            return
        # Resto de tu código...
    

    En este ejemplo, obtenemos el objeto discord.Role basado en el nombre del rol utilizando discord.utils.get(). Si el nombre del rol es inválido o no existe, enviamos un mensaje de error y retornamos. De lo contrario, puedes continuar con el resto de tu código utilizando role_obj como el objeto discord.Role.

Comments are closed.