From 40eeda39c008298b6ddf45f2a02c1e23eb94ecae Mon Sep 17 00:00:00 2001 From: wulan17 Date: Sat, 8 Jun 2024 15:59:34 +0700 Subject: [PATCH] pyrofork: Add send_invoice method Signed-off-by: wulan17 --- compiler/docs/compiler.py | 2 + pyrogram/methods/messages/__init__.py | 2 + pyrogram/methods/messages/send_invoice.py | 214 ++++++++++++++++++ pyrogram/types/messages_and_media/__init__.py | 3 +- .../types/messages_and_media/labeled_price.py | 45 ++++ 5 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 pyrogram/methods/messages/send_invoice.py create mode 100644 pyrogram/types/messages_and_media/labeled_price.py diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index e9a81a085..4df706223 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -171,6 +171,7 @@ def get_title_list(s: str) -> list: send_photo send_audio send_document + send_invoice send_sticker send_video send_animation @@ -470,6 +471,7 @@ def get_title_list(s: str) -> list: AvailableEffect Document Animation + LabeledPrice Video Voice VideoNote diff --git a/pyrogram/methods/messages/__init__.py b/pyrogram/methods/messages/__init__.py index ed2a352a9..e7834bc7a 100644 --- a/pyrogram/methods/messages/__init__.py +++ b/pyrogram/methods/messages/__init__.py @@ -54,6 +54,7 @@ from .send_contact import SendContact from .send_dice import SendDice from .send_document import SendDocument +from .send_invoice import SendInvoice from .send_location import SendLocation from .send_media_group import SendMediaGroup from .send_message import SendMessage @@ -86,6 +87,7 @@ class Messages( SendContact, SendDocument, SendAnimation, + SendInvoice, SendLocation, SendMediaGroup, SendMessage, diff --git a/pyrogram/methods/messages/send_invoice.py b/pyrogram/methods/messages/send_invoice.py new file mode 100644 index 000000000..4ca5e6149 --- /dev/null +++ b/pyrogram/methods/messages/send_invoice.py @@ -0,0 +1,214 @@ +# Pyrofork - Telegram MTProto API Client Library for Python +# Copyright (C) 2022-present Mayuri-Chan +# +# This file is part of Pyrofork. +# +# Pyrofork 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. +# +# Pyrofork 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 Pyrofork. If not, see . +import pyrogram + +from pyrogram import types, raw, utils +from typing import Union, List + +class SendInvoice: + async def send_invoice( + self: "pyrogram.Client", + chat_id: Union[int, str], + title: str, + description: str, + currency: str, + prices: List["types.LabeledPrice"], + is_test: bool = None, + is_name_requested: bool = None, + is_phone_requested: bool = None, + is_email_requested: bool = None, + is_shipping_address_requested: bool = None, + is_flexible: bool = None, + is_recurring: bool = None, + max_tip_amount: int = None, + suggested_tip_amounts: List[int] = None, + terms_url: str = None, + provider: str = None, + provider_data: str = None, + photo_url: str = None, + photo_size: int = None, + photo_mime_type: str = None, + start_parameter: str = None, + extended_media: "types.InputMedia" = None, + reply_to_message_id: int = None, + message_thread_id: int = None, + quote_text: str = None, + quote_entities: List["types.MessageEntity"] = None, + ): + """Use this method to send invoices. + + .. include:: /_includes/usable-by/bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier for the target private chat or username of the target private chat. + title (``str``): + Product name. + + description (``str``): + Product description. + + currency (``str``): + Three-letter ISO 4217 currency code. + + prices (List of :obj:`~pyrogram.types.LabeledPrice`): + Price with label. + + is_test (``bool``, *optional*): + True, if the invoice is a test invoice. + + is_name_requested (``bool``, *optional*): + True, if the name is requested. + + is_phone_requested (``bool``, *optional*): + True, if the phone number is requested. + + is_email_requested (``bool``, *optional*): + True, if the email address is requested. + + is_shipping_address_requested (``bool``, *optional*): + True, if the shipping address is requested. + + is_flexible (``bool``, *optional*): + True, if the final price depends on the shipping method. + + is_recurring (``bool``, *optional*): + True, if the payment is recurring. + + max_tip_amount (``int``, *optional*): + Maximum amount of the tip. + + suggested_tip_amounts (List of ``int``, *optional*): + List of suggested tip amounts. + + terms_url (``str``, *optional*): + URL for the terms of service. + + provider (``str``, *optional*): + Payment provider. + + provider_data (``str``, *optional*): + Provider data in json format. + + photo_url (``str``, *optional*): + Photo URL. + + photo_size (``int``, *optional*): + Photo size. + + photo_mime_type (``str``, *optional*): + Photo MIME type. + + start_parameter (``str``, *optional*): + Unique bot deep-linking parameter that can be used to generate this invoice. + + extended_media (:obj:`~pyrogram.types.InputMedia`, *optional*): + Additional media. + + reply_to_message_id (``int``, *optional*): + If the message is a reply, ID of the original message. + + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + + quote_text (``str``, *optional*): + Text to quote. + for reply_to_message only. + + quote_entities (List of :obj:`~pyrogram.types.MessageEntity`, *optional*): + List of special entities that appear in quote_text, which can be specified instead of *parse_mode*. + for reply_to_message only. + + Returns: + :obj:`~pyrogram.types.Message`: On success, the sent message is returned. + + Example: + .. code-block:: python + + app.send_invoice(chat_id, types.InputMediaInvoice( + title="Product Name", + description="Product Description", + currency="USD", + prices=[types.LabeledPrice("Product", 1000)], + provider="Stripe", + provider_data="{}" + )) + """ + + reply_to = await utils.get_reply_to( + client=self, + chat_id=chat_id, + reply_to_message_id=reply_to_message_id, + message_thread_id=message_thread_id, + quote_text=quote_text, + quote_entities=quote_entities + ) + + r = await self.invoke( + raw.functions.messages.SendMedia( + peer=await self.resolve_peer(chat_id), + media=raw.types.InputMediaInvoice( + title=title, + description=description, + invoice=raw.types.Invoice( + currency=currency, + prices=[price.write() for price in prices], + test=is_test, + name_requested=is_name_requested, + phone_requested=is_phone_requested, + email_requested=is_email_requested, + shipping_address_requested=is_shipping_address_requested, + flexible=is_flexible, + recurring=is_recurring, + max_tip_amount=max_tip_amount, + suggested_tip_amounts=suggested_tip_amounts, + terms_url=terms_url + ), + payload=f"{(title)}".encode(), + provider=provider, + provider_data=raw.types.DataJSON(data=provider_data if provider_data else "{}"), + photo=raw.types.InputWebDocument( + url=photo_url, + size=photo_size or 0, + mime_type=photo_mime_type or "image/jpeg", + attributes=[] + ) if photo_url else None, + start_param=start_parameter, + extended_media=extended_media + ), + random_id=self.rnd_id(), + reply_to=reply_to, + message="" + ) + ) + + for i in r.updates: + if isinstance( + i, + ( + raw.types.UpdateNewMessage, + raw.types.UpdateNewChannelMessage + ) + ): + return types.Message._parse( + self, + i.message, + users={i.id: i for i in r.users}, + chats={i.id: i for i in r.chats} + ) diff --git a/pyrogram/types/messages_and_media/__init__.py b/pyrogram/types/messages_and_media/__init__.py index 6348f7a67..5736b8aba 100644 --- a/pyrogram/types/messages_and_media/__init__.py +++ b/pyrogram/types/messages_and_media/__init__.py @@ -28,6 +28,7 @@ from .giveaway import Giveaway from .giveaway_launched import GiveawayLaunched from .giveaway_result import GiveawayResult +from .labeled_price import LabeledPrice from .location import Location from .media_area import MediaArea from .media_area_channel_post import MediaAreaChannelPost @@ -66,7 +67,7 @@ from .exported_story_link import ExportedStoryLink __all__ = [ - "Animation", "Audio", "AvailableEffect", "Contact", "Document", "Game", "GiftedPremium", "Giveaway", "GiveawayLaunched", "GiveawayResult", "Location", "MediaArea", "MediaAreaChannelPost", "MediaAreaCoordinates", "Message", "MessageEntity", "Photo", "Thumbnail", + "Animation", "Audio", "AvailableEffect", "Contact", "Document", "Game", "GiftedPremium", "Giveaway", "GiveawayLaunched", "GiveawayResult", "LabeledPrice", "Location", "MediaArea", "MediaAreaChannelPost", "MediaAreaCoordinates", "Message", "MessageEntity", "Photo", "Thumbnail", "StrippedThumbnail", "Poll", "PollOption", "Sticker", "StickerSet", "Venue", "Video", "VideoNote", "Voice", "WebPage", "WebPageEmpty", "WebPagePreview", "Dice", "Reaction", "WebAppData", "MessageInvoice", "MessageReactions", "ReactionCount", "ReactionType", "MessageReactionUpdated", "MessageReactionCountUpdated", "MessageStory", "Story", "StoryDeleted", "StorySkipped", "StoryViews", "StoryForwardHeader", "StoriesPrivacyRules", "ExportedStoryLink" ] diff --git a/pyrogram/types/messages_and_media/labeled_price.py b/pyrogram/types/messages_and_media/labeled_price.py new file mode 100644 index 000000000..5ffc9237c --- /dev/null +++ b/pyrogram/types/messages_and_media/labeled_price.py @@ -0,0 +1,45 @@ +# Pyrofork - Telegram MTProto API Client Library for Python +# Copyright (C) 2022-present Mayuri-Chan +# +# This file is part of Pyrofork. +# +# Pyrofork 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. +# +# Pyrofork 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 Pyrofork. If not, see . + +from pyrogram import raw +from ..object import Object + +class LabeledPrice(Object): + """This object represents a price for goods or services. + + Parameters: + label (``str``): + Portion label. + + amount (``int``): + Price of the product in the smallest units of the currency (integer, not float/double). + """ + + def __init__( + self, + label: str, + amount: int + ): + self.label = label + self.amount = amount + + def write(self): + return raw.types.LabeledPrice( + label=self.label, + amount=self.amount + )