Discord.py come passare ctx come argomento predefinito
Sto scrivendo un comando di profilo utilizzando Discord.py che stampa le informazioni sull'utente specificato.
Vorrei passare l'autore del messaggio come argomento predefinito, quindi se l'utente scrive solo il comando e nient'altro, il bot invierà il proprio profilo.
@bot.command()
async def profile(ctx, *, user: discord.Member = ctx.message.author):
Il codice sopra non funziona. Si sbaglia con il seguente errore:
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
Qualcuno può dirmi cosa sto sbagliando e come far funzionare il mio codice?
MODIFICARE:
Ho in qualche modo aggirato il problema con:
@bot.command()
async def profile(ctx, *, user: discord.Member=None):
if(user == None):
user = ctx.message.author
La mia domanda rimane ancora, c'è un modo per passare ctx come argomento predefinito?
Risposte
La risposta breve è che non puoi farlo, poiché altereresti la firma della funzione. I comandi vengono chiamati aspettando questa firma:
async def my_command(ctx, *args, **kwargs):
ctx
non è un valore dato, solo il nome del primo parametro. Non puoi fare supposizioni su ciò per cui verrà utilizzato.
Quello che puoi fare è assumere il numero di parametri, seguendo l'esempio che è nella documentazione di discord.py, puoi fare qualcosa del genere:
async def profile(ctx, *, user:discord.Member):
member = user or ctx.message.author
In questo codice, puoi presumere che member
sia sempre un membro, tranne che in un canale privato, quando sarebbe un utente.
puoi usare questo -
user = ctx.author if not user else user
invece di -
if(user == None):
user = ctx.message.author