Внедрить отправителя в discord.py , с тремя пользовательскими аргументами

#python #discord #discord.py

#python #Discord #discord.py

Вопрос:

Я пытаюсь создать простой отправитель для встраивания, который состоит из частей: Заголовок, Описание и нижний колонтитул.

Вот мой код:

 @bot.command()
async def embed(ctx, *, title, desc, footer):
    embed = discord.Embed(title=f"{title}", description=f"{desc}", color=0x00ff00)
    embed.set_footer(text=f"{footer}")
    await ctx.send(embed=embed)
  

Ошибка, с которой я сталкиваюсь, заключается в следующем:

 Traceback (most recent call last):
  File "C:UsersRyzenAppDataRoamingPythonPython37site-packagesdiscordextcommandsbot.py", line 892, in invoke
    await ctx.command.invoke(ctx)
  File "C:UsersRyzenAppDataRoamingPythonPython37site-packagesdiscordextcommandscore.py", line 797, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:UsersRyzenAppDataRoamingPythonPython37site-packagesdiscordextcommandscore.py", line 92, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: embed() missing 2 required keyword-only arguments: 'desc' and 'footer'
  

Спасибо за помощь.

Ответ №1:

Вы также можете передать длинную строку в свою переменную, используя кавычки:

 async def embed(ctx, title, desc, footer):
    embed = discord.Embed(title=title, description=desc, color=0x00ff00)
    embed.set_footer(text=footer)
    await ctx.send(embed=embed)
  

Использование: {prefix}embed "title here" "desc here" "footer here"

Комментарии:

1. Спасибо, брат. Вы мне очень помогли

Ответ №2:

Команды In * получат все после него, использование переменных превратит его в одно слово.

Используя * , чтобы получить все данные как одну переменную. Вы должны каким-то образом разделить данные, я сделал это здесь, используя - которые, чтобы составить список индексов укусов, которые комментируются в коде.

Используйте это так {prefix}embed title here - desc here - footer here

 @bot.command()
async def embed(ctx, *, data):
    data = data.split('-')  # title = 0, desc = 1, footer=2
    embed = discord.Embed(
        title=f"{data[0]}", description=f"{data[1]}", color=0x00ff00)
    embed.set_footer(text=f"{data[2]}")
    await ctx.send(embed=embed)
  

Ответ №3:

У вас может быть только один аргумент после * , и все остальные данные будут переданы в этом одном аргументе.

Например: async def embed(ctx, title, desc, *, footer)

Если вы передадите следующую команду: !embed Lorem ipsum dolor sit amet

Вы получите переменные, которые выглядят как:

 title = "Lorem"
desc = "ipsum"
footer = "dolor sit amet"
  

Ответ №4:

Дополнительно

 @bot.command()
async def embed(ctx, *, data):
    await ctx.message.delete()
    data = data.split('-')
    embed=discord.Embed(
       title=f"{data[0]}", url=f"{data[1]}", description=f"{data[2]}", color=0x00ff00)
    embed.set_author(
        name=f"{data[3]}", url=f"{data[4]}", icon_url=f"{data[5]}")
    embed.set_thumbnail(
      url=f"{data[6]}")
    embed.add_field(name=f"{data[7]}", value=f"{data[8]}", inline=True)
    embed.add_field(name=f"{data[9]}", value=f"{data[10]}", inline=True)
    embed.set_footer(text=f"{data[11]}")
    await ctx.send(embed=embed)
  # title = 0
  # title url = 1
  # description = 2
  # name = 3
  # name url = 4
  # icon url = 5
  # mini icon url = 6
  # name = 7
  # vaule = 8
  # name = 9
  # vaule = 10
  # footer = 11
  

Комментарии:

1. Было бы чрезвычайно полезно, если бы вы могли улучшить ответ комментарием, объясняющим, как работает ваш код