Есть самый простой фрагмент кода (Python + Aiogram):
@app.on_message(filters.chat(some_chat_id))
async def test_reply(client, message):
ent = [
types.MessageEntity("text_mention", 0, len(message.from_user.first_name), user=message.from_user),
types.MessageEntity("bold", len(message.from_user.first_name), 9)
]
await message.reply(f'{message.from_user.first_name}, привет!', entities=ent)
Создаём свой
text_mention (
упоминание юзера в виде ссылки) для
entities. Создаём жирный текст (
или любой другой объект MessageEntity) с индексом начала, равному длине имени юзера и индексом конца, равному длине имени + длине жирного текста (в моём случае 9 символов). Отвечаем юзеру, используя наши entities.
Так это выглядит в Телеграм
Но если имя юзера содержит некоторые эмодзи, то со сдвигом и длинной начинаются проблемы. Суть в том, что функция
len() считает их за два символа, а Telegram - нет. Например, если добавить в имя смайл с кастомным цветом, у нас сдвинется entity: буква Т и восклицательный знак уже не попадут в форматирование жирным текстом, снизу прикрепил пример.
Почему это так работает, как бороться с кривым смещением? Может быть это связано с кодировками (
код в UTF-8)?
Нужна только такая связка, с использованием message.entities