2
0
mirror of https://github.com/pyrogram/pyrogram synced 2025-08-28 12:57:52 +00:00

Rework send_poll: add missing parameters

This commit is contained in:
Dan 2022-04-24 11:56:07 +02:00
parent 57a4897470
commit 1ae719c252
2 changed files with 141 additions and 55 deletions

View File

@ -31,13 +31,19 @@ class SendPoll:
question: str, question: str,
options: List[str], options: List[str],
is_anonymous: bool = True, is_anonymous: bool = True,
allows_multiple_answers: bool = None,
type: "enums.PollType" = enums.PollType.REGULAR, type: "enums.PollType" = enums.PollType.REGULAR,
allows_multiple_answers: bool = None,
correct_option_id: int = None, correct_option_id: int = None,
explanation: str = None,
explanation_parse_mode: "enums.ParseMode" = None,
explanation_entities: List["types.MessageEntity"] = None,
open_period: int = None,
close_date: datetime = None,
is_closed: bool = None,
disable_notification: bool = None, disable_notification: bool = None,
protect_content: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
schedule_date: datetime = None, schedule_date: datetime = None,
protect_content: bool = None,
reply_markup: Union[ reply_markup: Union[
"types.InlineKeyboardMarkup", "types.InlineKeyboardMarkup",
"types.ReplyKeyboardMarkup", "types.ReplyKeyboardMarkup",
@ -69,25 +75,49 @@ class SendPoll:
allows_multiple_answers (``bool``, *optional*): allows_multiple_answers (``bool``, *optional*):
True, if the poll allows multiple answers, ignored for polls in quiz mode. True, if the poll allows multiple answers, ignored for polls in quiz mode.
Defaults to False Defaults to False.
correct_option_id (``int``, *optional*): correct_option_id (``int``, *optional*):
0-based identifier of the correct answer option (the index of the correct option) 0-based identifier of the correct answer option, required for polls in quiz mode.
Required for polls in quiz mode.
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 with at most 2 line feeds after entities parsing.
explanation_parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles.
You can combine both syntaxes together.
explanation_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the poll explanation, which can be specified instead of
*parse_mode*.
open_period (``int``, *optional*):
Amount of time in seconds the poll will be active after creation, 5-600.
Can't be used together with *close_date*.
close_date (:py:obj:`~datetime.datetime`, *optional*):
Point in time when the poll will be automatically closed.
Must be at least 5 and no more than 600 seconds in the future.
Can't be used together with *open_period*.
is_closed (``bool``, *optional*):
Pass True, if the poll needs to be immediately closed.
This can be useful for poll preview.
disable_notification (``bool``, *optional*): disable_notification (``bool``, *optional*):
Sends the message silently. Sends the message silently.
Users will receive a notification with no sound. Users will receive a notification with no sound.
protect_content (``bool``, *optional*):
Protects the contents of the sent message from forwarding and saving.
reply_to_message_id (``int``, *optional*): reply_to_message_id (``int``, *optional*):
If the message is a reply, ID of the original message. If the message is a reply, ID of the original message.
schedule_date (:py:obj:`~datetime.datetime`, *optional*): schedule_date (:py:obj:`~datetime.datetime`, *optional*):
Date when the message will be automatically sent. Date when the message will be automatically sent.
protect_content (``bool``, *optional*):
Protects the contents of the sent message from forwarding and saving.
reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardRemove` | :obj:`~pyrogram.types.ForceReply`, *optional*): reply_markup (:obj:`~pyrogram.types.InlineKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardMarkup` | :obj:`~pyrogram.types.ReplyKeyboardRemove` | :obj:`~pyrogram.types.ForceReply`, *optional*):
Additional interface options. An object for an inline keyboard, custom reply keyboard, Additional interface options. An object for an inline keyboard, custom reply keyboard,
instructions to remove reply keyboard or to force a reply from the user. instructions to remove reply keyboard or to force a reply from the user.
@ -100,25 +130,40 @@ class SendPoll:
await app.send_poll(chat_id, "Is this a poll question?", ["Yes", "No", "Maybe"]) await app.send_poll(chat_id, "Is this a poll question?", ["Yes", "No", "Maybe"])
""" """
message, entities = (await utils.parse_text_entities(
self, explanation, explanation_parse_mode, explanation_entities
)).values()
# For some reason passing None or [] as solution_entities will lead to INPUT_CONSTRUCTOR_INVALID_00
# Add a dummy message entity with no length as workaround
solution = message or None
solution_entities = entities or ([raw.types.MessageEntityBold(offset=0, length=0)] if solution else None)
r = await self.invoke( r = await self.invoke(
raw.functions.messages.SendMedia( raw.functions.messages.SendMedia(
peer=await self.resolve_peer(chat_id), peer=await self.resolve_peer(chat_id),
media=raw.types.InputMediaPoll( media=raw.types.InputMediaPoll(
poll=raw.types.Poll( poll=raw.types.Poll(
id=0, id=self.rnd_id(),
question=question, question=question,
answers=[ answers=[
raw.types.PollAnswer(text=o, option=bytes([i])) raw.types.PollAnswer(text=text, option=bytes([i]))
for i, o in enumerate(options) for i, text in enumerate(options)
], ],
multiple_choice=allows_multiple_answers or None, closed=is_closed,
public_voters=not is_anonymous or None, public_voters=not is_anonymous,
quiz=type == enums.PollType.QUIZ or None multiple_choice=allows_multiple_answers,
quiz=type == enums.PollType.QUIZ or False,
close_period=open_period,
close_date=utils.datetime_to_timestamp(close_date)
), ),
correct_answers=None if correct_option_id is None else [bytes([correct_option_id])] correct_answers=[bytes([correct_option_id])] if correct_option_id is not None else None,
solution=solution,
solution_entities=solution_entities
), ),
message="", message="",
silent=disable_notification or None, silent=disable_notification,
reply_to_msg_id=reply_to_message_id, reply_to_msg_id=reply_to_message_id,
random_id=self.rnd_id(), random_id=self.rnd_id(),
schedule_date=utils.datetime_to_timestamp(schedule_date), schedule_date=utils.datetime_to_timestamp(schedule_date),

View File

@ -951,7 +951,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1088,7 +1088,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1227,7 +1227,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1319,7 +1319,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1441,7 +1441,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1577,7 +1577,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1655,7 +1655,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1719,7 +1719,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1793,7 +1793,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1856,7 +1856,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1972,7 +1972,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -1995,12 +1995,19 @@ class Message(Object, Update):
self, self,
question: str, question: str,
options: List[str], options: List[str],
quote: bool = None,
is_anonymous: bool = True, is_anonymous: bool = True,
type: "enums.PollType" = enums.PollType.REGULAR,
allows_multiple_answers: bool = None, allows_multiple_answers: bool = None,
type: str = "regular",
correct_option_id: int = None, correct_option_id: int = None,
explanation: str = None,
explanation_parse_mode: "enums.ParseMode" = None,
explanation_entities: List["types.MessageEntity"] = None,
open_period: int = None,
close_date: datetime = None,
is_closed: bool = None,
quote: bool = None,
disable_notification: bool = None, disable_notification: bool = None,
protect_content: bool = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
schedule_date: datetime = None, schedule_date: datetime = None,
reply_markup: Union[ reply_markup: Union[
@ -2029,39 +2036,66 @@ class Message(Object, Update):
Parameters: Parameters:
question (``str``): question (``str``):
The poll question, as string. Poll question, 1-255 characters.
options (List of ``str``): 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.
is_anonymous (``bool``, *optional*):
True, if the poll needs to be anonymous.
Defaults to True.
type (:obj`~pyrogram.enums.PollType`, *optional*):
Poll type, :obj:`~pyrogram.enums.PollType.QUIZ` or :obj:`~pyrogram.enums.PollType.REGULAR`.
Defaults to :obj:`~pyrogram.enums.PollType.REGULAR`.
allows_multiple_answers (``bool``, *optional*):
True, if the poll allows multiple answers, ignored for polls in quiz mode.
Defaults to False.
correct_option_id (``int``, *optional*):
0-based identifier of the correct answer option, required for polls in quiz mode.
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 with at most 2 line feeds after entities parsing.
explanation_parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles.
You can combine both syntaxes together.
explanation_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the poll explanation, which can be specified instead of
*parse_mode*.
open_period (``int``, *optional*):
Amount of time in seconds the poll will be active after creation, 5-600.
Can't be used together with *close_date*.
close_date (:py:obj:`~datetime.datetime`, *optional*):
Point in time when the poll will be automatically closed.
Must be at least 5 and no more than 600 seconds in the future.
Can't be used together with *open_period*.
is_closed (``bool``, *optional*):
Pass True, if the poll needs to be immediately closed.
This can be useful for poll preview.
quote (``bool``, *optional*): quote (``bool``, *optional*):
If ``True``, the message will be sent as a reply to this message. If ``True``, the message will be sent as a reply to this message.
If *reply_to_message_id* is passed, this parameter will be ignored. If *reply_to_message_id* is passed, this parameter will be ignored.
Defaults to ``True`` in group chats and ``False`` in private chats. Defaults to ``True`` in group chats and ``False`` in private chats.
is_anonymous (``bool``, *optional*):
True, if the poll needs to be anonymous.
Defaults to True.
type (``str``, *optional*):
Poll type, "quiz" or "regular".
Defaults to "regular"
allows_multiple_answers (``bool``, *optional*):
True, if the poll allows multiple answers, ignored for polls in quiz mode.
Defaults to False
correct_option_id (``int``, *optional*):
0-based identifier of the correct answer option (the index of the correct option)
Required for polls in quiz mode.
disable_notification (``bool``, *optional*): disable_notification (``bool``, *optional*):
Sends the message silently. Sends the message silently.
Users will receive a notification with no sound. Users will receive a notification with no sound.
protect_content (``bool``, *optional*):
Protects the contents of the sent message from forwarding and saving.
reply_to_message_id (``int``, *optional*): reply_to_message_id (``int``, *optional*):
If the message is a reply, ID of the original message. If the message is a reply, ID of the original message.
schedule_date (:py:obj:`~datetime.datetime`, *optional*): schedule_date (:py:obj:`~datetime.datetime`, *optional*):
Date when the message will be automatically sent. Date when the message will be automatically sent.
@ -2076,7 +2110,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -2086,10 +2120,17 @@ class Message(Object, Update):
question=question, question=question,
options=options, options=options,
is_anonymous=is_anonymous, is_anonymous=is_anonymous,
allows_multiple_answers=allows_multiple_answers,
type=type, type=type,
allows_multiple_answers=allows_multiple_answers,
correct_option_id=correct_option_id, correct_option_id=correct_option_id,
explanation=explanation,
explanation_parse_mode=explanation_parse_mode,
explanation_entities=explanation_entities,
open_period=open_period,
close_date=close_date,
is_closed=is_closed,
disable_notification=disable_notification, disable_notification=disable_notification,
protect_content=protect_content,
reply_to_message_id=reply_to_message_id, reply_to_message_id=reply_to_message_id,
schedule_date=schedule_date, schedule_date=schedule_date,
reply_markup=reply_markup reply_markup=reply_markup
@ -2180,7 +2221,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -2275,7 +2316,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -2420,7 +2461,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -2544,7 +2585,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id
@ -2664,7 +2705,7 @@ class Message(Object, Update):
RPCError: In case of a Telegram RPC error. RPCError: In case of a Telegram RPC error.
""" """
if quote is None: if quote is None:
quote = self.chat.type != "private" quote = self.chat.type != enums.ChatType.PRIVATE
if reply_to_message_id is None and quote: if reply_to_message_id is None and quote:
reply_to_message_id = self.id reply_to_message_id = self.id