Add support for manual text entities.

This commit is contained in:
Dan 2020-11-29 15:48:29 +01:00
parent 72db61a416
commit 384f4eba71
18 changed files with 270 additions and 59 deletions

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, List
from pyrogram import types from pyrogram import types
from pyrogram.scaffold import Scaffold from pyrogram.scaffold import Scaffold
@ -29,6 +29,7 @@ class EditMessageCaption(Scaffold):
message_id: int, message_id: int,
caption: str, caption: str,
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
) -> "types.Message": ) -> "types.Message":
"""Edit the caption of media messages. """Edit the caption of media messages.
@ -52,6 +53,9 @@ class EditMessageCaption(Scaffold):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup`, *optional*): reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup`, *optional*):
An InlineKeyboardMarkup object. An InlineKeyboardMarkup object.
@ -68,5 +72,6 @@ class EditMessageCaption(Scaffold):
message_id=message_id, message_id=message_id,
text=caption, text=caption,
parse_mode=parse_mode, parse_mode=parse_mode,
entities=caption_entities,
reply_markup=reply_markup reply_markup=reply_markup
) )

View File

@ -16,10 +16,11 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, List
from pyrogram import raw from pyrogram import raw
from pyrogram import types from pyrogram import types
from pyrogram import utils
from pyrogram.scaffold import Scaffold from pyrogram.scaffold import Scaffold
@ -30,6 +31,7 @@ class EditMessageText(Scaffold):
message_id: int, message_id: int,
text: str, text: str,
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
entities: List["types.MessageEntity"] = None,
disable_web_page_preview: bool = None, disable_web_page_preview: bool = None,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
) -> "types.Message": ) -> "types.Message":
@ -54,6 +56,9 @@ class EditMessageText(Scaffold):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in message text, which can be specified instead of __parse_mode__.
disable_web_page_preview (``bool``, *optional*): disable_web_page_preview (``bool``, *optional*):
Disables link previews for links in this message. Disables link previews for links in this message.
@ -81,7 +86,7 @@ class EditMessageText(Scaffold):
id=message_id, id=message_id,
no_webpage=disable_web_page_preview or None, no_webpage=disable_web_page_preview or None,
reply_markup=reply_markup.write() if reply_markup else None, reply_markup=reply_markup.write() if reply_markup else None,
**await self.parser.parse(text, parse_mode) **await utils.parse_text_entities(self, text, parse_mode, entities)
) )
) )

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO from typing import Union, BinaryIO, List
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -37,6 +37,7 @@ class SendAnimation(Scaffold):
caption: str = "", caption: str = "",
unsave: bool = False, unsave: bool = False,
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
width: int = 0, width: int = 0,
height: int = 0, height: int = 0,
@ -83,6 +84,9 @@ class SendAnimation(Scaffold):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
duration (``int``, *optional*): duration (``int``, *optional*):
Duration of sent animation in seconds. Duration of sent animation in seconds.
@ -219,7 +223,7 @@ class SendAnimation(Scaffold):
random_id=self.rnd_id(), random_id=self.rnd_id(),
schedule_date=schedule_date, schedule_date=schedule_date,
reply_markup=reply_markup.write() if reply_markup else None, reply_markup=reply_markup.write() if reply_markup else None,
**await self.parser.parse(caption, parse_mode) **await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
) )
) )
except FilePartMissing as e: except FilePartMissing as e:

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO from typing import Union, BinaryIO, List
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -36,10 +36,12 @@ class SendAudio(Scaffold):
audio: Union[str, BinaryIO], audio: Union[str, BinaryIO],
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
performer: str = None, performer: str = None,
title: str = None, title: str = None,
thumb: Union[str, BinaryIO] = None, file_name: str = None, thumb: Union[str, BinaryIO] = None,
file_name: str = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
schedule_date: int = None, schedule_date: int = None,
@ -79,6 +81,9 @@ class SendAudio(Scaffold):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
duration (``int``, *optional*): duration (``int``, *optional*):
Duration of the audio in seconds. Duration of the audio in seconds.
@ -213,7 +218,7 @@ class SendAudio(Scaffold):
random_id=self.rnd_id(), random_id=self.rnd_id(),
schedule_date=schedule_date, schedule_date=schedule_date,
reply_markup=reply_markup.write() if reply_markup else None, reply_markup=reply_markup.write() if reply_markup else None,
**await self.parser.parse(caption, parse_mode) **await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
) )
) )
except FilePartMissing as e: except FilePartMissing as e:

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO from typing import Union, BinaryIO, List
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -37,6 +37,7 @@ class SendDocument(Scaffold):
thumb: Union[str, BinaryIO] = None, thumb: Union[str, BinaryIO] = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
file_name: str = None, file_name: str = None,
force_document: bool = None, force_document: bool = None,
disable_notification: bool = None, disable_notification: bool = None,
@ -82,6 +83,9 @@ class SendDocument(Scaffold):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
file_name (``str``, *optional*): file_name (``str``, *optional*):
File name of the document sent. File name of the document sent.
Defaults to file's path basename. Defaults to file's path basename.
@ -191,7 +195,7 @@ class SendDocument(Scaffold):
random_id=self.rnd_id(), random_id=self.rnd_id(),
schedule_date=schedule_date, schedule_date=schedule_date,
reply_markup=reply_markup.write() if reply_markup else None, reply_markup=reply_markup.write() if reply_markup else None,
**await self.parser.parse(caption, parse_mode) **await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
) )
) )
except FilePartMissing as e: except FilePartMissing as e:

View File

@ -16,9 +16,9 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, List
from pyrogram import raw from pyrogram import raw, utils
from pyrogram import types from pyrogram import types
from pyrogram.scaffold import Scaffold from pyrogram.scaffold import Scaffold
@ -29,6 +29,7 @@ class SendMessage(Scaffold):
chat_id: Union[int, str], chat_id: Union[int, str],
text: str, text: str,
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
entities: List["types.MessageEntity"] = None,
disable_web_page_preview: bool = None, disable_web_page_preview: bool = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
@ -58,6 +59,9 @@ class SendMessage(Scaffold):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in message text, which can be specified instead of __parse_mode__.
disable_web_page_preview (``bool``, *optional*): disable_web_page_preview (``bool``, *optional*):
Disables link previews for links in this message. Disables link previews for links in this message.
@ -116,7 +120,7 @@ class SendMessage(Scaffold):
])) ]))
""" """
message, entities = (await self.parser.parse(text, parse_mode)).values() message, entities = (await utils.parse_text_entities(self, text, parse_mode, entities)).values()
r = await self.send( r = await self.send(
raw.functions.messages.SendMessage( raw.functions.messages.SendMessage(

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO from typing import Union, BinaryIO, List
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -36,6 +36,7 @@ class SendPhoto(Scaffold):
photo: Union[str, BinaryIO], photo: Union[str, BinaryIO],
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
ttl_seconds: int = None, ttl_seconds: int = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
@ -74,6 +75,9 @@ class SendPhoto(Scaffold):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
ttl_seconds (``int``, *optional*): ttl_seconds (``int``, *optional*):
Self-Destruct Timer. Self-Destruct Timer.
If you set a timer, the photo will self-destruct in *ttl_seconds* If you set a timer, the photo will self-destruct in *ttl_seconds*
@ -169,7 +173,7 @@ class SendPhoto(Scaffold):
random_id=self.rnd_id(), random_id=self.rnd_id(),
schedule_date=schedule_date, schedule_date=schedule_date,
reply_markup=reply_markup.write() if reply_markup else None, reply_markup=reply_markup.write() if reply_markup else None,
**await self.parser.parse(caption, parse_mode) **await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
) )
) )
except FilePartMissing as e: except FilePartMissing as e:

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO from typing import Union, BinaryIO, List
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -36,6 +36,7 @@ class SendVideo(Scaffold):
video: Union[str, BinaryIO], video: Union[str, BinaryIO],
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
width: int = 0, width: int = 0,
height: int = 0, height: int = 0,
@ -79,6 +80,9 @@ class SendVideo(Scaffold):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
duration (``int``, *optional*): duration (``int``, *optional*):
Duration of sent video in seconds. Duration of sent video in seconds.
@ -213,7 +217,7 @@ class SendVideo(Scaffold):
random_id=self.rnd_id(), random_id=self.rnd_id(),
schedule_date=schedule_date, schedule_date=schedule_date,
reply_markup=reply_markup.write() if reply_markup else None, reply_markup=reply_markup.write() if reply_markup else None,
**await self.parser.parse(caption, parse_mode) **await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
) )
) )
except FilePartMissing as e: except FilePartMissing as e:

