Add entities to send_poll

This commit is contained in:
KurimuzonAkuma 2024-06-01 21:14:36 +03:00
parent f3951b7aa6
commit 6ec6d68ee6
3 changed files with 130 additions and 41 deletions

View File

@ -32,30 +32,36 @@ class SendPoll:
options: List[str], options: List[str],
is_anonymous: bool = True, is_anonymous: bool = True,
type: "enums.PollType" = enums.PollType.REGULAR, type: "enums.PollType" = enums.PollType.REGULAR,
allows_multiple_answers: bool = None, allows_multiple_answers: Optional[bool] = None,
correct_option_id: int = None, correct_option_id: Optional[int] = None,
explanation: str = None, question_parse_mode: Optional["enums.ParseMode"] = None,
explanation_entities: List["types.MessageEntity"] = None, question_entities: Optional[List["types.MessageEntity"]] = None,
open_period: int = None, explanation: Optional[str] = None,
close_date: datetime = None, explanation_parse_mode: Optional["enums.ParseMode"] = None,
is_closed: bool = None, explanation_entities: Optional[List["types.MessageEntity"]] = None,
disable_notification: bool = None, open_period: Optional[int] = None,
protect_content: bool = None, close_date: Optional[datetime] = None,
message_thread_id: int = None, is_closed: Optional[bool] = None,
effect_id: int = None, disable_notification: Optional[bool] = None,
reply_to_message_id: int = None, protect_content: Optional[bool] = None,
reply_to_chat_id: Union[int, str] = None, message_thread_id: Optional[int] = None,
parse_mode: Optional["enums.ParseMode"] = None, effect_id: Optional[int] = None,
quote_text: str = None, reply_to_message_id: Optional[int] = None,
quote_entities: List["types.MessageEntity"] = None, reply_to_chat_id: Optional[Union[int, str]] = None,
quote_offset: int = None, quote_text: Optional[str] = None,
schedule_date: datetime = None, quote_parse_mode: Optional["enums.ParseMode"] = None,
business_connection_id: str = None, quote_entities: Optional[List["types.MessageEntity"]] = None,
reply_markup: Union[ quote_offset: Optional[int] = None,
schedule_date: Optional[datetime] = None,
business_connection_id: Optional[str] = None,
options_parse_mode: Optional["enums.ParseMode"] = None,
reply_markup: Optional[
Union[
"types.InlineKeyboardMarkup", "types.InlineKeyboardMarkup",
"types.ReplyKeyboardMarkup", "types.ReplyKeyboardMarkup",
"types.ReplyKeyboardRemove", "types.ReplyKeyboardRemove",
"types.ForceReply" "types.ForceReply"
]
] = None ] = None
) -> "types.Message": ) -> "types.Message":
"""Send a new poll. """Send a new poll.
@ -89,10 +95,22 @@ class SendPoll:
correct_option_id (``int``, *optional*): correct_option_id (``int``, *optional*):
0-based identifier of the correct answer option, required for polls in quiz mode. 0-based identifier of the correct answer option, required for polls in quiz mode.
question_parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles.
You can combine both syntaxes together.
question_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the poll question, which can be specified instead of
*parse_mode*.
explanation (``str``, *optional*): explanation (``str``, *optional*):
Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style 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. 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`): explanation_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the poll explanation, which can be specified instead of List of special entities that appear in the poll explanation, which can be specified instead of
*parse_mode*. *parse_mode*.
@ -134,7 +152,7 @@ class SendPoll:
quote_text (``str``, *optional*): quote_text (``str``, *optional*):
Text of the quote to be sent. Text of the quote to be sent.
parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): quote_parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles. By default, texts are parsed using both Markdown and HTML styles.
You can combine both syntaxes together. You can combine both syntaxes together.
@ -150,6 +168,10 @@ class SendPoll:
business_connection_id (``str``, *optional*): business_connection_id (``str``, *optional*):
Unique identifier of the business connection on behalf of which the message will be sent. Unique identifier of the business connection on behalf of which the message will be sent.
options_parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles.
You can combine both syntaxes together.
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.
@ -162,14 +184,32 @@ 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"])
""" """
question, question_entities = (await utils.parse_text_entities(
self, question, question_parse_mode, question_entities
)).values()
solution, solution_entities = (await utils.parse_text_entities( solution, solution_entities = (await utils.parse_text_entities(
self, explanation, parse_mode, explanation_entities self, explanation, explanation_parse_mode, explanation_entities
)).values() )).values()
quote_text, quote_entities = (await utils.parse_text_entities( quote_text, quote_entities = (await utils.parse_text_entities(
self, quote_text, parse_mode, quote_entities self, quote_text, quote_parse_mode, quote_entities
)).values() )).values()
answers = []
for i, opt in enumerate(options):
option, option_entities = (await utils.parse_text_entities(
self, opt, options_parse_mode, None
)).values()
answers.append(
raw.types.PollAnswer(
text=raw.types.TextWithEntities(text=option, entities=option_entities or []),
option=bytes([i]),
)
)
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),
@ -178,15 +218,9 @@ class SendPoll:
id=self.rnd_id(), id=self.rnd_id(),
question=raw.types.TextWithEntities( question=raw.types.TextWithEntities(
text=question, text=question,
entities=[] entities=question_entities or []
), ),
answers=[ answers=answers,
raw.types.PollAnswer(
text=raw.types.TextWithEntities(text=text, entities=[]),
option=bytes([i]),
)
for i, text in enumerate(options)
],
closed=is_closed, closed=is_closed,
public_voters=not is_anonymous, public_voters=not is_anonymous,
multiple_choice=allows_multiple_answers, multiple_choice=allows_multiple_answers,

View File

@ -2758,6 +2758,8 @@ class Message(Object, Update):
type: "enums.PollType" = enums.PollType.REGULAR, type: "enums.PollType" = enums.PollType.REGULAR,
allows_multiple_answers: bool = None, allows_multiple_answers: bool = None,
correct_option_id: int = None, correct_option_id: int = None,
question_parse_mode: Optional["enums.ParseMode"] = None,
question_entities: Optional[List["types.MessageEntity"]] = None,
explanation: str = None, explanation: str = None,
explanation_parse_mode: "enums.ParseMode" = None, explanation_parse_mode: "enums.ParseMode" = None,
explanation_entities: List["types.MessageEntity"] = None, explanation_entities: List["types.MessageEntity"] = None,
@ -2771,10 +2773,12 @@ class Message(Object, Update):
effect_id: int = None, effect_id: int = None,
reply_to_message_id: int = None, reply_to_message_id: int = None,
quote_text: str = None, quote_text: str = None,
parse_mode: Optional["enums.ParseMode"] = None, quote_parse_mode: Optional["enums.ParseMode"] = None,
quote_entities: List["types.MessageEntity"] = None, quote_entities: List["types.MessageEntity"] = None,
quote_offset: Optional[int] = None,
schedule_date: datetime = None, schedule_date: datetime = None,
business_connection_id: str = None, business_connection_id: str = None,
options_parse_mode: List["types.MessageEntity"] = None,
reply_markup: Union[ reply_markup: Union[
"types.InlineKeyboardMarkup", "types.InlineKeyboardMarkup",
"types.ReplyKeyboardMarkup", "types.ReplyKeyboardMarkup",
@ -2821,6 +2825,14 @@ class Message(Object, Update):
correct_option_id (``int``, *optional*): correct_option_id (``int``, *optional*):
0-based identifier of the correct answer option, required for polls in quiz mode. 0-based identifier of the correct answer option, required for polls in quiz mode.
question_parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles.
You can combine both syntaxes together.
question_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in the poll question, which can be specified instead of
*parse_mode*.
explanation (``str``, *optional*): explanation (``str``, *optional*):
Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style 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. poll, 0-200 characters with at most 2 line feeds after entities parsing.
@ -2872,16 +2884,26 @@ class Message(Object, Update):
quote_text (``str``): quote_text (``str``):
Text of the quote to be sent. Text of the quote to be sent.
parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*): quote_parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles. By default, texts are parsed using both Markdown and HTML styles.
You can combine both syntaxes together. You can combine both syntaxes together.
quote_entities (List of :obj:`~pyrogram.types.MessageEntity`): quote_entities (List of :obj:`~pyrogram.types.MessageEntity`):
List of special entities that appear in quote text, which can be specified instead of *parse_mode*. List of special entities that appear in quote text, which can be specified instead of *parse_mode*.
quote_offset (``int``, *optional*):
Offset for quote in 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.
business_connection_id (``str``, *optional*):
Unique identifier of the business connection on behalf of which the message will be sent.
options_parse_mode (:obj:`~pyrogram.enums.ParseMode`, *optional*):
By default, texts are parsed using both Markdown and HTML styles.
You can combine both syntaxes together.
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.
@ -2912,6 +2934,8 @@ class Message(Object, Update):
type=type, type=type,
allows_multiple_answers=allows_multiple_answers, allows_multiple_answers=allows_multiple_answers,
correct_option_id=correct_option_id, correct_option_id=correct_option_id,
question_parse_mode=question_parse_mode,
question_entities=question_entities,
explanation=explanation, explanation=explanation,
explanation_parse_mode=explanation_parse_mode, explanation_parse_mode=explanation_parse_mode,
explanation_entities=explanation_entities, explanation_entities=explanation_entities,
@ -2924,10 +2948,12 @@ class Message(Object, Update):
effect_id=effect_id, effect_id=effect_id,
reply_to_message_id=reply_to_message_id, reply_to_message_id=reply_to_message_id,
quote_text=quote_text, quote_text=quote_text,
parse_mode=parse_mode, quote_parse_mode=quote_parse_mode,
quote_entities=quote_entities, quote_entities=quote_entities,
quote_offset=quote_offset,
schedule_date=schedule_date, schedule_date=schedule_date,
business_connection_id=business_connection_id, business_connection_id=business_connection_id,
options_parse_mode=options_parse_mode,
reply_markup=reply_markup reply_markup=reply_markup
) )

View File

@ -20,12 +20,12 @@ from datetime import datetime
from typing import List, Union, Optional from typing import List, Union, Optional
import pyrogram import pyrogram
from pyrogram.types.messages_and_media.message import Str
from pyrogram import raw, enums, utils from pyrogram import raw, enums, utils
from pyrogram import types from pyrogram import types
from ..object import Object from ..object import Object
from ..update import Update from ..update import Update
class Poll(Object, Update): class Poll(Object, Update):
"""A Poll. """A Poll.
@ -62,6 +62,9 @@ class Poll(Object, Update):
Available only for polls in the quiz mode, which are closed, or was sent (not forwarded) by the bot or to 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. the private chat with the bot.
question_entities (List of :obj:`~pyrogram.types.MessageEntity`, *optional*):
Special entities like usernames, URLs, bot commands, etc. that appear in the question.
explanation (``str``, *optional*): 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, 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. 0-200 characters.
@ -90,6 +93,7 @@ class Poll(Object, Update):
allows_multiple_answers: bool = None, allows_multiple_answers: bool = None,
chosen_option_id: Optional[int] = None, chosen_option_id: Optional[int] = None,
correct_option_id: Optional[int] = None, correct_option_id: Optional[int] = None,
question_entities: Optional[List["types.MessageEntity"]] = None,
explanation: Optional[str] = None, explanation: Optional[str] = None,
explanation_entities: Optional[List["types.MessageEntity"]] = None, explanation_entities: Optional[List["types.MessageEntity"]] = None,
open_period: Optional[int] = None, open_period: Optional[int] = None,
@ -107,6 +111,7 @@ class Poll(Object, Update):
self.allows_multiple_answers = allows_multiple_answers self.allows_multiple_answers = allows_multiple_answers
self.chosen_option_id = chosen_option_id self.chosen_option_id = chosen_option_id
self.correct_option_id = correct_option_id self.correct_option_id = correct_option_id
self.question_entities = question_entities
self.explanation = explanation self.explanation = explanation
self.explanation_entities = explanation_entities self.explanation_entities = explanation_entities
self.open_period = open_period self.open_period = open_period
@ -137,7 +142,17 @@ class Poll(Object, Update):
options.append( options.append(
types.PollOption( types.PollOption(
text=answer.text.text, text=Str(answer.text.text).init(
types.List(
filter(
lambda x: x is not None,
[
types.MessageEntity._parse(client, entity, {})
for entity in (answer.text.entities or [])
]
)
)
),
voter_count=voter_count, voter_count=voter_count,
data=answer.option, data=answer.option,
client=client client=client
@ -146,7 +161,17 @@ class Poll(Object, Update):
return Poll( return Poll(
id=str(poll.id), id=str(poll.id),
question=poll.question.text, question=Str(poll.question.text).init(
types.List(
filter(
lambda x: x is not None,
[
types.MessageEntity._parse(client, entity, {})
for entity in (poll.question.entities or [])
]
)
)
),
options=options, options=options,
total_voter_count=media_poll.results.total_voters, total_voter_count=media_poll.results.total_voters,
is_closed=poll.closed, is_closed=poll.closed,
@ -155,6 +180,10 @@ class Poll(Object, Update):
allows_multiple_answers=poll.multiple_choice, allows_multiple_answers=poll.multiple_choice,
chosen_option_id=chosen_option_id, chosen_option_id=chosen_option_id,
correct_option_id=correct_option_id, correct_option_id=correct_option_id,
question_entities=[
types.MessageEntity._parse(client, i, {})
for i in poll.question.entities
] if poll.question.entities else None,
explanation=poll_results.solution, explanation=poll_results.solution,
explanation_entities=[ explanation_entities=[
types.MessageEntity._parse(client, i, {}) types.MessageEntity._parse(client, i, {})