mirror of
https://github.com/pyrogram/pyrogram
synced 2025-08-28 21:07:59 +00:00
Update poll parsing
This commit is contained in:
parent
8490cfa0a9
commit
f9aacd814a
@ -827,7 +827,8 @@ class Message(Object, Update):
|
||||
except MessageIdsEmpty:
|
||||
pass
|
||||
|
||||
client.message_cache[(parsed_message.chat.id, parsed_message.id)] = parsed_message
|
||||
if not parsed_message.poll: # Do not cache poll messages
|
||||
client.message_cache[(parsed_message.chat.id, parsed_message.id)] = parsed_message
|
||||
|
||||
return parsed_message
|
||||
|
||||
|
@ -16,10 +16,11 @@
|
||||
# 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 List, Union
|
||||
from datetime import datetime
|
||||
from typing import List, Union, Optional
|
||||
|
||||
import pyrogram
|
||||
from pyrogram import raw, enums
|
||||
from pyrogram import raw, enums, utils
|
||||
from pyrogram import types
|
||||
from ..object import Object
|
||||
from ..update import Update
|
||||
@ -53,8 +54,26 @@ class Poll(Object, Update):
|
||||
allows_multiple_answers (``bool``, *optional*):
|
||||
True, if the poll allows multiple answers.
|
||||
|
||||
chosen_option (``int``, *optional*):
|
||||
Index of your chosen option (0-9), None in case you haven't voted yet.
|
||||
chosen_option_id (``int``, *optional*):
|
||||
0-based index of the chosen option), None in case of no vote yet.
|
||||
|
||||
correct_option_id (``int``, *optional*):
|
||||
0-based identifier of the correct answer option.
|
||||
Available only for polls in the quiz mode, which are closed, or was sent (not forwarded) by the bot or to
|
||||
the private chat with the bot.
|
||||
|
||||
explanation (``str``, *optional*):
|
||||
Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll,
|
||||
0-200 characters.
|
||||
|
||||
explanation_entities (List of :obj:`~pyrogram.types.MessageEntity`, *optional*):
|
||||
Special entities like usernames, URLs, bot commands, etc. that appear in the explanation.
|
||||
|
||||
open_period (``int``, *optional*):
|
||||
Amount of time in seconds the poll will be active after creation.
|
||||
|
||||
close_date (:py:obj:`~datetime.datetime`, *optional*):
|
||||
Point in time when the poll will be automatically closed.
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
@ -69,8 +88,12 @@ class Poll(Object, Update):
|
||||
is_anonymous: bool = None,
|
||||
type: "enums.PollType" = None,
|
||||
allows_multiple_answers: bool = None,
|
||||
# correct_option_id: int,
|
||||
chosen_option: int = None
|
||||
chosen_option_id: Optional[int] = None,
|
||||
correct_option_id: Optional[int] = None,
|
||||
explanation: Optional[str] = None,
|
||||
explanation_entities: Optional[List["types.MessageEntity"]] = None,
|
||||
open_period: Optional[int] = None,
|
||||
close_date: Optional[datetime] = None
|
||||
):
|
||||
super().__init__(client)
|
||||
|
||||
@ -82,14 +105,21 @@ class Poll(Object, Update):
|
||||
self.is_anonymous = is_anonymous
|
||||
self.type = type
|
||||
self.allows_multiple_answers = allows_multiple_answers
|
||||
# self.correct_option_id = correct_option_id
|
||||
self.chosen_option = chosen_option
|
||||
self.chosen_option_id = chosen_option_id
|
||||
self.correct_option_id = correct_option_id
|
||||
self.explanation = explanation
|
||||
self.explanation_entities = explanation_entities
|
||||
self.open_period = open_period
|
||||
self.close_date = close_date
|
||||
|
||||
@staticmethod
|
||||
def _parse(client, media_poll: Union["raw.types.MessageMediaPoll", "raw.types.UpdateMessagePoll"]) -> "Poll":
|
||||
poll = media_poll.poll # type: raw.types.Poll
|
||||
results = media_poll.results.results
|
||||
chosen_option = None
|
||||
poll: raw.types.Poll = media_poll.poll
|
||||
poll_results: raw.types.PollResults = media_poll.results
|
||||
results: List[raw.types.PollAnswerVoters] = poll_results.results
|
||||
|
||||
chosen_option_id = None
|
||||
correct_option_id = None
|
||||
options = []
|
||||
|
||||
for i, answer in enumerate(poll.answers):
|
||||
@ -100,7 +130,10 @@ class Poll(Object, Update):
|
||||
voter_count = result.voters
|
||||
|
||||
if result.chosen:
|
||||
chosen_option = i
|
||||
chosen_option_id = i
|
||||
|
||||
if result.correct:
|
||||
correct_option_id = i
|
||||
|
||||
options.append(
|
||||
types.PollOption(
|
||||
@ -120,7 +153,15 @@ class Poll(Object, Update):
|
||||
is_anonymous=not poll.public_voters,
|
||||
type=enums.PollType.QUIZ if poll.quiz else enums.PollType.REGULAR,
|
||||
allows_multiple_answers=poll.multiple_choice,
|
||||
chosen_option=chosen_option,
|
||||
chosen_option_id=chosen_option_id,
|
||||
correct_option_id=correct_option_id,
|
||||
explanation=poll_results.solution,
|
||||
explanation_entities=[
|
||||
types.MessageEntity._parse(client, i, {})
|
||||
for i in poll_results.solution_entities
|
||||
] if poll_results.solution_entities else None,
|
||||
open_period=poll.close_period,
|
||||
close_date=utils.timestamp_to_datetime(poll.close_date),
|
||||
client=client
|
||||
)
|
||||
|
||||
@ -130,12 +171,16 @@ class Poll(Object, Update):
|
||||
return Poll._parse(client, update)
|
||||
|
||||
results = update.results.results
|
||||
chosen_option = None
|
||||
chosen_option_id = None
|
||||
correct_option_id = None
|
||||
options = []
|
||||
|
||||
for i, result in enumerate(results):
|
||||
if result.chosen:
|
||||
chosen_option = i
|
||||
chosen_option_id = i
|
||||
|
||||
if result.correct:
|
||||
correct_option_id = i
|
||||
|
||||
options.append(
|
||||
types.PollOption(
|
||||
@ -152,6 +197,7 @@ class Poll(Object, Update):
|
||||
options=options,
|
||||
total_voter_count=update.results.total_voters,
|
||||
is_closed=False,
|
||||
chosen_option=chosen_option,
|
||||
chosen_option_id=chosen_option_id,
|
||||
correct_option_id=correct_option_id,
|
||||
client=client
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user