from typing import Self from aiogram import Bot from aiogram.types import Message, MessageEntity, ReplyMarkupUnion from pydantic import BaseModel class RichText(BaseModel): text: str entities: list[MessageEntity] = [] @classmethod def from_message(cls, msg: Message) -> Self: assert msg.text is not None return cls( text=msg.text, entities=[] if msg.entities is None else msg.entities, ) @classmethod def from_text(cls, *text: RichText | str) -> Self: result = cls(text="", entities=[]) for t in text: if isinstance(t, RichText): entities = t.entities.copy() for e in entities: e.offset += len(result.text) result.entities += entities result.text += t.text else: result.text += t return result async def send( self, bot: Bot, chat_id: int, reply_markup: ReplyMarkupUnion | None = None, ) -> Message: return await bot.send_message( chat_id=chat_id, text=self.text, entities=self.entities, parse_mode=None, reply_markup=reply_markup, )