Discord.py cómo pasar ctx como argumento predeterminado

Aug 15 2020

Estoy escribiendo un comando de perfil usando Discord.py que imprime información sobre el usuario especificado.

Me gustaría pasar el autor del mensaje como el argumento predeterminado, por lo que si el usuario solo escribe el comando y nada más, el bot enviará su perfil.

@bot.command()
async def profile(ctx, *, user: discord.Member = ctx.message.author):

El código anterior no funciona. Se produce un error con el siguiente error:

Traceback (most recent call last):
  File "bot.py", line 50, in <module>
    async def profile(ctx, *, user: discord.Member = ctx.message.author.name):
NameError: name 'ctx' is not defined

¿Alguien puede decirme qué estoy haciendo mal y cómo hacer que mi código funcione?

EDITAR:

De alguna manera evité el problema con:

@bot.command()
async def profile(ctx, *, user: discord.Member=None):
        if(user == None):
                user = ctx.message.author

Mi pregunta aún permanece, ¿hay alguna forma de pasar ctx como argumento predeterminado?

Respuestas

1 fixmycode Aug 15 2020 at 16:39

La respuesta corta es que no puede hacer eso, ya que estaría alterando la firma de la función. Los comandos se llaman esperando esta firma:

async def my_command(ctx, *args, **kwargs):

ctxno es un valor dado, solo el nombre del primer parámetro. No puede hacer suposiciones sobre para qué se utilizará.

Lo que puede hacer es asumir la cantidad de parámetros, siguiendo el ejemplo que está en la documentación de discord.py, puede hacer algo como esto:

async def profile(ctx, *, user:discord.Member):
    member = user or ctx.message.author

En este código, puede asumir memberque siempre es un Miembro, excepto en un canal privado, cuando sería un Usuario.

2 Videro Aug 15 2020 at 16:37

puedes usar esto -

user = ctx.author if not user else user

en vez de -

if(user == None):
                user = ctx.message.author