View File

@ -18,7 +18,7 @@
import os import os
import re import re
from typing import Union, BinaryIO from typing import Union, BinaryIO, List
from pyrogram import StopTransmission from pyrogram import StopTransmission
from pyrogram import raw from pyrogram import raw
@ -36,6 +36,7 @@ class SendVoice(Scaffold):
voice: Union[str, BinaryIO], voice: Union[str, BinaryIO],
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
@ -74,6 +75,9 @@ class SendVoice(Scaffold):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
duration (``int``, *optional*): duration (``int``, *optional*):
Duration of the voice message in seconds. Duration of the voice message in seconds.
@ -175,7 +179,7 @@ class SendVoice(Scaffold):
random_id=self.rnd_id(), random_id=self.rnd_id(),
schedule_date=schedule_date, schedule_date=schedule_date,
reply_markup=reply_markup.write() if reply_markup else None, reply_markup=reply_markup.write() if reply_markup else None,
**await self.parser.parse(caption, parse_mode) **await utils.parse_text_entities(self, caption, parse_mode, caption_entities)
) )
) )
except FilePartMissing as e: except FilePartMissing as e:

View File

@ -16,6 +16,9 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import List
from ..messages_and_media import MessageEntity
from ..object import Object from ..object import Object
@ -31,9 +34,16 @@ class InputMedia(Object):
- :obj:`~pyrogram.types.InputMediaVideo` - :obj:`~pyrogram.types.InputMediaVideo`
""" """
def __init__(self, media: str, caption: str, parse_mode: str): def __init__(
self,
media: str,
caption: str = None,
parse_mode: str = None,
caption_entities: List[MessageEntity] = None
):
super().__init__() super().__init__()
self.media = media self.media = media
self.caption = caption self.caption = caption
self.parse_mode = parse_mode self.parse_mode = parse_mode
self.caption_entities = caption_entities

View File

@ -16,9 +16,10 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, List
from .input_media import InputMedia from .input_media import InputMedia
from ..messages_and_media import MessageEntity
class InputMediaAnimation(InputMedia): class InputMediaAnimation(InputMedia):
@ -46,6 +47,9 @@ class InputMediaAnimation(InputMedia):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
width (``int``, *optional*): width (``int``, *optional*):
Animation width. Animation width.
@ -62,11 +66,12 @@ class InputMediaAnimation(InputMedia):
thumb: str = None, thumb: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List[MessageEntity] = None,
width: int = 0, width: int = 0,
height: int = 0, height: int = 0,
duration: int = 0 duration: int = 0
): ):
super().__init__(media, caption, parse_mode) super().__init__(media, caption, parse_mode, caption_entities)
self.thumb = thumb self.thumb = thumb
self.width = width self.width = width

View File

@ -16,9 +16,10 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, List
from .input_media import InputMedia from .input_media import InputMedia
from ..messages_and_media import MessageEntity
class InputMediaAudio(InputMedia): class InputMediaAudio(InputMedia):
@ -48,6 +49,9 @@ class InputMediaAudio(InputMedia):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
duration (``int``, *optional*): duration (``int``, *optional*):
Duration of the audio in seconds Duration of the audio in seconds
@ -64,11 +68,12 @@ class InputMediaAudio(InputMedia):
thumb: str = None, thumb: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List[MessageEntity] = None,
duration: int = 0, duration: int = 0,
performer: str = "", performer: str = "",
title: str = "" title: str = ""
): ):
super().__init__(media, caption, parse_mode) super().__init__(media, caption, parse_mode, caption_entities)
self.thumb = thumb self.thumb = thumb
self.duration = duration self.duration = duration

View File

@ -16,9 +16,10 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, List
from .input_media import InputMedia from .input_media import InputMedia
from ..messages_and_media import MessageEntity
class InputMediaDocument(InputMedia): class InputMediaDocument(InputMedia):
@ -45,6 +46,9 @@ class InputMediaDocument(InputMedia):
Pass "markdown" or "md" to enable Markdown-style parsing only. Pass "markdown" or "md" to enable Markdown-style parsing only.
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
""" """
def __init__( def __init__(
@ -52,8 +56,9 @@ class InputMediaDocument(InputMedia):
media: str, media: str,
thumb: str = None, thumb: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object parse_mode: Union[str, None] = object,
caption_entities: List[MessageEntity] = None
): ):
super().__init__(media, caption, parse_mode) super().__init__(media, caption, parse_mode, caption_entities)
self.thumb = thumb self.thumb = thumb

View File

@ -16,9 +16,10 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, List
from .input_media import InputMedia from .input_media import InputMedia
from ..messages_and_media import MessageEntity
class InputMediaPhoto(InputMedia): class InputMediaPhoto(InputMedia):
@ -41,12 +42,16 @@ class InputMediaPhoto(InputMedia):
Pass "markdown" or "md" to enable Markdown-style parsing only. Pass "markdown" or "md" to enable Markdown-style parsing only.
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
""" """
def __init__( def __init__(
self, self,
media: str, media: str,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object parse_mode: Union[str, None] = object,
caption_entities: List[MessageEntity] = None
): ):
super().__init__(media, caption, parse_mode) super().__init__(media, caption, parse_mode, caption_entities)

View File

@ -16,9 +16,10 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union from typing import Union, List
from .input_media import InputMedia from .input_media import InputMedia
from ..messages_and_media import MessageEntity
class InputMediaVideo(InputMedia): class InputMediaVideo(InputMedia):
@ -48,6 +49,9 @@ class InputMediaVideo(InputMedia):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
width (``int``, *optional*): width (``int``, *optional*):
Video width. Video width.
@ -67,12 +71,13 @@ class InputMediaVideo(InputMedia):
thumb: str = None, thumb: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List[MessageEntity] = None,
width: int = 0, width: int = 0,
height: int = 0, height: int = 0,
duration: int = 0, duration: int = 0,
supports_streaming: bool = True supports_streaming: bool = True
): ):
super().__init__(media, caption, parse_mode) super().__init__(media, caption, parse_mode, caption_entities)
self.thumb = thumb self.thumb = thumb
self.width = width self.width = width

View File

@ -711,6 +711,7 @@ class Message(Object, Update):
text: str, text: str,
quote: bool = None, quote: bool = None,
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
entities: List["types.MessageEntity"] = None,
disable_web_page_preview: bool = None, disable_web_page_preview: bool = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
@ -749,6 +750,9 @@ class Message(Object, Update):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in message text, which can be specified instead of __parse_mode__.
disable_web_page_preview (``bool``, *optional*): disable_web_page_preview (``bool``, *optional*):
Disables link previews for links in this message. Disables link previews for links in this message.
@ -779,6 +783,7 @@ class Message(Object, Update):
chat_id=self.chat.id, chat_id=self.chat.id,
text=text, text=text,
parse_mode=parse_mode, parse_mode=parse_mode,
entities=entities,
disable_web_page_preview=disable_web_page_preview, disable_web_page_preview=disable_web_page_preview,
disable_notification=disable_notification, disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id, reply_to_message_id=reply_to_message_id,
@ -793,6 +798,7 @@ class Message(Object, Update):
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
width: int = 0, width: int = 0,
height: int = 0, height: int = 0,
@ -846,6 +852,9 @@ class Message(Object, Update):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
duration (``int``, *optional*): duration (``int``, *optional*):
Duration of sent animation in seconds. Duration of sent animation in seconds.
@ -913,6 +922,7 @@ class Message(Object, Update):
animation=animation, animation=animation,
caption=caption, caption=caption,
parse_mode=parse_mode, parse_mode=parse_mode,
caption_entities=caption_entities,
duration=duration, duration=duration,
width=width, width=width,
height=height, height=height,
@ -930,6 +940,7 @@ class Message(Object, Update):
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
performer: str = None, performer: str = None,
title: str = None, title: str = None,
@ -983,6 +994,9 @@ class Message(Object, Update):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
duration (``int``, *optional*): duration (``int``, *optional*):
Duration of the audio in seconds. Duration of the audio in seconds.
@ -1050,6 +1064,7 @@ class Message(Object, Update):
audio=audio, audio=audio,
caption=caption, caption=caption,
parse_mode=parse_mode, parse_mode=parse_mode,
caption_entities=caption_entities,
duration=duration, duration=duration,
performer=performer, performer=performer,
title=title, title=title,
@ -1067,6 +1082,7 @@ class Message(Object, Update):
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
reply_markup: Union[ reply_markup: Union[
@ -1112,6 +1128,9 @@ class Message(Object, Update):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
disable_notification (``bool``, *optional*): disable_notification (``bool``, *optional*):
Sends the message silently. Sends the message silently.
Users will receive a notification with no sound. Users will receive a notification with no sound.
@ -1140,6 +1159,7 @@ class Message(Object, Update):
file_id=file_id, file_id=file_id,
caption=caption, caption=caption,
parse_mode=parse_mode, parse_mode=parse_mode,
caption_entities=caption_entities,
disable_notification=disable_notification, disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id, reply_to_message_id=reply_to_message_id,
reply_markup=reply_markup reply_markup=reply_markup
@ -1275,6 +1295,7 @@ class Message(Object, Update):
thumb: str = None, thumb: str = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
reply_markup: Union[ reply_markup: Union[
@ -1330,6 +1351,9 @@ class Message(Object, Update):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
disable_notification (``bool``, *optional*): disable_notification (``bool``, *optional*):
Sends the message silently. Sends the message silently.
Users will receive a notification with no sound. Users will receive a notification with no sound.
@ -1383,6 +1407,7 @@ class Message(Object, Update):
thumb=thumb, thumb=thumb,
caption=caption, caption=caption,
parse_mode=parse_mode, parse_mode=parse_mode,
caption_entities=caption_entities,
disable_notification=disable_notification, disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id, reply_to_message_id=reply_to_message_id,
reply_markup=reply_markup, reply_markup=reply_markup,
@ -1670,6 +1695,7 @@ class Message(Object, Update):
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
ttl_seconds: int = None, ttl_seconds: int = None,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
@ -1720,6 +1746,9 @@ class Message(Object, Update):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
ttl_seconds (``int``, *optional*): ttl_seconds (``int``, *optional*):
Self-Destruct Timer. Self-Destruct Timer.
If you set a timer, the photo will self-destruct in *ttl_seconds* If you set a timer, the photo will self-destruct in *ttl_seconds*
@ -1777,6 +1806,7 @@ class Message(Object, Update):
photo=photo, photo=photo,
caption=caption, caption=caption,
parse_mode=parse_mode, parse_mode=parse_mode,
caption_entities=caption_entities,
ttl_seconds=ttl_seconds, ttl_seconds=ttl_seconds,
disable_notification=disable_notification, disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id, reply_to_message_id=reply_to_message_id,
@ -2093,6 +2123,7 @@ class Message(Object, Update):
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
width: int = 0, width: int = 0,
height: int = 0, height: int = 0,
@ -2147,6 +2178,9 @@ class Message(Object, Update):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
duration (``int``, *optional*): duration (``int``, *optional*):
Duration of sent video in seconds. Duration of sent video in seconds.
@ -2217,6 +2251,7 @@ class Message(Object, Update):
video=video, video=video,
caption=caption, caption=caption,
parse_mode=parse_mode, parse_mode=parse_mode,
caption_entities=caption_entities,
duration=duration, duration=duration,
width=width, width=width,
height=height, height=height,
@ -2353,6 +2388,7 @@ class Message(Object, Update):
quote: bool = None, quote: bool = None,
caption: str = "", caption: str = "",
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
duration: int = 0, duration: int = 0,
disable_notification: bool = None, disable_notification: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
@ -2403,6 +2439,9 @@ class Message(Object, Update):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
duration (``int``, *optional*): duration (``int``, *optional*):
Duration of the voice message in seconds. Duration of the voice message in seconds.
@ -2458,6 +2497,7 @@ class Message(Object, Update):
voice=voice, voice=voice,
caption=caption, caption=caption,
parse_mode=parse_mode, parse_mode=parse_mode,
caption_entities=caption_entities,
duration=duration, duration=duration,
disable_notification=disable_notification, disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id, reply_to_message_id=reply_to_message_id,
@ -2470,6 +2510,7 @@ class Message(Object, Update):
self, self,
text: str, text: str,
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
entities: List["types.MessageEntity"] = None,
disable_web_page_preview: bool = None, disable_web_page_preview: bool = None,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
) -> "Message": ) -> "Message":
@ -2501,6 +2542,9 @@ class Message(Object, Update):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in message text, which can be specified instead of __parse_mode__.
disable_web_page_preview (``bool``, *optional*): disable_web_page_preview (``bool``, *optional*):
Disables link previews for links in this message. Disables link previews for links in this message.
@ -2518,6 +2562,7 @@ class Message(Object, Update):
message_id=self.message_id, message_id=self.message_id,
text=text, text=text,
parse_mode=parse_mode, parse_mode=parse_mode,
entities=entities,
disable_web_page_preview=disable_web_page_preview, disable_web_page_preview=disable_web_page_preview,
reply_markup=reply_markup reply_markup=reply_markup
) )
@ -2528,6 +2573,7 @@ class Message(Object, Update):
self, self,
caption: str, caption: str,
parse_mode: Union[str, None] = object, parse_mode: Union[str, None] = object,
caption_entities: List["types.MessageEntity"] = None,
reply_markup: "types.InlineKeyboardMarkup" = None reply_markup: "types.InlineKeyboardMarkup" = None
) -> "Message": ) -> "Message":
"""Bound method *edit_caption* of :obj:`~pyrogram.types.Message`. """Bound method *edit_caption* of :obj:`~pyrogram.types.Message`.
@ -2558,6 +2604,9 @@ class Message(Object, Update):
Pass "html" to enable HTML-style parsing only. Pass "html" to enable HTML-style parsing only.
Pass None to completely disable style parsing. Pass None to completely disable style parsing.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the caption, which can be specified instead of __parse_mode__.
reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup`, *optional*): reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup`, *optional*):
An InlineKeyboardMarkup object. An InlineKeyboardMarkup object.
@ -2572,6 +2621,7 @@ class Message(Object, Update):
message_id=self.message_id, message_id=self.message_id,
caption=caption, caption=caption,
parse_mode=parse_mode, parse_mode=parse_mode,
caption_entities=caption_entities,
reply_markup=reply_markup reply_markup=reply_markup
) )

