2017-10-27 20:29:54 +03:00
|
|
|
import datetime
|
2017-11-13 20:57:51 +02:00
|
|
|
import functools
|
2017-11-16 00:58:14 +02:00
|
|
|
import typing
|
2017-10-12 16:43:23 +03:00
|
|
|
|
|
|
|
|
from . import base
|
|
|
|
|
from . import fields
|
|
|
|
|
from .audio import Audio
|
|
|
|
|
from .chat import Chat
|
|
|
|
|
from .contact import Contact
|
|
|
|
|
from .document import Document
|
|
|
|
|
from .game import Game
|
|
|
|
|
from .invoice import Invoice
|
|
|
|
|
from .location import Location
|
|
|
|
|
from .message_entity import MessageEntity
|
|
|
|
|
from .photo_size import PhotoSize
|
|
|
|
|
from .sticker import Sticker
|
|
|
|
|
from .successful_payment import SuccessfulPayment
|
|
|
|
|
from .user import User
|
|
|
|
|
from .venue import Venue
|
|
|
|
|
from .video import Video
|
|
|
|
|
from .video_note import VideoNote
|
|
|
|
|
from .voice import Voice
|
2017-11-13 20:57:51 +02:00
|
|
|
from ..utils import helper
|
2017-11-16 00:58:14 +02:00
|
|
|
from ..utils.payload import generate_payload
|
2017-10-12 16:43:23 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class Message(base.TelegramObject):
|
|
|
|
|
"""
|
|
|
|
|
This object represents a message.
|
|
|
|
|
|
|
|
|
|
https://core.telegram.org/bots/api#message
|
|
|
|
|
"""
|
|
|
|
|
message_id: base.Integer = fields.Field()
|
|
|
|
|
from_user: User = fields.Field(alias='from', base=User)
|
2017-10-27 20:29:54 +03:00
|
|
|
date: datetime.datetime = fields.DateTimeField()
|
2017-10-12 16:43:23 +03:00
|
|
|
chat: Chat = fields.Field(base=Chat)
|
|
|
|
|
forward_from: User = fields.Field(base=User)
|
|
|
|
|
forward_from_chat: Chat = fields.Field(base=Chat)
|
|
|
|
|
forward_from_message_id: base.Integer = fields.Field()
|
|
|
|
|
forward_signature: base.String = fields.Field()
|
|
|
|
|
forward_date: base.Integer = fields.Field()
|
|
|
|
|
reply_to_message: 'Message' = fields.Field(base='Message')
|
|
|
|
|
edit_date: base.Integer = fields.Field()
|
2017-11-17 23:01:17 +02:00
|
|
|
media_group_id: base.String = fields.Field()
|
2017-10-12 16:43:23 +03:00
|
|
|
author_signature: base.String = fields.Field()
|
|
|
|
|
text: base.String = fields.Field()
|
|
|
|
|
entities: typing.List[MessageEntity] = fields.ListField(base=MessageEntity)
|
2017-10-22 16:55:33 +03:00
|
|
|
caption_entities: typing.List[MessageEntity] = fields.ListField(base=MessageEntity)
|
2017-10-12 16:43:23 +03:00
|
|
|
audio: Audio = fields.Field(base=Audio)
|
|
|
|
|
document: Document = fields.Field(base=Document)
|
|
|
|
|
game: Game = fields.Field(base=Game)
|
|
|
|
|
photo: typing.List[PhotoSize] = fields.ListField(base=PhotoSize)
|
|
|
|
|
sticker: Sticker = fields.Field(base=Sticker)
|
|
|
|
|
video: Video = fields.Field(base=Video)
|
|
|
|
|
voice: Voice = fields.Field(base=Voice)
|
|
|
|
|
video_note: VideoNote = fields.Field(base=VideoNote)
|
|
|
|
|
caption: base.String = fields.Field()
|
|
|
|
|
contact: Contact = fields.Field(base=Contact)
|
|
|
|
|
location: Location = fields.Field(base=Location)
|
|
|
|
|
venue: Venue = fields.Field(base=Venue)
|
|
|
|
|
new_chat_members: typing.List[User] = fields.ListField(base=User)
|
|
|
|
|
left_chat_member: User = fields.Field(base=User)
|
|
|
|
|
new_chat_title: base.String = fields.Field()
|
|
|
|
|
new_chat_photo: typing.List[PhotoSize] = fields.ListField(base=PhotoSize)
|
|
|
|
|
delete_chat_photo: base.Boolean = fields.Field()
|
|
|
|
|
group_chat_created: base.Boolean = fields.Field()
|
|
|
|
|
supergroup_chat_created: base.Boolean = fields.Field()
|
|
|
|
|
channel_chat_created: base.Boolean = fields.Field()
|
|
|
|
|
migrate_to_chat_id: base.Integer = fields.Field()
|
|
|
|
|
migrate_from_chat_id: base.Integer = fields.Field()
|
|
|
|
|
pinned_message: 'Message' = fields.Field(base='Message')
|
|
|
|
|
invoice: Invoice = fields.Field(base=Invoice)
|
|
|
|
|
successful_payment: SuccessfulPayment = fields.Field(base=SuccessfulPayment)
|
|
|
|
|
|
|
|
|
|
@property
|
2017-11-13 20:57:51 +02:00
|
|
|
@functools.lru_cache()
|
2017-10-12 16:43:23 +03:00
|
|
|
def content_type(self):
|
|
|
|
|
if self.text:
|
|
|
|
|
return ContentType.TEXT[0]
|
2017-11-13 20:57:51 +02:00
|
|
|
if self.audio:
|
2017-10-12 16:43:23 +03:00
|
|
|
return ContentType.AUDIO[0]
|
2017-11-13 20:57:51 +02:00
|
|
|
if self.document:
|
2017-10-12 16:43:23 +03:00
|
|
|
return ContentType.DOCUMENT[0]
|
2017-11-13 20:57:51 +02:00
|
|
|
if self.game:
|
2017-10-12 16:43:23 +03:00
|
|
|
return ContentType.GAME[0]
|
2017-11-13 20:57:51 +02:00
|
|
|
if self.photo:
|
2017-10-12 16:43:23 +03:00
|
|
|
return ContentType.PHOTO[0]
|
2017-11-13 20:57:51 +02:00
|
|
|
if self.sticker:
|
2017-10-12 16:43:23 +03:00
|
|
|
return ContentType.STICKER[0]
|
2017-11-13 20:57:51 +02:00
|
|
|
if self.video:
|
2017-10-12 16:43:23 +03:00
|
|
|
return ContentType.VIDEO[0]
|
2017-11-13 20:57:51 +02:00
|
|
|
if self.video_note:
|
|
|
|
|
return ContentType.VIDEO_NOTE[0]
|
|
|
|
|
if self.voice:
|
2017-10-12 16:43:23 +03:00
|
|
|
return ContentType.VOICE[0]
|
2017-11-13 20:57:51 +02:00
|
|
|
if self.contact:
|
|
|
|
|
return ContentType.CONTACT[0]
|
|
|
|
|
if self.location:
|
|
|
|
|
return ContentType.LOCATION[0]
|
|
|
|
|
if self.venue:
|
|
|
|
|
return ContentType.VENUE[0]
|
|
|
|
|
if self.new_chat_members:
|
2017-10-12 16:43:23 +03:00
|
|
|
return ContentType.NEW_CHAT_MEMBERS[0]
|
2017-11-13 20:57:51 +02:00
|
|
|
if self.invoice:
|
2017-10-12 16:43:23 +03:00
|
|
|
return ContentType.INVOICE[0]
|
2017-11-13 20:57:51 +02:00
|
|
|
if self.successful_payment:
|
2017-10-12 16:43:23 +03:00
|
|
|
return ContentType.SUCCESSFUL_PAYMENT[0]
|
|
|
|
|
else:
|
|
|
|
|
return ContentType.UNKNOWN[0]
|
|
|
|
|
|
|
|
|
|
def is_command(self):
|
|
|
|
|
"""
|
|
|
|
|
Check message text is command
|
2017-10-22 16:55:33 +03:00
|
|
|
|
2017-10-12 16:43:23 +03:00
|
|
|
:return: bool
|
|
|
|
|
"""
|
|
|
|
|
return self.text and self.text.startswith('/')
|
|
|
|
|
|
|
|
|
|
def get_full_command(self):
|
|
|
|
|
"""
|
|
|
|
|
Split command and args
|
2017-10-22 16:55:33 +03:00
|
|
|
|
2017-10-12 16:43:23 +03:00
|
|
|
:return: tuple of (command, args)
|
|
|
|
|
"""
|
|
|
|
|
if self.is_command():
|
|
|
|
|
command, _, args = self.text.partition(' ')
|
|
|
|
|
return command, args
|
|
|
|
|
|
|
|
|
|
def get_command(self):
|
2017-10-22 16:55:33 +03:00
|
|
|
"""
|
|
|
|
|
Get command from message
|
|
|
|
|
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
2017-10-12 16:43:23 +03:00
|
|
|
command = self.get_full_command()
|
|
|
|
|
if command:
|
|
|
|
|
return command[0]
|
|
|
|
|
|
|
|
|
|
def get_args(self):
|
2017-10-22 16:55:33 +03:00
|
|
|
"""
|
|
|
|
|
Get arguments
|
|
|
|
|
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
2017-10-12 16:43:23 +03:00
|
|
|
command = self.get_full_command()
|
|
|
|
|
if command:
|
|
|
|
|
return command[1].strip()
|
|
|
|
|
|
|
|
|
|
@property
|
2017-10-22 16:55:33 +03:00
|
|
|
def md_text(self) -> str:
|
|
|
|
|
"""
|
|
|
|
|
Text or caption formatted as markdown.
|
|
|
|
|
|
|
|
|
|
:return: str
|
|
|
|
|
"""
|
|
|
|
|
text = self.caption if self.caption else self.text
|
2017-10-12 16:43:23 +03:00
|
|
|
|
|
|
|
|
if self.text and self.entities:
|
|
|
|
|
for entity in reversed(self.entities):
|
|
|
|
|
text = entity.apply_md(text)
|
|
|
|
|
|
|
|
|
|
return text
|
|
|
|
|
|
|
|
|
|
@property
|
2017-10-22 16:55:33 +03:00
|
|
|
def html_text(self) -> str:
|
|
|
|
|
"""
|
|
|
|
|
Text or caption formatted as HTML.
|
|
|
|
|
|
|
|
|
|
:return: str
|
|
|
|
|
"""
|
|
|
|
|
text = self.caption if self.caption else self.text
|
2017-10-12 16:43:23 +03:00
|
|
|
|
|
|
|
|
if self.text and self.entities:
|
|
|
|
|
for entity in reversed(self.entities):
|
|
|
|
|
text = entity.apply_html(text)
|
|
|
|
|
|
|
|
|
|
return text
|
|
|
|
|
|
|
|
|
|
async def reply(self, text, parse_mode=None, disable_web_page_preview=None,
|
|
|
|
|
disable_notification=None, reply_markup=None) -> 'Message':
|
|
|
|
|
"""
|
|
|
|
|
Reply to this message
|
|
|
|
|
|
|
|
|
|
:param text: str
|
|
|
|
|
:param parse_mode: str
|
|
|
|
|
:param disable_web_page_preview: bool
|
|
|
|
|
:param disable_notification: bool
|
|
|
|
|
:param reply_markup:
|
|
|
|
|
:return: :class:`aoigram.types.Message`
|
|
|
|
|
"""
|
|
|
|
|
return await self.bot.send_message(self.chat.id, text, parse_mode, disable_web_page_preview,
|
|
|
|
|
disable_notification, self.message_id, reply_markup)
|
|
|
|
|
|
|
|
|
|
async def forward(self, chat_id, disable_notification=None) -> 'Message':
|
|
|
|
|
"""
|
|
|
|
|
Forward this message
|
|
|
|
|
|
|
|
|
|
:param chat_id:
|
|
|
|
|
:param disable_notification:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
return await self.bot.forward_message(chat_id, self.chat.id, self.message_id, disable_notification)
|
|
|
|
|
|
2017-11-16 00:58:14 +02:00
|
|
|
async def edit_text(self, text: base.String,
|
|
|
|
|
parse_mode: typing.Union[base.String, None] = None,
|
|
|
|
|
disable_web_page_preview: typing.Union[base.Boolean, None] = None,
|
|
|
|
|
reply_markup: typing.Union['types.InlineKeyboardMarkup',
|
|
|
|
|
None] = None):
|
|
|
|
|
payload = generate_payload(**locals())
|
|
|
|
|
payload['message_id'] = self.message_id
|
|
|
|
|
payload['chat_id'] = self.chat.id
|
|
|
|
|
return await self.bot.edit_message_text(**payload)
|
|
|
|
|
|
2017-10-12 16:43:23 +03:00
|
|
|
async def delete(self):
|
|
|
|
|
"""
|
|
|
|
|
Delete this message
|
|
|
|
|
|
|
|
|
|
:return: bool
|
|
|
|
|
"""
|
|
|
|
|
return await self.bot.delete_message(self.chat.id, self.message_id)
|
|
|
|
|
|
|
|
|
|
async def pin(self, disable_notification: bool = False):
|
|
|
|
|
return await self.chat.pin_message(self.message_id, disable_notification)
|
|
|
|
|
|
2017-10-22 17:18:44 +03:00
|
|
|
def __hash__(self):
|
|
|
|
|
return self.message_id
|
|
|
|
|
|
|
|
|
|
def __eq__(self, other):
|
|
|
|
|
if isinstance(other, type(self)):
|
|
|
|
|
return other.message_id == self.message_id
|
|
|
|
|
return self.message_id == other
|
|
|
|
|
|
|
|
|
|
def __int__(self):
|
|
|
|
|
return self.message_id
|
|
|
|
|
|
2017-10-12 16:43:23 +03:00
|
|
|
|
|
|
|
|
class ContentType(helper.Helper):
|
|
|
|
|
"""
|
|
|
|
|
List of message content types
|
|
|
|
|
|
|
|
|
|
:key: TEXT
|
|
|
|
|
:key: AUDIO
|
|
|
|
|
:key: DOCUMENT
|
|
|
|
|
:key: GAME
|
|
|
|
|
:key: PHOTO
|
|
|
|
|
:key: STICKER
|
|
|
|
|
:key: VIDEO
|
2017-11-13 20:57:51 +02:00
|
|
|
:key: VIDEO_NOTE
|
2017-10-12 16:43:23 +03:00
|
|
|
:key: VOICE
|
2017-11-13 20:57:51 +02:00
|
|
|
:key: CONTACT
|
|
|
|
|
:key: LOCATION
|
|
|
|
|
:key: VENUE
|
2017-10-12 16:43:23 +03:00
|
|
|
:key: NEW_CHAT_MEMBERS
|
|
|
|
|
:key: INVOICE
|
|
|
|
|
:key: SUCCESSFUL_PAYMENT
|
|
|
|
|
"""
|
|
|
|
|
mode = helper.HelperMode.snake_case
|
|
|
|
|
|
|
|
|
|
TEXT = helper.ListItem() # text
|
|
|
|
|
AUDIO = helper.ListItem() # audio
|
|
|
|
|
DOCUMENT = helper.ListItem() # document
|
|
|
|
|
GAME = helper.ListItem() # game
|
|
|
|
|
PHOTO = helper.ListItem() # photo
|
|
|
|
|
STICKER = helper.ListItem() # sticker
|
|
|
|
|
VIDEO = helper.ListItem() # video
|
2017-11-13 20:57:51 +02:00
|
|
|
VIDEO_NOTE = helper.ListItem() # video_note
|
2017-10-12 16:43:23 +03:00
|
|
|
VOICE = helper.ListItem() # voice
|
2017-11-13 20:57:51 +02:00
|
|
|
CONTACT = helper.ListItem() # contact
|
|
|
|
|
LOCATION = helper.ListItem() # location
|
|
|
|
|
VENUE = helper.ListItem() # venue
|
|
|
|
|
NEW_CHAT_MEMBERS = helper.ListItem() # new_chat_member
|
2017-10-12 16:43:23 +03:00
|
|
|
INVOICE = helper.ListItem() # invoice
|
|
|
|
|
SUCCESSFUL_PAYMENT = helper.ListItem() # successful_payment
|
|
|
|
|
|
2017-11-13 20:57:51 +02:00
|
|
|
UNKNOWN = helper.ListItem() # unknown
|
|
|
|
|
ANY = helper.ListItem() # any
|
2017-10-12 16:43:23 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class ParseMode(helper.Helper):
|
|
|
|
|
"""
|
|
|
|
|
Parse modes
|
|
|
|
|
|
|
|
|
|
:key: MARKDOWN
|
|
|
|
|
:key: HTML
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
mode = helper.HelperMode.lowercase
|
|
|
|
|
|
|
|
|
|
MARKDOWN = helper.Item()
|
|
|
|
|
HTML = helper.Item()
|