Added support for InputMessageContent classes, according to BOT API.

Signed-off-by: wulan17 <wulan17@nusantararom.org>
This commit is contained in:
shriMADhav U k 2024-06-18 06:58:58 +02:00 committed by wulan17
parent bb4ea00d4e
commit 3a41a51359
No known key found for this signature in database
GPG key ID: 318CD6CD3A6AC0A5
10 changed files with 450 additions and 8 deletions

View file

@ -627,6 +627,10 @@ def pyrogram_api():
InputReplyToMessage
InputReplyToStory
InputTextMessageContent
InputLocationMessageContent
InputVenueMessageContent
InputContactMessageContent
InputInvoiceMessageContent
""",
authorization="""
Authorization

View file

@ -31,6 +31,8 @@ class SendLocation:
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 @@ class SendLocation:
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 @@ class SendLocation:
media=raw.types.InputMediaGeoPoint(
geo_point=raw.types.InputGeoPoint(
lat=latitude,
long=longitude
long=longitude,
accuracy_radius=horizontal_accuracy
)
),
message="",

View file

@ -35,6 +35,8 @@ class SendVenue:
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 @@ class SendVenue:
),
title=title,
address=address,
provider="",
provider="", # TODO
venue_id=foursquare_id,
venue_type=foursquare_type
),

View file

@ -21,7 +21,18 @@ from .input_message_content import InputMessageContent
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"
]

View file

@ -0,0 +1,68 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# 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 <http://www.gnu.org/licenses/>.
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 <https://en.wikipedia.org/wiki/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
)

View file

@ -0,0 +1,174 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# 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 <http://www.gnu.org/licenses/>.
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 <https://core.telegram.org/bots/payments#supported-currencies>`_. Pass ``XTR`` for payments in `Telegram Stars <https://t.me/BotNews/90>`_.
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 <https://t.me/BotNews/90>`_.
provider_token (``str``, *optional*):
Payment provider token, obtained via `@BotFather <https://t.me/botfather>`_. Pass an empty string for payments in `Telegram Stars <https://t.me/BotNews/90>`_.
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 <https://core.telegram.org/bots/payments/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 <https://t.me/BotNews/90>`_.
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 <https://t.me/BotNews/90>`_.
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 <https://t.me/BotNews/90>`_.
need_email (``bool``, *optional*):
Pass True if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars <https://t.me/BotNews/90>`_.
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 <https://t.me/BotNews/90>`_.
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 <https://t.me/BotNews/90>`_.
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 <https://t.me/BotNews/90>`_.
is_flexible (``bool``, *optional*):
Pass True if the final price depends on the shipping method. Ignored for payments in `Telegram Stars <https://t.me/BotNews/90>`_.
"""
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
)

View file

@ -0,0 +1,82 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# 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 <http://www.gnu.org/licenses/>.
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
)

View file

@ -21,17 +21,18 @@ import pyrogram
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):

View file

@ -0,0 +1,87 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# 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 <http://www.gnu.org/licenses/>.
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
)

View file

@ -2478,6 +2478,8 @@ class Message(Object, Update):
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 @@ class Message(Object, Update):
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 @@ class Message(Object, Update):
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 @@ class Message(Object, Update):
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,