View File

@ -16,12 +16,60 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from enum import Enum, auto
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
from pyrogram import types from pyrogram import types
from ..object import Object from ..object import Object
class AutoName(Enum):
def _generate_next_value_(self, *args):
return self.lower()
class MessageEntityType(AutoName):
MENTION = auto()
HASHTAG = auto()
CASHTAG = auto()
BOT_COMMAND = auto()
URL = auto()
EMAIL = auto()
PHONE_NUMBER = auto()
BOLD = auto()
ITALIC = auto()
UNDERLINE = auto()
STRIKETHROUGH = auto()
CODE = auto()
PRE = auto()
TEXT_LINK = auto()
TEXT_MENTION = auto()
BLOCKQUOTE = auto()
RAW_ENTITIES_TO_TYPE = {
raw.types.MessageEntityMention: MessageEntityType.MENTION,
raw.types.MessageEntityHashtag: MessageEntityType.HASHTAG,
raw.types.MessageEntityCashtag: MessageEntityType.CASHTAG,
raw.types.MessageEntityBotCommand: MessageEntityType.BOT_COMMAND,
raw.types.MessageEntityUrl: MessageEntityType.URL,
raw.types.MessageEntityEmail: MessageEntityType.EMAIL,
raw.types.MessageEntityBold: MessageEntityType.BOLD,
raw.types.MessageEntityItalic: MessageEntityType.ITALIC,
raw.types.MessageEntityCode: MessageEntityType.CODE,
raw.types.MessageEntityPre: MessageEntityType.PRE,
raw.types.MessageEntityUnderline: MessageEntityType.UNDERLINE,
raw.types.MessageEntityStrike: MessageEntityType.STRIKETHROUGH,
raw.types.MessageEntityBlockquote: MessageEntityType.BLOCKQUOTE,
raw.types.MessageEntityTextUrl: MessageEntityType.TEXT_LINK,
raw.types.MessageEntityMentionName: MessageEntityType.TEXT_MENTION,
raw.types.MessageEntityPhone: MessageEntityType.PHONE_NUMBER
}
TYPE_TO_RAW_ENTITIES = {v.value: k for k, v in RAW_ENTITIES_TO_TYPE.items()}
class MessageEntity(Object): class MessageEntity(Object):
"""One special entity in a text message. """One special entity in a text message.
For example, hashtags, usernames, URLs, etc. For example, hashtags, usernames, URLs, etc.
@ -29,9 +77,12 @@ class MessageEntity(Object):
Parameters: Parameters:
type (``str``): type (``str``):
Type of the entity. Type of the entity.
Can be "mention" (@username), "hashtag", "cashtag", "bot_command", "url", "email", "phone_number", "bold" Can be "mention" (``@username``), "hashtag" (``#hashtag``), "cashtag" (``$PYRO``),
(bold text), "italic" (italic text), "code" (monowidth string), "pre" (monowidth block), "text_link" "bot_command" (``/start@pyrogrambot``), "url" (``https://pyrogram.org``),
(for clickable text URLs), "text_mention" (for custom text mentions based on users' identifiers). "email" (``do-not-reply@pyrogram.org``), "phone_number" (``+1-420-069-1337``), "bold" (**bold text**),
"italic" (*italic text*), "underline" (underlined text), "strikethrough" (strikethrough text),
"code" (monowidth string), "pre" (monowidth block), "text_link" (for clickable text URLs),
"text_mention" (for users without usernames).
offset (``int``): offset (``int``):
Offset in UTF-16 code units to the start of the entity. Offset in UTF-16 code units to the start of the entity.
@ -44,26 +95,10 @@ class MessageEntity(Object):
user (:obj:`~pyrogram.types.User`, *optional*): user (:obj:`~pyrogram.types.User`, *optional*):
For "text_mention" only, the mentioned user. For "text_mention" only, the mentioned user.
"""
ENTITIES = { language (``str``. *optional*):
raw.types.MessageEntityMention.ID: "mention", For "pre" only, the programming language of the entity text.
raw.types.MessageEntityHashtag.ID: "hashtag", """
raw.types.MessageEntityCashtag.ID: "cashtag",
raw.types.MessageEntityBotCommand.ID: "bot_command",
raw.types.MessageEntityUrl.ID: "url",
raw.types.MessageEntityEmail.ID: "email",
raw.types.MessageEntityBold.ID: "bold",
raw.types.MessageEntityItalic.ID: "italic",
raw.types.MessageEntityCode.ID: "code",
raw.types.MessageEntityPre.ID: "pre",
raw.types.MessageEntityUnderline.ID: "underline",
raw.types.MessageEntityStrike.ID: "strike",
raw.types.MessageEntityBlockquote.ID: "blockquote",
raw.types.MessageEntityTextUrl.ID: "text_link",
raw.types.MessageEntityMentionName.ID: "text_mention",
raw.types.MessageEntityPhone.ID: "phone_number"
}
def __init__( def __init__(
self, self,
@ -73,7 +108,8 @@ class MessageEntity(Object):
offset: int, offset: int,
length: int, length: int,
url: str = None, url: str = None,
user: "types.User" = None user: "types.User" = None,
language: str = None
): ):
super().__init__(client) super().__init__(client)
@ -82,19 +118,49 @@ class MessageEntity(Object):
self.length = length self.length = length
self.url = url self.url = url
self.user = user self.user = user
self.language = language
@staticmethod @staticmethod
def _parse(client, entity, users: dict) -> "MessageEntity" or None: def _parse(client, entity, users: dict) -> "MessageEntity" or None:
type = MessageEntity.ENTITIES.get(entity.ID, None) type = RAW_ENTITIES_TO_TYPE.get(entity.__class__, None)
if type is None: if type is None:
return None return None
return MessageEntity( return MessageEntity(
type=type, type=type.value,
offset=entity.offset, offset=entity.offset,
length=entity.length, length=entity.length,
url=getattr(entity, "url", None), url=getattr(entity, "url", None),
user=types.User._parse(client, users.get(getattr(entity, "user_id", None), None)), user=types.User._parse(client, users.get(getattr(entity, "user_id", None), None)),
language=getattr(entity, "language", None),
client=client client=client
) )
async def write(self):
args = self.__dict__.copy()
for arg in ("_client", "type", "user"):
args.pop(arg)
if self.user:
args["user_id"] = await self._client.resolve_peer(self.user.id)
if not self.url:
args.pop("url")
if self.language is None:
args.pop("language")
try:
entity = TYPE_TO_RAW_ENTITIES[self.type]
if entity is raw.types.MessageEntityMentionName:
entity = raw.types.InputMessageEntityMentionName
except KeyError as e:
raise ValueError(f"Invalid message entity type {e}")
else:
try:
return entity(**args)
except TypeError as e:
raise TypeError(f"{entity.QUALNAME}'s {e}")

View File

@ -24,9 +24,9 @@ import os
import struct import struct
from concurrent.futures.thread import ThreadPoolExecutor from concurrent.futures.thread import ThreadPoolExecutor
from getpass import getpass from getpass import getpass
from typing import List from typing import Union, List, Dict
from typing import Union
import pyrogram
from pyrogram import raw from pyrogram import raw
from pyrogram import types from pyrogram import types
from pyrogram.file_id import FileId, FileType, PHOTO_TYPES, DOCUMENT_TYPES from pyrogram.file_id import FileId, FileType, PHOTO_TYPES, DOCUMENT_TYPES
@ -294,3 +294,24 @@ def compute_password_check(r: raw.types.account.Password, password: str) -> raw.
) )
return raw.types.InputCheckPasswordSRP(srp_id=srp_id, A=A_bytes, M1=M1_bytes) return raw.types.InputCheckPasswordSRP(srp_id=srp_id, A=A_bytes, M1=M1_bytes)
async def parse_text_entities(
client: "pyrogram.Client",
text: str,
parse_mode: str,
entities: List["types.MessageEntity"]
) -> Dict[str, raw.base.MessageEntity]:
if entities:
# Inject the client instance because parsing user mentions requires it
for entity in entities:
entity._client = client
text, entities = text, [await entity.write() for entity in entities]
else:
text, entities = (await client.parser.parse(text, parse_mode)).values()
return {
"message": text,
"entities": entities
}