Add send_poll to telegram bot (#68666)
This commit is contained in:
parent
8dd5f25da9
commit
f5d8487768
2 changed files with 107 additions and 0 deletions
|
@ -80,6 +80,12 @@ ATTR_VERIFY_SSL = "verify_ssl"
|
||||||
ATTR_TIMEOUT = "timeout"
|
ATTR_TIMEOUT = "timeout"
|
||||||
ATTR_MESSAGE_TAG = "message_tag"
|
ATTR_MESSAGE_TAG = "message_tag"
|
||||||
ATTR_CHANNEL_POST = "channel_post"
|
ATTR_CHANNEL_POST = "channel_post"
|
||||||
|
ATTR_QUESTION = "question"
|
||||||
|
ATTR_OPTIONS = "options"
|
||||||
|
ATTR_ANSWERS = "answers"
|
||||||
|
ATTR_OPEN_PERIOD = "open_period"
|
||||||
|
ATTR_IS_ANONYMOUS = "is_anonymous"
|
||||||
|
ATTR_ALLOWS_MULTIPLE_ANSWERS = "allows_multiple_answers"
|
||||||
|
|
||||||
CONF_ALLOWED_CHAT_IDS = "allowed_chat_ids"
|
CONF_ALLOWED_CHAT_IDS = "allowed_chat_ids"
|
||||||
CONF_PROXY_URL = "proxy_url"
|
CONF_PROXY_URL = "proxy_url"
|
||||||
|
@ -96,6 +102,7 @@ SERVICE_SEND_VIDEO = "send_video"
|
||||||
SERVICE_SEND_VOICE = "send_voice"
|
SERVICE_SEND_VOICE = "send_voice"
|
||||||
SERVICE_SEND_DOCUMENT = "send_document"
|
SERVICE_SEND_DOCUMENT = "send_document"
|
||||||
SERVICE_SEND_LOCATION = "send_location"
|
SERVICE_SEND_LOCATION = "send_location"
|
||||||
|
SERVICE_SEND_POLL = "send_poll"
|
||||||
SERVICE_EDIT_MESSAGE = "edit_message"
|
SERVICE_EDIT_MESSAGE = "edit_message"
|
||||||
SERVICE_EDIT_CAPTION = "edit_caption"
|
SERVICE_EDIT_CAPTION = "edit_caption"
|
||||||
SERVICE_EDIT_REPLYMARKUP = "edit_replymarkup"
|
SERVICE_EDIT_REPLYMARKUP = "edit_replymarkup"
|
||||||
|
@ -184,6 +191,19 @@ SERVICE_SCHEMA_SEND_LOCATION = BASE_SERVICE_SCHEMA.extend(
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
SERVICE_SCHEMA_SEND_POLL = vol.Schema(
|
||||||
|
{
|
||||||
|
vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [vol.Coerce(int)]),
|
||||||
|
vol.Required(ATTR_QUESTION): cv.string,
|
||||||
|
vol.Required(ATTR_OPTIONS): vol.All(cv.ensure_list, [cv.string]),
|
||||||
|
vol.Optional(ATTR_OPEN_PERIOD): cv.positive_int,
|
||||||
|
vol.Optional(ATTR_IS_ANONYMOUS, default=True): cv.boolean,
|
||||||
|
vol.Optional(ATTR_ALLOWS_MULTIPLE_ANSWERS, default=False): cv.boolean,
|
||||||
|
vol.Optional(ATTR_DISABLE_NOTIF): cv.boolean,
|
||||||
|
vol.Optional(ATTR_TIMEOUT): cv.positive_int,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
SERVICE_SCHEMA_EDIT_MESSAGE = SERVICE_SCHEMA_SEND_MESSAGE.extend(
|
SERVICE_SCHEMA_EDIT_MESSAGE = SERVICE_SCHEMA_SEND_MESSAGE.extend(
|
||||||
{
|
{
|
||||||
vol.Required(ATTR_MESSAGEID): vol.Any(
|
vol.Required(ATTR_MESSAGEID): vol.Any(
|
||||||
|
@ -246,6 +266,7 @@ SERVICE_MAP = {
|
||||||
SERVICE_SEND_VOICE: SERVICE_SCHEMA_SEND_FILE,
|
SERVICE_SEND_VOICE: SERVICE_SCHEMA_SEND_FILE,
|
||||||
SERVICE_SEND_DOCUMENT: SERVICE_SCHEMA_SEND_FILE,
|
SERVICE_SEND_DOCUMENT: SERVICE_SCHEMA_SEND_FILE,
|
||||||
SERVICE_SEND_LOCATION: SERVICE_SCHEMA_SEND_LOCATION,
|
SERVICE_SEND_LOCATION: SERVICE_SCHEMA_SEND_LOCATION,
|
||||||
|
SERVICE_SEND_POLL: SERVICE_SCHEMA_SEND_POLL,
|
||||||
SERVICE_EDIT_MESSAGE: SERVICE_SCHEMA_EDIT_MESSAGE,
|
SERVICE_EDIT_MESSAGE: SERVICE_SCHEMA_EDIT_MESSAGE,
|
||||||
SERVICE_EDIT_CAPTION: SERVICE_SCHEMA_EDIT_CAPTION,
|
SERVICE_EDIT_CAPTION: SERVICE_SCHEMA_EDIT_CAPTION,
|
||||||
SERVICE_EDIT_REPLYMARKUP: SERVICE_SCHEMA_EDIT_REPLYMARKUP,
|
SERVICE_EDIT_REPLYMARKUP: SERVICE_SCHEMA_EDIT_REPLYMARKUP,
|
||||||
|
@ -399,6 +420,10 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
||||||
await hass.async_add_executor_job(
|
await hass.async_add_executor_job(
|
||||||
partial(notify_service.send_location, **kwargs)
|
partial(notify_service.send_location, **kwargs)
|
||||||
)
|
)
|
||||||
|
elif msgtype == SERVICE_SEND_POLL:
|
||||||
|
await hass.async_add_executor_job(
|
||||||
|
partial(notify_service.send_poll, **kwargs)
|
||||||
|
)
|
||||||
elif msgtype == SERVICE_ANSWER_CALLBACK_QUERY:
|
elif msgtype == SERVICE_ANSWER_CALLBACK_QUERY:
|
||||||
await hass.async_add_executor_job(
|
await hass.async_add_executor_job(
|
||||||
partial(notify_service.answer_callback_query, **kwargs)
|
partial(notify_service.answer_callback_query, **kwargs)
|
||||||
|
@ -847,6 +872,34 @@ class TelegramNotificationService:
|
||||||
timeout=params[ATTR_TIMEOUT],
|
timeout=params[ATTR_TIMEOUT],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def send_poll(
|
||||||
|
self,
|
||||||
|
question,
|
||||||
|
options,
|
||||||
|
is_anonymous,
|
||||||
|
allows_multiple_answers,
|
||||||
|
target=None,
|
||||||
|
**kwargs,
|
||||||
|
):
|
||||||
|
"""Send a poll."""
|
||||||
|
params = self._get_msg_kwargs(kwargs)
|
||||||
|
openperiod = kwargs.get(ATTR_OPEN_PERIOD)
|
||||||
|
for chat_id in self._get_target_chat_ids(target):
|
||||||
|
_LOGGER.debug("Send poll '%s' to chat ID %s", question, chat_id)
|
||||||
|
self._send_msg(
|
||||||
|
self.bot.send_poll,
|
||||||
|
"Error sending poll",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
|
chat_id=chat_id,
|
||||||
|
question=question,
|
||||||
|
options=options,
|
||||||
|
is_anonymous=is_anonymous,
|
||||||
|
allows_multiple_answers=allows_multiple_answers,
|
||||||
|
open_period=openperiod,
|
||||||
|
disable_notification=params[ATTR_DISABLE_NOTIF],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
|
)
|
||||||
|
|
||||||
def leave_chat(self, chat_id=None):
|
def leave_chat(self, chat_id=None):
|
||||||
"""Remove bot from chat."""
|
"""Remove bot from chat."""
|
||||||
chat_id = self._get_target_chat_ids(chat_id)[0]
|
chat_id = self._get_target_chat_ids(chat_id)[0]
|
||||||
|
|
|
@ -678,6 +678,60 @@ send_location:
|
||||||
selector:
|
selector:
|
||||||
text:
|
text:
|
||||||
|
|
||||||
|
send_poll:
|
||||||
|
name: Send poll
|
||||||
|
description: Send a poll.
|
||||||
|
fields:
|
||||||
|
target:
|
||||||
|
name: Target
|
||||||
|
description: An array of pre-authorized chat_ids to send the location to. If not present, first allowed chat_id is the default.
|
||||||
|
example: "[12345, 67890] or 12345"
|
||||||
|
selector:
|
||||||
|
object:
|
||||||
|
question:
|
||||||
|
name: Question
|
||||||
|
description: Poll question, 1-300 characters
|
||||||
|
required: true
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
options:
|
||||||
|
name: Options
|
||||||
|
description: List of answer options, 2-10 strings 1-100 characters each
|
||||||
|
required: true
|
||||||
|
selector:
|
||||||
|
object:
|
||||||
|
is_anonymous:
|
||||||
|
name: Is Anonymous
|
||||||
|
description: If the poll needs to be anonymous, defaults to True
|
||||||
|
selector:
|
||||||
|
boolean:
|
||||||
|
allows_multiple_answers:
|
||||||
|
name: Allow Multiple Answers
|
||||||
|
description: If the poll allows multiple answers, defaults to False
|
||||||
|
selector:
|
||||||
|
boolean:
|
||||||
|
open_period:
|
||||||
|
name: Open Period
|
||||||
|
description: Amount of time in seconds the poll will be active after creation, 5-600.
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 5
|
||||||
|
max: 600
|
||||||
|
unit_of_measurement: seconds
|
||||||
|
disable_notification:
|
||||||
|
name: Disable notification
|
||||||
|
description: Sends the message silently. iOS users and Web users will not receive a notification, Android users will receive a notification with no sound.
|
||||||
|
selector:
|
||||||
|
boolean:
|
||||||
|
timeout:
|
||||||
|
name: Timeout
|
||||||
|
description: Timeout for send poll. Will help with timeout errors (poor internet connection, etc)
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 1
|
||||||
|
max: 3600
|
||||||
|
unit_of_measurement: seconds
|
||||||
|
|
||||||
edit_message:
|
edit_message:
|
||||||
name: Edit message
|
name: Edit message
|
||||||
description: Edit a previously sent message.
|
description: Edit a previously sent message.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue