От пользователя нельзя отправить embed. Можно создать какой нибудь свой формат для embed и воссоздать его в коде. Понятия не имею можно ли передать нормально код, но можно сделать вот такой костыль:
1. Создаем конструкцию нужную нам в JSON формате, я сделал такой, понятно что можно дорабатывать под себя бесконечно:
{"title": "Информация о пользователе", "color": "0xEE82EE", "fields": [{"name": "Присоеденился к серверу", "value": "joined_at"}, {"name": "Присоеденился к Discord", "value": "created_at"}, {"name": "Роли", "value": "roles"}]}
.
Ну и парс переменных можно сделать какой нибудь получше.
2. Кодируем ее в b64, потому что дискордру почему-то ругается на кавычки, опять таки, может есть и другой вариант, но раз писать такое, то отрываться по полной.
eyJ0aXRsZSI6ICLQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDQv9C+0LvRjNC30L7QstCw0YLQtdC70LUiLCAiY29sb3IiOiAiMHhFRTgyRUUiLCAiZmllbGRzIjogW3sibmFtZSI6ICLQn9GA0LjRgdC+0LXQtNC10L3QuNC70YHRjyDQuiDRgdC10YDQstC10YDRgyIsICJ2YWx1ZSI6ICJqb2luZWRfYXQifSwgeyJuYW1lIjogItCf0YDQuNGB0L7QtdC00LXQvdC40LvRgdGPINC6IERpc2NvcmQiLCAidmFsdWUiOiAiY3JlYXRlZF9hdCJ9LCB7Im5hbWUiOiAi0KDQvtC70LgiLCAidmFsdWUiOiAicm9sZXMifV19
3. Отправляем нашу base64 строку как аргумент в команду say, строка без проблем проглатывается
4. В функции обработчике декодируем ее, и читаем как обычный JSON, строя наш embed по своим правилам
def make_embed(embed_json, ctx):
emb = discord.Embed(title=embed_json.get('title', '-'), color=int(embed_json.get('color', 0xEE82EE), 16))
fields = embed_json.get('fields', [])
for field in fields:
field_value = field.get('value', '-')
if field_value == 'joined_at':
field_value = ctx.message.author.joined_at.strftime('%d.%m.%Y %H:%M:%S')
elif field_value == 'created_at':
field_value = ctx.message.author.created_at.strftime('%d.%m.%Y %H:%M:%S')
elif field_value == 'roles':
field_value = ctx.message.author.roles
emb.add_field(name=field.get('name', '-'), value=field_value)
return emb
@bot.command()
async def say(ctx, arg, isbase64=False):
if isbase64:
try:
decoded_embed = json.loads(base64.b64decode(arg.encode('utf-8')).decode('utf-8'))
except Exception as e:
await ctx.send(f'Ошибка при распаковке base64: {e}')
return
embed = make_embed(decoded_embed, ctx)
await ctx.send(embed=embed)
else:
await ctx.send(arg)
Соответственно, отправляя
!say text
мы получим в ответ просто текст, точно так же как и при
!say eyJ0aXRsZSI6ICLQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDQv9C+0LvRjNC30L7QstCw0YLQtdC70LUiLCAiY29sb3IiOiAiMHhFRTgyRUUiLCAiZmllbGRzIjogW3sibmFtZSI6ICLQn9GA0LjRgdC+0LXQtNC10L3QuNC70YHRjyDQuiDRgdC10YDQstC10YDRgyIsICJ2YWx1ZSI6ICJqb2luZWRfYXQifSwgeyJuYW1lIjogItCf0YDQuNGB0L7QtdC00LXQvdC40LvRgdGPINC6IERpc2NvcmQiLCAidmFsdWUiOiAiY3JlYXRlZF9hdCJ9LCB7Im5hbWUiOiAi0KDQvtC70LgiLCAidmFsdWUiOiAicm9sZXMifV19
. Однако, если передадим третий параметр True:
!say eyJ0aXRsZSI6ICLQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDQv9C+0LvRjNC30L7QstCw0YLQtdC70LUiLCAiY29sb3IiOiAiMHhFRTgyRUUiLCAiZmllbGRzIjogW3sibmFtZSI6ICLQn9GA0LjRgdC+0LXQtNC10L3QuNC70YHRjyDQuiDRgdC10YDQstC10YDRgyIsICJ2YWx1ZSI6ICJqb2luZWRfYXQifSwgeyJuYW1lIjogItCf0YDQuNGB0L7QtdC00LXQvdC40LvRgdGPINC6IERpc2NvcmQiLCAidmFsdWUiOiAiY3JlYXRlZF9hdCJ9LCB7Im5hbWUiOiAi0KDQvtC70LgiLCAidmFsdWUiOiAicm9sZXMifV19 True
то второй аргумент будет обрабатываться уже как base64 строка, и строить embed
Можно и есть способ лучше, но первое что в лоб приходит это вот такой говнокод.
Аж плохо стало