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: Tener una comprobación con dos salidas diferentes de errores.

Entonces, he agregado diferentes funciones a mi bot de Discord. Estoy trabajando en hacer que si una función se usa incorrectamente, pueda tener dos resultados de errores diferentes dependiendo de los permisos de los usuarios.

Por ejemplo:
Cuando uso el comando “!clear” como administrador del servidor, tengo configurado que obtendré el error “Especifique la cantidad de mensajes a eliminar” porque el comando se debe usar como “!clear (cantidad)”.

Pero cuando alguien que no es administrador ejecuta este comando, me gustaría que aparezca un error diferente. Por ejemplo, si un usuario normal intenta usar “!clear”, quiero que el mensaje de error diga “Error: No tienes permisos para este comando”.

Pero no puedo encontrar cómo aplicar dos resultados de errores diferentes a una función / comando.

Cada vez que ingreso a la cuenta normal y hago el comando “!clear”, aparece “Especifique la cantidad de mensajes a eliminar”, cuando solo quiero ese resultado de error para los administradores.

Solo quiero que aparezca el mensaje de error “Error: No tienes permisos para este comando” cuando un usuario normal intenta usar un comando de bot administrativo.

“`# Elimina los mensajes en un canal
@client.command()
@commands.has_permissions(administrator=True) # Solo permite que los administradores utilicen este comando
async def clear(ctx, amount : int):
await ctx.channel.purge(limit=amount)
await ctx.send('¡Se han eliminado los mensajes! :thumbsup:')

@clear.error
async def clear_error(ctx, error):
if isinstance(error, commands.MissingPermissions): # El error se muestra cuando alguien sin permisos intenta ejecutar el comando
await ctx.send('Error: No tienes permisos para este comando.')

@clear.error
async def clear_error(ctx, error): # El error se muestra cuando el usuario no especifica la cantidad de mensajes a eliminar
await ctx.send('Por favor, especifique la cantidad de mensajes a eliminar. :memo:')“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para aplicar dos salidas de error diferentes a una función/comando, puedes definir múltiples controladores de errores para el mismo comando, cada uno de ellos manejará un tipo específico de error. En el escenario dado, puedes utilizar el siguiente código para lograr el comportamiento deseado:

    # Borra los mensajes de un canal
    @client.command()
    @commands.has_permissions(administrator=True) # Solo permite a los administradores usar este comando
    async def clear(ctx, amount : int):
        await ctx.channel.purge(limit=amount)
        await ctx.send(f'**¡Se han borrado los mensajes! :thumbsup:**')
    
    @clear.error
    async def clear_error(ctx, error):
        if isinstance(error, commands.MissingPermissions): # Se produce un error cuando alguien sin permisos intenta ejecutar el comando.
            await ctx.send(f'**Error: No tienes permisos para este comando.**')
    
    @clear.error
    async def clear_error2(ctx, error): # Se produce un error cuando el usuario no especifica la cantidad de mensajes a borrar
        if isinstance(error, commands.MissingRequiredArgument):
            await ctx.send(f'**Por favor, especifica la cantidad de mensajes a borrar. :memo:**')
    

    En este fragmento de código modificado, hemos definido dos funciones clear_error, cada una de ellas maneja un tipo específico de error. La función clear_error que verifica los permisos faltantes se define primero, por lo que se ejecuta primero si el usuario no tiene permisos para usar el comando. La segunda función clear_error2 verifica si falta un argumento requerido (cantidad) y produce el mensaje de error deseado cuando un usuario regular olvida proporcionar el argumento requerido.

    Ten en cuenta que a la segunda función controladora de errores se le da un nombre diferente (clear_error2) para evitar sobrescribir la primera función controladora de errores (clear_error).

Comments are closed.