pyrofork: update StarGift type to new layer

Signed-off-by: Yasir Aris <git@yasir.id>
This commit is contained in:
KurimuzonAkuma 2025-01-02 21:27:14 +03:00 committed by Yasir Aris
parent e67a016828
commit 8e7e5fb9ff
16 changed files with 728 additions and 49 deletions

View file

@ -365,6 +365,8 @@ def pyrogram_api():
send_payment_form
send_star_gift
show_star_gift
transfer_star_gift
upgrade_star_gift
""",
password="""
Password
@ -562,6 +564,7 @@ def pyrogram_api():
ScreenshotTaken
Wallpaper
WallpaperSettings
StarGiftAttribute
""",
stories="""
Stories

View file

@ -38,6 +38,7 @@ from .profile_color import ProfileColor
from .reaction_type import ReactionType
from .reply_color import ReplyColor
from .sent_code_type import SentCodeType
from .star_gift_attribute_type import StarGiftAttributeType
from .stories_privacy_rules import StoriesPrivacyRules
from .story_privacy import StoryPrivacy
from .user_status import UserStatus
@ -64,6 +65,7 @@ __all__ = [
'ReactionType',
'ReplyColor',
'SentCodeType',
'StarGiftAttributeType',
"StoriesPrivacyRules",
"StoryPrivacy",
'UserStatus'

View file

@ -0,0 +1,33 @@
# 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/>.
from pyrogram import raw
from .auto_name import AutoName
class StarGiftAttributeType(AutoName):
"""Star gift attribute type enumeration used in :obj:`~pyrogram.types.StarGiftAttribute`."""
MODEL = raw.types.StarGiftAttributeModel
"Model attribute"
SYMBOL = raw.types.StarGiftAttributePattern
"Symbol attribute"
BACKDROP = raw.types.StarGiftAttributeBackdrop
"Backdrop attribute"

View file

@ -30,6 +30,9 @@ class SearchGlobal:
self: "pyrogram.Client",
query: str = "",
filter: "enums.MessagesFilter" = enums.MessagesFilter.EMPTY,
channels_only: Optional[bool] = None,
groups_only: Optional[bool] = None,
users_only: Optional[bool] = None,
limit: int = 0,
) -> Optional[AsyncGenerator["types.Message", None]]:
"""Search messages globally from all of your chats.
@ -56,6 +59,15 @@ class SearchGlobal:
Limits the number of messages to be retrieved.
By default, no limit is applied and all messages are returned.
channels_only (``bool``, *optional*):
Pass True to search only in channels.
groups_only (``bool``, *optional*):
Pass True to search only in groups.
users_only (``bool``, *optional*):
Pass True to search only in users.
Returns:
``Generator``: A generator yielding :obj:`~pyrogram.types.Message` objects.
@ -93,6 +105,9 @@ class SearchGlobal:
offset_rate=offset_date,
offset_peer=offset_peer,
offset_id=offset_id,
broadcasts_only=channels_only,
groups_only=groups_only,
users_only=users_only,
limit=limit
),
sleep_threshold=60

View file

@ -17,6 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrofork. If not, see <http://www.gnu.org/licenses/>.
from typing import Optional
import pyrogram
from pyrogram import raw, enums
@ -26,6 +28,9 @@ class SearchGlobalCount:
self: "pyrogram.Client",
query: str = "",
filter: "enums.MessagesFilter" = enums.MessagesFilter.EMPTY,
channels_only: Optional[bool] = None,
groups_only: Optional[bool] = None,
users_only: Optional[bool] = None,
) -> int:
"""Get the count of messages resulting from a global search.
@ -41,6 +46,15 @@ class SearchGlobalCount:
filter (:obj:`~pyrogram.enums.MessagesFilter`, *optional*):
Pass a filter in order to search for specific kind of messages only:
channels_only (``bool``, *optional*):
Pass True to search only in channels.
groups_only (``bool``, *optional*):
Pass True to search only in groups.
users_only (``bool``, *optional*):
Pass True to search only in users.
Returns:
``int``: On success, the messages count is returned.
"""
@ -53,6 +67,9 @@ class SearchGlobalCount:
offset_rate=0,
offset_peer=raw.types.InputPeerEmpty(),
offset_id=0,
broadcasts_only=channels_only,
groups_only=groups_only,
users_only=users_only,
limit=1
)
)

View file

@ -35,6 +35,8 @@ from .send_paid_reaction import SendPaidReaction
from .send_payment_form import SendPaymentForm
from .send_star_gift import SendStarGift
from .show_star_gift import ShowStarGift
from .transfer_star_gift import TransferStarGift
from .upgrade_star_gift import UpgradeStarGift
class Payments(
ApplyGiftCode,
@ -54,6 +56,8 @@ class Payments(
SendInvoice,
SendPaymentForm,
SendStarGift,
ShowStarGift
ShowStarGift,
TransferStarGift,
UpgradeStarGift
):
pass

View file

@ -27,7 +27,6 @@ from pyrogram import raw
class ConvertStarGift:
async def convert_star_gift(
self: "pyrogram.Client",
chat_id: Union[int, str],
message_id: int
) -> bool:
"""Convert star gift to stars.
@ -35,11 +34,6 @@ class ConvertStarGift:
.. include:: /_includes/usable-by/users.rst
Parameters:
chat_id (``int`` | ``str``):
Unique identifier (int) or username (str) of the target chat.
For your personal cloud (Saved Messages) you can simply use "me" or "self".
For a contact that exists in your Telegram address book you can use his phone number (str).
message_id (``int``):
Unique message identifier of star gift.
@ -50,16 +44,10 @@ class ConvertStarGift:
.. code-block:: python
# Convert gift
app.convert_star_gift(chat_id=chat_id, message_id=123)
app.convert_star_gift(message_id=123)
"""
peer = await self.resolve_peer(chat_id)
if not isinstance(peer, (raw.types.InputPeerUser, raw.types.InputPeerSelf)):
raise ValueError("chat_id must belong to a user.")
r = await self.invoke(
raw.functions.payments.ConvertStarGift(
user_id=peer,
msg_id=message_id
)
)

View file

@ -17,9 +17,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrofork. If not, see <http://www.gnu.org/licenses/>.
from typing import Union
import pyrogram
from pyrogram import raw
@ -27,7 +24,6 @@ from pyrogram import raw
class HideStarGift:
async def hide_star_gift(
self: "pyrogram.Client",
chat_id: Union[int, str],
message_id: int
) -> bool:
"""Hide the star gift from your profile.
@ -35,11 +31,6 @@ class HideStarGift:
.. include:: /_includes/usable-by/users.rst
Parameters:
chat_id (``int`` | ``str``):
Unique identifier (int) or username (str) of the target chat.
For your personal cloud (Saved Messages) you can simply use "me" or "self".
For a contact that exists in your Telegram address book you can use his phone number (str).
message_id (``int``):
Unique message identifier of star gift.
@ -50,16 +41,10 @@ class HideStarGift:
.. code-block:: python
# Hide gift
app.hide_star_gift(chat_id=chat_id, message_id=123)
app.hide_star_gift(message_id=123)
"""
peer = await self.resolve_peer(chat_id)
if not isinstance(peer, (raw.types.InputPeerUser, raw.types.InputPeerSelf)):
raise ValueError("chat_id must belong to a user.")
r = await self.invoke(
raw.functions.payments.SaveStarGift(
user_id=peer,
msg_id=message_id,
unsave=True
)

View file

@ -16,9 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Union
import pyrogram
from pyrogram import raw
@ -26,7 +23,6 @@ from pyrogram import raw
class ShowStarGift:
async def show_star_gift(
self: "pyrogram.Client",
chat_id: Union[int, str],
message_id: int
) -> bool:
"""Display the star gift in your profile.
@ -34,11 +30,6 @@ class ShowStarGift:
.. include:: /_includes/usable-by/users.rst
Parameters:
chat_id (``int`` | ``str``):
Unique identifier (int) or username (str) of the target chat.
For your personal cloud (Saved Messages) you can simply use "me" or "self".
For a contact that exists in your Telegram address book you can use his phone number (str).
message_id (``int``):
Unique message identifier of star gift.
@ -49,16 +40,10 @@ class ShowStarGift:
.. code-block:: python
# Show gift
app.show_star_gift(chat_id=chat_id, message_id=123)
app.show_star_gift(message_id=123)
"""
peer = await self.resolve_peer(chat_id)
if not isinstance(peer, (raw.types.InputPeerUser, raw.types.InputPeerSelf)):
raise ValueError("chat_id must belong to a user.")
r = await self.invoke(
raw.functions.payments.SaveStarGift(
user_id=peer,
msg_id=message_id,
unsave=False
)

View file

@ -0,0 +1,65 @@
# 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/>.
from typing import Union
import pyrogram
from pyrogram import raw
class TransferStarGift:
async def transfer_star_gift(
self: "pyrogram.Client",
chat_id: Union[int, str],
message_id: int,
) -> bool:
"""Transfer star gift to another user.
.. include:: /_includes/usable-by/users.rst
Parameters:
chat_id (``int`` | ``str``):
Unique identifier (int) or username (str) of the target chat you want to transfer the star gift to.
For your personal cloud (Saved Messages) you can simply use "me" or "self".
For a contact that exists in your Telegram address book you can use his phone number (str).
message_id (``int``):
Unique message identifier of star gift.
Returns:
``bool``: On success, True is returned.
Example:
.. code-block:: python
# Show gift
app.transfer_star_gift(chat_id=123, message_id=123)
"""
peer = await self.resolve_peer(chat_id)
if not isinstance(peer, (raw.types.InputPeerUser, raw.types.InputPeerSelf)):
raise ValueError("chat_id must belong to a user.")
await self.invoke(
raw.functions.payments.TransferStarGift(
msg_id=message_id,
keep_original_details=keep_details
)
)
return True # TODO:

View file

@ -0,0 +1,55 @@
# 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/>.
from typing import Optional
import pyrogram
from pyrogram import raw
class UpgradeStarGift:
async def upgrade_star_gift(
self: "pyrogram.Client",
message_id: int,
keep_details: Optional[bool] = None
) -> bool:
"""Upgrade star gift to unique.
.. include:: /_includes/usable-by/users.rst
Parameters:
message_id (``int``):
Unique message identifier of star gift.
Returns:
``bool``: On success, True is returned.
Example:
.. code-block:: python
# Show gift
app.upgrade_star_gift(message_id=123)
"""
await self.invoke(
raw.functions.payments.UpgradeStarGift(
msg_id=message_id,
keep_original_details=keep_details
)
)
return True # TODO:

View file

@ -43,6 +43,8 @@ from .poll_option import PollOption
from .reaction import Reaction
from .read_participant import ReadParticipant
from .screenshot_taken import ScreenshotTaken
from .star_gift_attribute import StarGiftAttribute
from .star_gift import StarGift
from .sticker import Sticker
from .stickerset import StickerSet
from .stories_privacy_rules import StoriesPrivacyRules
@ -115,6 +117,8 @@ __all__ = [
"MessageStory",
"ReadParticipant",
"ScreenshotTaken",
"StarGiftAttribute",
"StarGift",
"Story",
"StoryDeleted",
"StorySkipped",

View file

@ -909,7 +909,7 @@ class Message(Object, Update):
elif isinstance(action, raw.types.MessageActionStarGift):
user_gift = await types.UserGift._parse_action(client, message, users)
service_type = enums.MessageServiceType.USER_GIFT
elif isinstance(action, raw.types.MessageActionStarGift):
elif isinstance(action, (raw.types.MessageActionStarGift, raw.types.MessageActionStarGiftUnique)):
star_gift = await types.StarGift._parse_action(client, message, users)
service_type = enums.MessageServiceType.STAR_GIFT
elif isinstance(action, raw.types.MessageActionScreenshotTaken):

View file

@ -0,0 +1,443 @@
# Pyrofork - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
# Copyright (C) 2022-present Mayuri-Chan <https://github.com/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 <http://www.gnu.org/licenses/>.
from datetime import datetime
from typing import Optional, List
import pyrogram
from pyrogram import raw
from pyrogram import types
from pyrogram import utils
from ..object import Object
class StarGift(Object):
"""A star gift.
Parameters:
id (``int``):
Unique star gift identifier.
sticker (:obj:`~pyrogram.types.Sticker`, *optional*):
Information about the star gift sticker.
caption (``str``, *optional*):
Text message.
caption_entities (List of :obj:`~pyrogram.types.MessageEntity`, *optional*):
For text messages, special entities like usernames, URLs, bot commands, etc. that appear in the text.
message_id (``int``, *optional*):
Unique message identifier.
upgrade_message_id (``int``, *optional*):
Unique message identifier.
For unique gifts only.
title (``str``, *optional*):
Title of the star gift.
For unique gifts only.
number (``int``, *optional*):
Collectible number of the star gift.
For unique gifts only.
model (:obj:`~pyrogram.types.StarGiftAttribute`, *optional*):
Information about the star gift model.
For unique gifts only.
backdrop (:obj:`~pyrogram.types.StarGiftAttribute`, *optional*):
Information about the star gift backdrop.
For unique gifts only.
symbol (:obj:`~pyrogram.types.StarGiftAttribute`, *optional*):
Information about the star gift symbol.
For unique gifts only.
date (``datetime``, *optional*):
Date when the star gift was received.
first_sale_date (``datetime``, *optional*):
Date when the star gift was first purchased.
last_sale_date (``datetime``, *optional*):
Date when the star gift was last purchased.
from_user (:obj:`~pyrogram.types.User`, *optional*):
User who sent the star gift.
price (``int``, *optional*):
Price of this gift in stars.
convert_price (``int``, *optional*):
The number of stars you get if you convert this gift.
upgrade_price (``int``, *optional*):
The number of stars you need to upgrade this gift.
transfer_price (``int``, *optional*):
The number of stars you need to transfer this gift.
available_amount (``int``, *optional*):
The number of gifts available for purchase.
Returned only if is_limited is True.
total_amount (``int``, *optional*):
Total amount of gifts.
Returned only if is_limited is True.
can_upgrade (``bool``, *optional*):
True, if the gift can be upgraded.
can_export_at (``datetime``, *optional*):
Date when the gift can be exported via blockchain.
is_limited (``bool``, *optional*):
True, if the number of gifts is limited.
is_name_hidden (``bool``, *optional*):
True, if the sender's name is hidden.
is_saved (``bool``, *optional*):
True, if the star gift is saved in profile.
is_sold_out (``bool``, *optional*):
True, if the star gift is sold out.
is_converted (``bool``, *optional*):
True, if the gift was converted to Telegram Stars.
Only for the receiver of the gift.
is_upgraded (``bool``, *optional*):
True, if the gift was upgraded.
is_refunded (``bool``, *optional*):
True, if the gift was refunded.
is_transferred (``bool``, *optional*):
True, if the gift was transferred.
is_unique (``bool``, *optional*):
True, if the gift is unique.
"""
def __init__(
self,
*,
client: "pyrogram.Client" = None,
id: int,
sticker: "types.Sticker" = None,
caption: Optional[str] = None,
caption_entities: List["types.MessageEntity"] = None,
message_id: Optional[int] = None,
date: Optional[datetime] = None,
first_sale_date: Optional[datetime] = None,
last_sale_date: Optional[datetime] = None,
from_user: Optional["types.User"] = None,
price: Optional[int] = None,
convert_price: Optional[int] = None,
upgrade_price: Optional[int] = None,
transfer_price: Optional[int] = None,
upgrade_message_id: Optional[int] = None,
title: Optional[str] = None,
number: Optional[int] = None,
model: Optional["types.StarGiftAttribute"] = None,
backdrop: Optional["types.StarGiftAttribute"] = None,
symbol: Optional["types.StarGiftAttribute"] = None,
available_amount: Optional[int] = None,
total_amount: Optional[int] = None,
can_upgrade: Optional[bool] = None,
can_export_at: Optional[datetime] = None,
is_limited: Optional[bool] = None,
is_name_hidden: Optional[bool] = None,
is_saved: Optional[bool] = None,
is_sold_out: Optional[bool] = None,
is_converted: Optional[bool] = None,
is_upgraded: Optional[bool] = None,
is_refunded: Optional[bool] = None,
is_transferred: Optional[bool] = None,
is_unique: Optional[bool] = None
):
super().__init__(client)
self.id = id
self.sticker = sticker
self.caption = caption
self.caption_entities = caption_entities
self.message_id = message_id
self.date = date
self.first_sale_date = first_sale_date
self.last_sale_date = last_sale_date
self.from_user = from_user
self.price = price
self.convert_price = convert_price
self.upgrade_price = upgrade_price
self.transfer_price = transfer_price
self.upgrade_message_id = upgrade_message_id
self.title = title
self.number = number
self.model = model
self.backdrop = backdrop
self.symbol = symbol
self.available_amount = available_amount
self.total_amount = total_amount
self.can_upgrade = can_upgrade
self.can_export_at = can_export_at
self.is_limited = is_limited
self.is_name_hidden = is_name_hidden
self.is_saved = is_saved
self.is_sold_out = is_sold_out
self.is_converted = is_converted
self.is_upgraded = is_upgraded
self.is_refunded = is_refunded
self.is_transferred = is_transferred
self.is_unique = is_unique
@staticmethod
async def _parse(
client,
star_gift: "raw.types.StarGift",
) -> "StarGift":
doc = star_gift.sticker
attributes = {type(i): i for i in doc.attributes}
return StarGift(
id=star_gift.id,
sticker=await types.Sticker._parse(client, doc, attributes),
price=star_gift.stars,
convert_price=star_gift.convert_stars,
available_amount=getattr(star_gift, "availability_remains", None),
total_amount=getattr(star_gift, "availability_total", None),
is_limited=getattr(star_gift, "limited", None),
first_sale_date=utils.timestamp_to_datetime(getattr(star_gift, "first_sale_date", None)),
last_sale_date=utils.timestamp_to_datetime(getattr(star_gift, "last_sale_date", None)),
is_sold_out=getattr(star_gift, "sold_out", None),
client=client
)
@staticmethod
async def _parse_user_star_gift(
client,
user_star_gift: "raw.types.UserStarGift",
users: dict
) -> "StarGift":
caption, caption_entities = (
utils.parse_text_with_entities(
client, getattr(user_star_gift, "message", None), users
)
).values()
if isinstance(user_star_gift.gift, raw.types.StarGift):
doc = user_star_gift.gift.sticker
attributes = {type(i): i for i in doc.attributes}
return StarGift(
id=user_star_gift.gift.id,
sticker=await types.Sticker._parse(client, doc, attributes),
price=user_star_gift.gift.stars,
convert_price=user_star_gift.gift.convert_stars,
available_amount=getattr(user_star_gift.gift, "availability_remains", None),
total_amount=getattr(user_star_gift.gift, "availability_total", None),
date=utils.timestamp_to_datetime(user_star_gift.date),
is_limited=getattr(user_star_gift.gift, "limited", None),
is_name_hidden=getattr(user_star_gift, "name_hidden", None),
is_saved=not user_star_gift.unsaved if getattr(user_star_gift, "unsaved", None) else None,
is_refunded=getattr(user_star_gift, "refunded", None),
can_upgrade=getattr(user_star_gift, "can_upgrade", None),
can_export_at=utils.timestamp_to_datetime(getattr(user_star_gift, "can_export_at", None)),
upgrade_price=getattr(user_star_gift, "upgrade_stars", None),
transfer_price=getattr(user_star_gift, "transfer_stars", None),
from_user=types.User._parse(client, users.get(user_star_gift.from_id)) if getattr(user_star_gift, "from_id", None) else None,
message_id=getattr(user_star_gift, "msg_id", None),
caption=caption,
caption_entities=caption_entities,
client=client
)
elif isinstance(user_star_gift.gift, raw.types.StarGiftUnique):
gift = user_star_gift.gift
attributes = {type(i): i for i in gift.attributes}
model = None
backdrop = None
symbol = None
for key, value in attributes.items():
if isinstance(key, raw.types.StarGiftAttributeModel):
model = await types.StarGiftAttribute._parse(client, value)
elif isinstance(key, raw.types.StarGiftAttributeBackdrop):
backdrop = await types.StarGiftAttribute._parse(client, value)
elif isinstance(key, raw.types.StarGiftAttributePattern):
symbol = await types.StarGiftAttribute._parse(client, value)
return StarGift(
id=user_star_gift.gift.id,
available_amount=getattr(user_star_gift.gift, "availability_issued", None),
total_amount=getattr(user_star_gift.gift, "availability_total", None),
date=utils.timestamp_to_datetime(user_star_gift.date),
model=model,
backdrop=backdrop,
symbol=symbol,
title=gift.title,
number=gift.num,
is_unique=True,
is_name_hidden=getattr(user_star_gift, "name_hidden", None),
is_saved=not user_star_gift.unsaved if getattr(user_star_gift, "unsaved", None) else None,
is_refunded=getattr(user_star_gift, "refunded", None),
can_upgrade=getattr(user_star_gift, "can_upgrade", None),
can_export_at=utils.timestamp_to_datetime(getattr(user_star_gift, "can_export_at", None)),
upgrade_price=getattr(user_star_gift, "upgrade_stars", None),
transfer_price=getattr(user_star_gift, "transfer_stars", None),
from_user=types.User._parse(client, users.get(user_star_gift.from_id)) if getattr(user_star_gift, "from_id", None) else None,
message_id=getattr(user_star_gift, "msg_id", None),
caption=caption,
caption_entities=caption_entities,
client=client
)
@staticmethod
async def _parse_action(
client,
message: "raw.base.Message",
users: dict
) -> "StarGift":
action = message.action # type: raw.types.MessageActionStarGift
caption, caption_entities = (
utils.parse_text_with_entities(
client, getattr(action, "message", None), users
)
).values()
if isinstance(action, raw.types.MessageActionStarGift):
doc = action.gift.sticker
attributes = {type(i): i for i in doc.attributes}
return StarGift(
id=action.gift.id,
sticker=await types.Sticker._parse(client, doc, attributes),
price=action.gift.stars,
convert_price=action.gift.convert_stars,
available_amount=getattr(action.gift, "availability_remains", None),
total_amount=getattr(action.gift, "availability_total", None),
date=utils.timestamp_to_datetime(message.date),
can_upgrade=getattr(action, "can_upgrade", None),
is_limited=getattr(action.gift, "limited", None),
is_name_hidden=getattr(action, "name_hidden", None),
is_saved=getattr(action, "saved", None),
is_converted=getattr(action, "converted", None),
is_upgraded=getattr(action, "upgraded", None),
is_refunded=getattr(action, "refunded", None),
from_user=types.User._parse(client, users.get(utils.get_raw_peer_id(message.peer_id))),
message_id=message.id,
upgrade_message_id=getattr(action, "upgrade_msg_id", None),
upgrade_price=getattr(action, "upgrade_stars", None),
caption=caption,
caption_entities=caption_entities,
client=client
)
elif isinstance(action, raw.types.MessageActionStarGiftUnique):
gift = action.gift
attributes = {type(i): i for i in gift.attributes}
model = None
backdrop = None
symbol = None
for key, value in attributes.items():
if isinstance(key, raw.types.StarGiftAttributeModel):
model = await types.StarGiftAttribute._parse(client, value)
elif isinstance(key, raw.types.StarGiftAttributeBackdrop):
backdrop = await types.StarGiftAttribute._parse(client, value)
elif isinstance(key, raw.types.StarGiftAttributePattern):
symbol = await types.StarGiftAttribute._parse(client, value)
return StarGift(
id=action.gift.id,
available_amount=getattr(action.gift, "availability_issued", None),
total_amount=getattr(action.gift, "availability_total", None),
date=utils.timestamp_to_datetime(message.date),
is_unique=True,
from_user=types.User._parse(client, users.get(utils.get_raw_peer_id(message.peer_id))),
message_id=message.id,
caption=caption,
caption_entities=caption_entities,
title=gift.title,
number=gift.num,
model=model,
backdrop=backdrop,
symbol=symbol,
is_upgraded=getattr(action, "upgrade", None),
is_transferred=getattr(action, "transferred", None),
is_saved=getattr(action, "saved", None),
is_refunded=getattr(action, "refunded", None),
can_export_at=utils.timestamp_to_datetime(getattr(action, "can_export_at", None)),
transfer_price=getattr(action, "transfer_stars", None),
client=client
)
async def show(self) -> bool:
"""Bound method *show* of :obj:`~pyrogram.types.StarGift`.
Use as a shortcut for:
.. code-block:: python
await client.show_star_gift(
chat_id=message.chat.id,
message_id=message_id
)
Example:
.. code-block:: python
await star_gift.show()
Returns:
``bool``: On success, True is returned.
"""
return await self._client.show_star_gift(
chat_id=self.from_user.id,
message_id=self.message_id
)
async def hide(self) -> bool:
"""Bound method *hide* of :obj:`~pyrogram.types.StarGift`.
Use as a shortcut for:
.. code-block:: python
await client.hide_star_gift(
chat_id=message.chat.id,
message_id=message_id
)
Example:
.. code-block:: python
await star_gift.hide()
Returns:
``bool``: On success, True is returned.
"""
return await self._client.hide_star_gift(
chat_id=self.from_user.id,
message_id=self.message_id
)

View file

@ -0,0 +1,80 @@
# Pyrofork - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
# Copyright (C) 2022-present Mayuri-Chan <https://github.com/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 <http://www.gnu.org/licenses/>.
from datetime import datetime
from typing import Optional, List
import pyrogram
from pyrogram import raw
from pyrogram import types
from pyrogram import enums
from pyrogram import utils
from ..object import Object
class StarGiftAttribute(Object):
"""Contains information about a star gift attribute.
Parameters:
name (``str``):
Name of the attribute.
type (:obj:`~pyrogram.enums.StarGiftAttributeType`):
Type of the attribute.
rarity (``int``):
Rarity of the attribute in permilles.
For example, 15 means 1.5%. So only 1.5% of such collectibles have this attribute.
sticker (:obj:`~pyrogram.types.Sticker`):
Information about the sticker.
"""
def __init__(
self,
*,
client: "pyrogram.Client" = None,
name: str,
type: "enums.StarGiftAttributeType",
rarity: int,
sticker: "types.Sticker",
):
super().__init__(client)
self.name = name
self.type = type
self.rarity = rarity
self.sticker = sticker
# TODO: Add support for raw.types.StarGiftAttributeOriginalDetails
@staticmethod
async def _parse(
client,
attr: "raw.base.StarGiftAttribute",
) -> "StarGiftAttribute":
doc = attr.document
attributes = {type(i): i for i in doc.attributes}
return StarGiftAttribute(
name=attr.name,
type=enums.StarGiftAttributeType(type(attr)),
sticker=await types.Sticker._parse(client, doc, attributes),
rarity=attr.rarity_permille,
client=client
)