Goshujin
@Goshujin
Я только начал изучать Python, не бейте.

Как отправить сообщение или Embed через одну команду?

Есть команда, которая отправляет передаваемое через команду сообщение, но как сделать чтобы передать можно было и Embed?
Имеющийся код:
@commands.command()
async def say(self, ctx, *, arg):
    await ctx.message.delete()
    await ctx.send(arg)
  • Вопрос задан
  • 244 просмотра
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
От пользователя нельзя отправить 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

Можно и есть способ лучше, но первое что в лоб приходит это вот такой говнокод.

Аж плохо стало
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы