Discord.py jak przekazać ctx jako domyślny argument
Piszę polecenie profilu za pomocą Discord.py, które wyświetla informacje o określonym użytkowniku.
Chciałbym podać autora wiadomości jako domyślny argument, więc jeśli użytkownik tylko napisze polecenie i nic więcej, bot wyśle swój profil.
@bot.command()
async def profile(ctx, *, user: discord.Member = ctx.message.author):
Powyższy kod nie działa. Pojawia się następujący błąd:
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
Czy ktoś może mi powiedzieć, co robię źle i jak sprawić, by mój kod działał?
EDYTOWAĆ:
W pewnym sensie ominąłem problem z:
@bot.command()
async def profile(ctx, *, user: discord.Member=None):
if(user == None):
user = ctx.message.author
Moje pytanie wciąż pozostaje, czy istnieje sposób na przekazanie ctx jako domyślnego argumentu?
Odpowiedzi
Krótka odpowiedź jest taka, że nie możesz tego zrobić, ponieważ zmieniłbyś podpis funkcji. Polecenia są wywoływane z oczekiwaniem na ten podpis:
async def my_command(ctx, *args, **kwargs):
ctx
nie jest podaną wartością, a jedynie nazwą pierwszego parametru. Nie możesz zakładać, do czego ma służyć.
To, co możesz zrobić, to założyć liczbę parametrów, postępując zgodnie z przykładem w dokumentacji discord.py, możesz zrobić coś takiego:
async def profile(ctx, *, user:discord.Member):
member = user or ctx.message.author
W tym kodzie możesz założyć, że member
jest to zawsze członek, z wyjątkiem kanału prywatnego, kiedy to byłby użytkownik.
możesz tego użyć -
user = ctx.author if not user else user
zamiast -
if(user == None):
user = ctx.message.author