Генератор Эмбеда dicrord.py
@bot.command()
@commands.has_permissions(administrator=True)
async def emb(ctx, channel: discord.TextChannel, *, t1tle, hi, ):
embed=discord.Embed(title=t1tle, description=hi)
embed.set_footer(text="")
await channel.send(embed=embed)
Есть вот такой вот код, через чат запрашиваются аргументы, но это не работает.
Ignoring exception in command emb:
Traceback (most recent call last):
File "C:\Users\artem\PycharmProjects\Bombee\venv\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
TypeError: emb() missing 1 required keyword-only argument: 'hi'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\artem\PycharmProjects\Bombee\venv\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke
await ctx.command.invoke(ctx)
File "C:\Users\artem\PycharmProjects\Bombee\venv\lib\site-packages\discord\ext\commands\core.py", line 863, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "C:\Users\artem\PycharmProjects\Bombee\venv\lib\site-packages\discord\ext\commands\core.py", line 94, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: emb() missing 1 required keyword-only argument: 'hi'
Ответы (1 шт):
При использовании оператора * весь остальной текст сообщения будет записан в переменную title и аргумент hi в этом случае не будет передан в функцию, хотя он является обязательным.
Именно поэтому возникает ошибка о том, что аргумент hi не был передан.
Подробнее здесь.
Решение:
Чтобы решить проблему, просто сначала принимайте аргументы, состоящие из одного слова, а уже затем весь остальной текст:
async def emb(ctx, channel: discord.TextChannel, hi, *, title)
Либо, если в hi тоже нужно принять больше 1 слова, можно попросить пользователя указать такие аргументы с новой строки.
Тогда вы сможете получить аргументы так:
async def emb(ctx, channel: discord.TextChannel, *, title_and_hi):
title, hi = title_and_hi.split('\n')
print(f'title: {title}')
print(f'hi: {hi}')
Вывод:
title: значение аргумента title
hi: значение аргумента hi
Или, 3 вариант - slash-команды, в которых аргументы можно передавать не по порядку. Пример здесь.
