diff --git a/pyrogram/client/methods/messages/__init__.py b/pyrogram/client/methods/messages/__init__.py index dde50b7b..d26c51cc 100644 --- a/pyrogram/client/methods/messages/__init__.py +++ b/pyrogram/client/methods/messages/__init__.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -from .close_poll import ClosePoll +from .stop_poll import StopPoll from .delete_messages import DeleteMessages from .download_media import DownloadMedia from .edit_message_caption import EditMessageCaption @@ -72,7 +72,7 @@ class Messages( SendVoice, SendPoll, VotePoll, - ClosePoll, + StopPoll, RetractVote, DownloadMedia, IterHistory, diff --git a/pyrogram/client/methods/messages/retract_vote.py b/pyrogram/client/methods/messages/retract_vote.py index 8fa8996c..ce8a0140 100644 --- a/pyrogram/client/methods/messages/retract_vote.py +++ b/pyrogram/client/methods/messages/retract_vote.py @@ -18,6 +18,7 @@ from typing import Union +import pyrogram from pyrogram.api import functions from pyrogram.client.ext import BaseClient @@ -26,8 +27,8 @@ class RetractVote(BaseClient): def retract_vote( self, chat_id: Union[int, str], - message_id: id - ) -> bool: + message_id: int + ) -> "pyrogram.Poll": """Use this method to retract your vote in a poll. Args: @@ -37,15 +38,15 @@ class RetractVote(BaseClient): For a contact that exists in your Telegram address book you can use his phone number (str). message_id (``int``): - Unique poll message identifier inside this chat. + Identifier of the original message with the poll. Returns: - On success, True is returned. + On success, the :obj:`Poll ` with the retracted vote is returned. Raises: :class:`RPCError ` in case of a Telegram RPC error. """ - self.send( + r = self.send( functions.messages.SendVote( peer=self.resolve_peer(chat_id), msg_id=message_id, @@ -53,4 +54,4 @@ class RetractVote(BaseClient): ) ) - return True + return pyrogram.Poll._parse(self, r.updates[0]) diff --git a/pyrogram/client/methods/messages/send_poll.py b/pyrogram/client/methods/messages/send_poll.py index 13e55b08..6b4e227a 100644 --- a/pyrogram/client/methods/messages/send_poll.py +++ b/pyrogram/client/methods/messages/send_poll.py @@ -47,10 +47,10 @@ class SendPoll(BaseClient): For a contact that exists in your Telegram address book you can use his phone number (str). question (``str``): - The poll question, as string. + Poll question, 1-255 characters. options (List of ``str``): - The poll options, as list of strings (2 to 10 options are allowed). + List of answer options, 2-10 strings 1-100 characters each. disable_notification (``bool``, *optional*): Sends the message silently. diff --git a/pyrogram/client/methods/messages/close_poll.py b/pyrogram/client/methods/messages/stop_poll.py similarity index 71% rename from pyrogram/client/methods/messages/close_poll.py rename to pyrogram/client/methods/messages/stop_poll.py index 1b1164c2..a5a4ecc8 100644 --- a/pyrogram/client/methods/messages/close_poll.py +++ b/pyrogram/client/methods/messages/stop_poll.py @@ -18,19 +18,21 @@ from typing import Union +import pyrogram from pyrogram.api import functions, types from pyrogram.client.ext import BaseClient -class ClosePoll(BaseClient): - def close_poll( +class StopPoll(BaseClient): + def stop_poll( self, chat_id: Union[int, str], - message_id: id - ) -> bool: - """Use this method to close (stop) a poll. + message_id: int, + reply_markup: "pyrogram.InlineKeyboardMarkup" = None + ) -> "pyrogram.Poll": + """Use this method to stop a poll which was sent by you. - Closed polls can't be reopened and nobody will be able to vote in it anymore. + Stopped polls can't be reopened and nobody will be able to vote in it anymore. Args: chat_id (``int`` | ``str``): @@ -39,17 +41,20 @@ class ClosePoll(BaseClient): For a contact that exists in your Telegram address book you can use his phone number (str). message_id (``int``): - Unique poll message identifier inside this chat. + Identifier of the original message with the poll. + + reply_markup (:obj:`InlineKeyboardMarkup`, *optional*): + An InlineKeyboardMarkup object. Returns: - On success, True is returned. + On success, the stopped :obj:`Poll ` with the final results is returned. Raises: :class:`RPCError ` in case of a Telegram RPC error. """ poll = self.get_messages(chat_id, message_id).poll - self.send( + r = self.send( functions.messages.EditMessage( peer=self.resolve_peer(chat_id), id=message_id, @@ -60,8 +65,9 @@ class ClosePoll(BaseClient): question="", answers=[] ) - ) + ), + reply_markup=reply_markup.write() if reply_markup else None ) ) - return True + return pyrogram.Poll._parse(self, r.updates[0]) diff --git a/pyrogram/client/methods/messages/vote_poll.py b/pyrogram/client/methods/messages/vote_poll.py index 2a9de874..58f21a6c 100644 --- a/pyrogram/client/methods/messages/vote_poll.py +++ b/pyrogram/client/methods/messages/vote_poll.py @@ -18,6 +18,7 @@ from typing import Union +import pyrogram from pyrogram.api import functions from pyrogram.client.ext import BaseClient @@ -28,7 +29,7 @@ class VotePoll(BaseClient): chat_id: Union[int, str], message_id: id, option: int - ) -> bool: + ) -> "pyrogram.Poll": """Use this method to vote a poll. Args: @@ -38,25 +39,26 @@ class VotePoll(BaseClient): For a contact that exists in your Telegram address book you can use his phone number (str). message_id (``int``): - Unique poll message identifier inside this chat. + Identifier of the original message with the poll. option (``int``): Index of the poll option you want to vote for (0 to 9). Returns: - On success, True is returned. + On success, the :obj:`Poll ` with the chosen option is returned. Raises: :class:`RPCError ` in case of a Telegram RPC error. """ + poll = self.get_messages(chat_id, message_id).poll - self.send( + r = self.send( functions.messages.SendVote( peer=self.resolve_peer(chat_id), msg_id=message_id, - options=[poll.options[option].data] + options=[poll.options[option]._data] ) ) - return True + return pyrogram.Poll._parse(self, r.updates[0]) diff --git a/pyrogram/client/types/messages_and_media/poll.py b/pyrogram/client/types/messages_and_media/poll.py index 68667334..dfe7daa9 100644 --- a/pyrogram/client/types/messages_and_media/poll.py +++ b/pyrogram/client/types/messages_and_media/poll.py @@ -29,78 +29,80 @@ class Poll(PyrogramType): Args: id (``int``): - The poll id in this chat. - - closed (``bool``): - Whether the poll is closed or not. + Unique poll identifier. question (``str``): - Poll question. + Poll question, 1-255 characters. options (List of :obj:`PollOption`): - The available poll options. + List of poll options. + + is_closed (``bool``): + True, if the poll is closed. total_voters (``int``): - Total amount of voters for this poll. + Total count of voters for this poll. - option_chosen (``int``, *optional*): - The index of your chosen option (in case you voted already), None otherwise. + chosen_option (``int``, *optional*): + Index of your chosen option (0-9), None in case you haven't voted yet. """ - __slots__ = ["id", "closed", "question", "options", "total_voters", "option_chosen"] + __slots__ = ["id", "question", "options", "is_closed", "total_voters", "chosen_option"] def __init__( self, *, client: "pyrogram.client.ext.BaseClient", id: int, - closed: bool, question: str, options: List[PollOption], + is_closed: bool, total_voters: int, - option_chosen: int = None + chosen_option: int = None ): super().__init__(client) self.id = id - self.closed = closed self.question = question self.options = options + self.is_closed = is_closed self.total_voters = total_voters - self.option_chosen = option_chosen + self.chosen_option = chosen_option @staticmethod def _parse(client, media_poll: types.MessageMediaPoll) -> "Poll": poll = media_poll.poll results = media_poll.results.results total_voters = media_poll.results.total_voters - option_chosen = None + chosen_option = None options = [] for i, answer in enumerate(poll.answers): - voters = 0 + voter_count = 0 if results: result = results[i] - voters = result.voters + voter_count = result.voters if result.chosen: - option_chosen = i + chosen_option = i - options.append(PollOption( - text=answer.text, - voters=voters, - data=answer.option, - client=client - )) + options.append( + PollOption( + text=answer.text, + voter_count=voter_count, + data=answer.option, + client=client + ) + ) return Poll( id=poll.id, - closed=poll.closed, question=poll.question, options=options, + is_closed=poll.closed, total_voters=total_voters, - option_chosen=option_chosen, + chosen_option=chosen_option, client=client ) diff --git a/pyrogram/client/types/messages_and_media/poll_option.py b/pyrogram/client/types/messages_and_media/poll_option.py index c45c1db2..4b32623a 100644 --- a/pyrogram/client/types/messages_and_media/poll_option.py +++ b/pyrogram/client/types/messages_and_media/poll_option.py @@ -21,32 +21,29 @@ from ..pyrogram_type import PyrogramType class PollOption(PyrogramType): - """This object represents a Poll Option. + """This object contains information about one answer option in a poll. Args: text (``str``): - Text of the poll option. + Option text, 1-100 characters. - voters (``int``): - The number of users who voted this option. - It will be 0 until you vote for the poll. - - data (``bytes``): - Unique data that identifies this option among all the other options in a poll. + voter_count (``int``): + Number of users that voted for this option. + Equals to 0 until you vote. """ - __slots__ = ["text", "voters", "data"] + __slots__ = ["text", "voter_count", "_data"] def __init__( self, *, client: "pyrogram.client.ext.BaseClient", text: str, - voters: int, + voter_count: int, data: bytes ): super().__init__(client) self.text = text - self.voters = voters - self.data = data + self.voter_count = voter_count + self._data = data # Hidden diff --git a/pyrogram/client/types/pyrogram_type.py b/pyrogram/client/types/pyrogram_type.py index af828926..5f757d43 100644 --- a/pyrogram/client/types/pyrogram_type.py +++ b/pyrogram/client/types/pyrogram_type.py @@ -51,7 +51,7 @@ def default(o: PyrogramType): return remove_none( OrderedDict( [("_", "pyrogram." + o.__class__.__name__)] - + [i for i in content.items()] + + [i for i in content.items() if not i[0].startswith("_")] ) ) except AttributeError: