mirror of
https://github.com/pyrogram/pyrogram
synced 2025-08-29 13:27:47 +00:00
Refactor Poll types and methods to reflect Bot API 4.2 docs
This commit is contained in:
parent
605b5f1b0f
commit
4661fb035b
@ -16,7 +16,7 @@
|
||||
# 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 .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,
|
||||
|
@ -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 <pyrogram.Poll>` with the retracted vote is returned.
|
||||
|
||||
Raises:
|
||||
:class:`RPCError <pyrogram.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])
|
||||
|
@ -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.
|
||||
|
@ -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 <pyrogram.Poll>` with the final results is returned.
|
||||
|
||||
Raises:
|
||||
:class:`RPCError <pyrogram.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])
|
@ -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 <pyrogram.Poll>` with the chosen option is returned.
|
||||
|
||||
Raises:
|
||||
:class:`RPCError <pyrogram.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])
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user