diff options
Diffstat (limited to 'models')
| -rw-r--r-- | models/rich_text.py | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/models/rich_text.py b/models/rich_text.py index 2b433ec..e5441b6 100644 --- a/models/rich_text.py +++ b/models/rich_text.py | |||
| @@ -1,7 +1,43 @@ | |||
| 1 | from aiogram.types import MessageEntity | 1 | from typing import Self |
| 2 | |||
| 3 | from aiogram import Bot | ||
| 4 | from aiogram.types import Message, MessageEntity | ||
| 2 | from pydantic import BaseModel | 5 | from pydantic import BaseModel |
| 3 | 6 | ||
| 4 | 7 | ||
| 5 | class RichText(BaseModel): | 8 | class RichText(BaseModel): |
| 6 | text: str | 9 | text: str |
| 7 | entities: list[MessageEntity] = [] | 10 | entities: list[MessageEntity] = [] |
| 11 | |||
| 12 | @classmethod | ||
| 13 | def from_message(cls, msg: Message) -> Self: | ||
| 14 | assert msg.text is not None | ||
| 15 | return cls( | ||
| 16 | text=msg.text, | ||
| 17 | entities=[] if msg.entities is None else msg.entities, | ||
| 18 | ) | ||
| 19 | |||
| 20 | @classmethod | ||
| 21 | def from_text(cls, *text: RichText | str) -> Self: | ||
| 22 | result = cls(text="", entities=[]) | ||
| 23 | |||
| 24 | for t in text: | ||
| 25 | if isinstance(t, RichText): | ||
| 26 | entities = t.entities.copy() | ||
| 27 | for e in entities: | ||
| 28 | e.offset += len(result.text) | ||
| 29 | result.entities += entities | ||
| 30 | |||
| 31 | result.text += t.text | ||
| 32 | else: | ||
| 33 | result.text += t | ||
| 34 | |||
| 35 | return result | ||
| 36 | |||
| 37 | async def send(self, bot: Bot, chat_id: int) -> Message: | ||
| 38 | return await bot.send_message( | ||
| 39 | chat_id=chat_id, | ||
| 40 | text=self.text, | ||
| 41 | entities=self.entities, | ||
| 42 | parse_mode=None, | ||
| 43 | ) | ||
