Генератор Эмбеда 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 шт):

Автор решения: denisnumb

При использовании оператора * весь остальной текст сообщения будет записан в переменную 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-команды, в которых аргументы можно передавать не по порядку. Пример здесь.

→ Ссылка