diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index b56e8899c..7cdd92a0e 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -627,6 +627,10 @@ def get_title_list(s: str) -> list: InputReplyToMessage InputReplyToStory InputTextMessageContent + InputLocationMessageContent + InputVenueMessageContent + InputContactMessageContent + InputInvoiceMessageContent """, authorization=""" Authorization diff --git a/pyrogram/methods/messages/send_location.py b/pyrogram/methods/messages/send_location.py index 97704e834..48e1ff1bf 100644 --- a/pyrogram/methods/messages/send_location.py +++ b/pyrogram/methods/messages/send_location.py @@ -31,6 +31,8 @@ async def send_location( chat_id: Union[int, str], latitude: float, longitude: float, + horizontal_accuracy: float = None, + # TODO disable_notification: bool = None, message_thread_id: int = None, business_connection_id: str = None, @@ -66,6 +68,9 @@ async def send_location( longitude (``float``): Longitude of the location. + horizontal_accuracy (``float``, *optional*): + The radius of uncertainty for the location, measured in meters; 0-1500. + disable_notification (``bool``, *optional*): Sends the message silently. Users will receive a notification with no sound. @@ -137,7 +142,8 @@ async def send_location( media=raw.types.InputMediaGeoPoint( geo_point=raw.types.InputGeoPoint( lat=latitude, - long=longitude + long=longitude, + accuracy_radius=horizontal_accuracy ) ), message="", diff --git a/pyrogram/methods/messages/send_venue.py b/pyrogram/methods/messages/send_venue.py index 8ccd96e90..c18c3f0dc 100644 --- a/pyrogram/methods/messages/send_venue.py +++ b/pyrogram/methods/messages/send_venue.py @@ -35,6 +35,8 @@ async def send_venue( address: str, foursquare_id: str = "", foursquare_type: str = "", + google_place_id: str = "", + google_place_type: str = "", disable_notification: bool = None, message_thread_id: int = None, business_connection_id: str = None, @@ -160,7 +162,7 @@ async def send_venue( ), title=title, address=address, - provider="", + provider="", # TODO venue_id=foursquare_id, venue_type=foursquare_type ), diff --git a/pyrogram/types/input_message_content/__init__.py b/pyrogram/types/input_message_content/__init__.py index ffc05f330..1a271da17 100644 --- a/pyrogram/types/input_message_content/__init__.py +++ b/pyrogram/types/input_message_content/__init__.py @@ -21,7 +21,18 @@ from .input_reply_to_message import InputReplyToMessage from .input_reply_to_story import InputReplyToStory from .input_text_message_content import InputTextMessageContent +from .input_location_message_content import InputLocationMessageContent +from .input_venue_message_content import InputVenueMessageContent +from .input_contact_message_content import InputContactMessageContent +from .input_invoice_message_content import InputInvoiceMessageContent __all__ = [ - "InputMessageContent", "InputReplyToMessage", "InputReplyToStory", "InputTextMessageContent" + "InputMessageContent", + "InputReplyToMessage", + "InputReplyToStory", + "InputTextMessageContent", + "InputLocationMessageContent", + "InputVenueMessageContent", + "InputContactMessageContent", + "InputInvoiceMessageContent" ] diff --git a/pyrogram/types/input_message_content/input_contact_message_content.py b/pyrogram/types/input_message_content/input_contact_message_content.py new file mode 100644 index 000000000..0566f25d9 --- /dev/null +++ b/pyrogram/types/input_message_content/input_contact_message_content.py @@ -0,0 +1,68 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +import logging +from typing import Optional + +import pyrogram +from pyrogram import raw +from .input_message_content import InputMessageContent + +log = logging.getLogger(__name__) + + +class InputContactMessageContent(InputMessageContent): + """Content of a contact message to be sent as the result of an inline query. + + Parameters: + phone_number (``str``): + Contact's phone number. + + first_name (``str``): + Contact's first name. + + last_name (``str``, *optional*): + Contact's last name. + + vcard (``str``, *optional*): + Additional data about the contact in the form of a `vCard `_, 0-2048 bytes. + + """ + + def __init__( + self, + phone_number: str, + first_name: str, + last_name: Optional[str] = None, + vcard: Optional[str] = None + ): + super().__init__() + + self.phone_number = phone_number + self.first_name = first_name + self.last_name = last_name + self.vcard = vcard + + async def write(self, client: "pyrogram.Client", reply_markup): + return raw.types.InputBotInlineMessageMediaContact( + phone_number=self.phone_number, + first_name=self.first_name, + last_name=self.last_name, + vcard=self.vcard, + reply_markup=await reply_markup.write(client) if reply_markup else None + ) diff --git a/pyrogram/types/input_message_content/input_invoice_message_content.py b/pyrogram/types/input_message_content/input_invoice_message_content.py new file mode 100644 index 000000000..78bf61244 --- /dev/null +++ b/pyrogram/types/input_message_content/input_invoice_message_content.py @@ -0,0 +1,174 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +import logging +from typing import Optional, List, Union + +import pyrogram +from pyrogram import raw, types +from .input_message_content import InputMessageContent + +log = logging.getLogger(__name__) + + +class InputInvoiceMessageContent(InputMessageContent): + """Content of an invoice message to be sent as the result of an inline query. + + Parameters: + title (``str``): + Product name, 1-32 characters. + + description (``str``): + Product description, 1-255 characters + + payload (``str`` | ``bytes``): + Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. + + currency (``str``): + Three-letter ISO 4217 currency code, see `more on currencies `_. Pass ``XTR`` for payments in `Telegram Stars `_. + + prices (List of :obj:`~pyrogram.types.LabeledPrice`): + Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_. + + provider_token (``str``, *optional*): + Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_. + + max_tip_amount (``int``, *optional*): + The maximum accepted amount for tips in the smallest units of the currency (integer, **not** float/double). For example, for a maximum tip of ``US$ 1.45`` pass ``max_tip_amount = 145``. See the exp parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_. + + suggested_tip_amounts (List of ``int``, *optional*): + An array of suggested amounts of tips in the smallest units of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed ``max_tip_amount``. + + provider_data (``str``, *optional*): + JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider. + + photo_url (``str``, *optional*): + URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for. + + photo_size (``int``, *optional*): + Photo size in bytes + + photo_width (``int``, *optional*): + Photo width + + photo_height (``int``, *optional*): + Photo height + + need_name (``bool``, *optional*): + Pass True if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_. + + need_phone_number (``bool``, *optional*): + Pass True if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_. + + need_email (``bool``, *optional*): + Pass True if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_. + + need_shipping_address (``bool``, *optional*): + Pass True if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_. + + send_phone_number_to_provider (``bool``, *optional*): + Pass True if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_. + + send_email_to_provider (``bool``, *optional*): + Pass True if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_. + + is_flexible (``bool``, *optional*): + Pass True if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_. + + """ + + def __init__( + self, + title: str, + description: str, + payload: Union[str, bytes], + currency: str, + prices: List["types.LabeledPrice"], + provider_token: Optional[str] = None, + max_tip_amount: Optional[int] = None, + suggested_tip_amounts: List[int] = None, + provider_data: Optional[str] = None, + photo_url: Optional[str] = None, + photo_size: Optional[int] = None, + photo_width: Optional[int] = None, + photo_height: Optional[int] = None, + need_name: Optional[bool] = None, + need_phone_number: Optional[bool] = None, + need_email: Optional[bool] = None, + need_shipping_address: Optional[bool] = None, + send_phone_number_to_provider: Optional[bool] = None, + send_email_to_provider: Optional[bool] = None, + is_flexible: Optional[bool] = None + ): + super().__init__() + + self.title = title + self.description = description + self.payload = payload + self.currency = currency + self.prices = prices + self.provider_token = provider_token + self.max_tip_amount = max_tip_amount + self.suggested_tip_amounts = suggested_tip_amounts + self.provider_data = provider_data + self.photo_url = photo_url + self.photo_size = photo_size + self.photo_width = photo_width + self.photo_height = photo_height + self.need_name = need_name + self.need_phone_number = need_phone_number + self.need_email = need_email + self.need_shipping_address = need_shipping_address + self.send_phone_number_to_provider = send_phone_number_to_provider + self.send_email_to_provider = send_email_to_provider + self.is_flexible = is_flexible + + async def write(self, client: "pyrogram.Client", reply_markup): + return raw.types.InputBotInlineMessageMediaInvoice( + title=self.title, + description=self.description, + photo=raw.types.InputWebDocument( + url=self.photo_url, + mime_type="image/jpg", + size=self.photo_size, + attributes=[ + raw.types.DocumentAttributeImageSize( + w=self.photo_width, + h=self.photo_height + ) + ] + ) if self.photo_url else None, + invoice=raw.types.Invoice( + currency=self.currency, + prices=[i.write() for i in self.prices], + test=client.test_mode, + name_requested=self.need_name, + phone_requested=self.need_phone_number, + email_requested=self.need_email, + shipping_address_requested=self.need_shipping_address, + flexible=self.is_flexible, + phone_to_provider=self.send_phone_number_to_provider, + email_to_provider=self.send_email_to_provider + ), + payload=self.payload.encode() if isinstance(self.payload, str) else self.payload, + provider=self.provider_token, + provider_data=raw.types.DataJSON( + data=self.provider_data if self.provider_data else "{}" + ), + reply_markup=await reply_markup.write(client) if reply_markup else None + ) diff --git a/pyrogram/types/input_message_content/input_location_message_content.py b/pyrogram/types/input_message_content/input_location_message_content.py new file mode 100644 index 000000000..b13381e31 --- /dev/null +++ b/pyrogram/types/input_message_content/input_location_message_content.py @@ -0,0 +1,82 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +import logging +from typing import Optional + +import pyrogram +from pyrogram import raw +from .input_message_content import InputMessageContent + +log = logging.getLogger(__name__) + + +class InputLocationMessageContent(InputMessageContent): + """Content of a location message to be sent as the result of an inline query. + + Parameters: + latitude (``float``): + Latitude of the location. + + longitude (``float``): + Longitude of the location. + + horizontal_accuracy (``float``, *optional*): + The radius of uncertainty for the location, measured in meters; 0-1500. + + live_period (``int``, *optional*): + Period in seconds during which the location can be updated, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely. + + heading (``int``, *optional*): + For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified. + + proximity_alert_radius (``int``, *optional*): + For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified. + + """ + + def __init__( + self, + latitude: float, + longitude: float, + horizontal_accuracy: Optional[float] = None, + live_period: Optional[int] = None, + heading: Optional[int] = None, + proximity_alert_radius: Optional[int] = None + ): + super().__init__() + + self.latitude = latitude + self.longitude = longitude + self.horizontal_accuracy = horizontal_accuracy + self.live_period = live_period + self.heading = heading + self.proximity_alert_radius = proximity_alert_radius + + async def write(self, client: "pyrogram.Client", reply_markup): + return raw.types.InputBotInlineMessageMediaGeo( + geo_point=raw.types.InputGeoPoint( + lat=self.latitude, + long=self.longitude, + accuracy_radius=self.horizontal_accuracy + ), + heading=self.heading, + period=self.live_period, + proximity_notification_radius=self.proximity_alert_radius, + reply_markup=await reply_markup.write(client) if reply_markup else None + ) diff --git a/pyrogram/types/input_message_content/input_message_content.py b/pyrogram/types/input_message_content/input_message_content.py index 13c6093c6..bf2485982 100644 --- a/pyrogram/types/input_message_content/input_message_content.py +++ b/pyrogram/types/input_message_content/input_message_content.py @@ -21,17 +21,18 @@ from ..object import Object -"""- :obj:`~pyrogram.types.InputLocationMessageContent` - - :obj:`~pyrogram.types.InputVenueMessageContent` - - :obj:`~pyrogram.types.InputContactMessageContent`""" - class InputMessageContent(Object): """Content of a message to be sent as a result of an inline query. - Pyrogram currently supports the following types: + Telegram clients currently support the following 5 types: - :obj:`~pyrogram.types.InputTextMessageContent` + - :obj:`~pyrogram.types.InputLocationMessageContent` + - :obj:`~pyrogram.types.InputVenueMessageContent` + - :obj:`~pyrogram.types.InputContactMessageContent` + - :obj:`~pyrogram.types.InputInvoiceMessageContent` + """ def __init__(self): diff --git a/pyrogram/types/input_message_content/input_venue_message_content.py b/pyrogram/types/input_message_content/input_venue_message_content.py new file mode 100644 index 000000000..baf922ac4 --- /dev/null +++ b/pyrogram/types/input_message_content/input_venue_message_content.py @@ -0,0 +1,87 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +import logging +from typing import Optional + +import pyrogram +from pyrogram import raw +from .input_message_content import InputMessageContent + +log = logging.getLogger(__name__) + + +class InputVenueMessageContent(InputMessageContent): + """Content of a venue message to be sent as the result of an inline query. + + Parameters: + latitude (``float``): + Latitude of the location. + + longitude (``float``): + Longitude of the location. + + title (``str``): + Name of the venue. + + address (``str``): + Address of the venue. + + foursquare_id (``str``, *optional*): + Foursquare identifier of the venue, if known. + + foursquare_type (``str``, *optional*): + Foursquare type of the venue, if known. (For example, “arts_entertainment/default”, “arts_entertainment/aquarium” or “food/icecream”.) + + """ + + def __init__( + self, + latitude: float, + longitude: float, + title: str, + address: str, + foursquare_id: Optional[str] = None, + foursquare_type: Optional[str] = None, + google_place_id: Optional[str] = None, + google_place_type: Optional[str] = None + ): + super().__init__() + + self.latitude = latitude + self.longitude = longitude + self.title = title + self.address = address + self.foursquare_id = foursquare_id + self.foursquare_type = foursquare_type + self.google_place_id = google_place_id + self.google_place_type = google_place_type + + async def write(self, client: "pyrogram.Client", reply_markup): + return raw.types.InputBotInlineMessageMediaVenue( + geo_point=raw.types.InputGeoPoint( + lat=self.latitude, + long=self.longitude + ), + title=self.title, + address=self.address, + provider="", # TODO + venue_id=self.foursquare_id, + venue_type=self.foursquare_type, + reply_markup=await reply_markup.write(client) if reply_markup else None + ) diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py index 7d0c35f20..12978db95 100644 --- a/pyrogram/types/messages_and_media/message.py +++ b/pyrogram/types/messages_and_media/message.py @@ -2478,6 +2478,8 @@ async def reply_location( latitude: float, longitude: float, quote: bool = None, + horizontal_accuracy: float = None, + # TODO disable_notification: bool = None, reply_to_message_id: int = None, business_connection_id: str = None, @@ -2521,6 +2523,9 @@ async def reply_location( If *reply_to_message_id* is passed, this parameter will be ignored. Defaults to ``True`` in group chats and ``False`` in private chats. + horizontal_accuracy (``float``, *optional*): + The radius of uncertainty for the location, measured in meters; 0-1500. + disable_notification (``bool``, *optional*): Sends the message silently. Users will receive a notification with no sound. @@ -2582,6 +2587,7 @@ async def reply_location( chat_id=chat_id, latitude=latitude, longitude=longitude, + horizontal_accuracy=horizontal_accuracy, disable_notification=disable_notification, message_thread_id=message_thread_id, reply_to_message_id=reply_to_message_id, @@ -3223,6 +3229,7 @@ async def reply_venue( quote: bool = None, foursquare_id: str = "", foursquare_type: str = "", + # TODO disable_notification: bool = None, reply_to_message_id: int = None, business_connection_id: str = None,