Upgrade Telegram lib, refactor component for breaking changes (#44147)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
This commit is contained in:
parent
d18c9f1c74
commit
6ffa3c18b2
5 changed files with 147 additions and 47 deletions
|
@ -553,7 +553,7 @@ class TelegramNotificationService:
|
||||||
)
|
)
|
||||||
return params
|
return params
|
||||||
|
|
||||||
def _send_msg(self, func_send, msg_error, *args_msg, **kwargs_msg):
|
def _send_msg(self, func_send, msg_error, message_tag, *args_msg, **kwargs_msg):
|
||||||
"""Send one message."""
|
"""Send one message."""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -572,7 +572,6 @@ class TelegramNotificationService:
|
||||||
ATTR_CHAT_ID: chat_id,
|
ATTR_CHAT_ID: chat_id,
|
||||||
ATTR_MESSAGEID: message_id,
|
ATTR_MESSAGEID: message_id,
|
||||||
}
|
}
|
||||||
message_tag = kwargs_msg.get(ATTR_MESSAGE_TAG)
|
|
||||||
if message_tag is not None:
|
if message_tag is not None:
|
||||||
event_data[ATTR_MESSAGE_TAG] = message_tag
|
event_data[ATTR_MESSAGE_TAG] = message_tag
|
||||||
self.hass.bus.async_fire(EVENT_TELEGRAM_SENT, event_data)
|
self.hass.bus.async_fire(EVENT_TELEGRAM_SENT, event_data)
|
||||||
|
@ -594,7 +593,17 @@ class TelegramNotificationService:
|
||||||
for chat_id in self._get_target_chat_ids(target):
|
for chat_id in self._get_target_chat_ids(target):
|
||||||
_LOGGER.debug("Send message in chat ID %s with params: %s", chat_id, params)
|
_LOGGER.debug("Send message in chat ID %s with params: %s", chat_id, params)
|
||||||
self._send_msg(
|
self._send_msg(
|
||||||
self.bot.sendMessage, "Error sending message", chat_id, text, **params
|
self.bot.send_message,
|
||||||
|
"Error sending message",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
|
chat_id,
|
||||||
|
text,
|
||||||
|
parse_mode=params[ATTR_PARSER],
|
||||||
|
disable_web_page_preview=params[ATTR_DISABLE_WEB_PREV],
|
||||||
|
disable_notification=params[ATTR_DISABLE_NOTIF],
|
||||||
|
reply_to_message_id=params[ATTR_REPLY_TO_MSGID],
|
||||||
|
reply_markup=params[ATTR_REPLYMARKUP],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
)
|
)
|
||||||
|
|
||||||
def delete_message(self, chat_id=None, **kwargs):
|
def delete_message(self, chat_id=None, **kwargs):
|
||||||
|
@ -603,7 +612,7 @@ class TelegramNotificationService:
|
||||||
message_id, _ = self._get_msg_ids(kwargs, chat_id)
|
message_id, _ = self._get_msg_ids(kwargs, chat_id)
|
||||||
_LOGGER.debug("Delete message %s in chat ID %s", message_id, chat_id)
|
_LOGGER.debug("Delete message %s in chat ID %s", message_id, chat_id)
|
||||||
deleted = self._send_msg(
|
deleted = self._send_msg(
|
||||||
self.bot.deleteMessage, "Error deleting message", chat_id, message_id
|
self.bot.delete_message, "Error deleting message", None, chat_id, message_id
|
||||||
)
|
)
|
||||||
# reduce message_id anyway:
|
# reduce message_id anyway:
|
||||||
if self._last_message_id[chat_id] is not None:
|
if self._last_message_id[chat_id] is not None:
|
||||||
|
@ -628,26 +637,41 @@ class TelegramNotificationService:
|
||||||
text = f"{title}\n{message}" if title else message
|
text = f"{title}\n{message}" if title else message
|
||||||
_LOGGER.debug("Editing message with ID %s", message_id or inline_message_id)
|
_LOGGER.debug("Editing message with ID %s", message_id or inline_message_id)
|
||||||
return self._send_msg(
|
return self._send_msg(
|
||||||
self.bot.editMessageText,
|
self.bot.edit_message_text,
|
||||||
"Error editing text message",
|
"Error editing text message",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
text,
|
text,
|
||||||
chat_id=chat_id,
|
chat_id=chat_id,
|
||||||
message_id=message_id,
|
message_id=message_id,
|
||||||
inline_message_id=inline_message_id,
|
inline_message_id=inline_message_id,
|
||||||
**params,
|
parse_mode=params[ATTR_PARSER],
|
||||||
|
disable_web_page_preview=params[ATTR_DISABLE_WEB_PREV],
|
||||||
|
reply_markup=params[ATTR_REPLYMARKUP],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
)
|
)
|
||||||
if type_edit == SERVICE_EDIT_CAPTION:
|
if type_edit == SERVICE_EDIT_CAPTION:
|
||||||
func_send = self.bot.editMessageCaption
|
return self._send_msg(
|
||||||
params[ATTR_CAPTION] = kwargs.get(ATTR_CAPTION)
|
self.bot.edit_message_caption,
|
||||||
else:
|
"Error editing message attributes",
|
||||||
func_send = self.bot.editMessageReplyMarkup
|
params[ATTR_MESSAGE_TAG],
|
||||||
|
chat_id=chat_id,
|
||||||
|
message_id=message_id,
|
||||||
|
inline_message_id=inline_message_id,
|
||||||
|
caption=kwargs.get(ATTR_CAPTION),
|
||||||
|
reply_markup=params[ATTR_REPLYMARKUP],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
|
parse_mode=params[ATTR_PARSER],
|
||||||
|
)
|
||||||
|
|
||||||
return self._send_msg(
|
return self._send_msg(
|
||||||
func_send,
|
self.bot.edit_message_reply_markup,
|
||||||
"Error editing message attributes",
|
"Error editing message attributes",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
chat_id=chat_id,
|
chat_id=chat_id,
|
||||||
message_id=message_id,
|
message_id=message_id,
|
||||||
inline_message_id=inline_message_id,
|
inline_message_id=inline_message_id,
|
||||||
**params,
|
reply_markup=params[ATTR_REPLYMARKUP],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
)
|
)
|
||||||
|
|
||||||
def answer_callback_query(
|
def answer_callback_query(
|
||||||
|
@ -662,26 +686,18 @@ class TelegramNotificationService:
|
||||||
show_alert,
|
show_alert,
|
||||||
)
|
)
|
||||||
self._send_msg(
|
self._send_msg(
|
||||||
self.bot.answerCallbackQuery,
|
self.bot.answer_callback_query,
|
||||||
"Error sending answer callback query",
|
"Error sending answer callback query",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
callback_query_id,
|
callback_query_id,
|
||||||
text=message,
|
text=message,
|
||||||
show_alert=show_alert,
|
show_alert=show_alert,
|
||||||
**params,
|
timeout=params[ATTR_TIMEOUT],
|
||||||
)
|
)
|
||||||
|
|
||||||
def send_file(self, file_type=SERVICE_SEND_PHOTO, target=None, **kwargs):
|
def send_file(self, file_type=SERVICE_SEND_PHOTO, target=None, **kwargs):
|
||||||
"""Send a photo, sticker, video, or document."""
|
"""Send a photo, sticker, video, or document."""
|
||||||
params = self._get_msg_kwargs(kwargs)
|
params = self._get_msg_kwargs(kwargs)
|
||||||
caption = kwargs.get(ATTR_CAPTION)
|
|
||||||
func_send = {
|
|
||||||
SERVICE_SEND_PHOTO: self.bot.sendPhoto,
|
|
||||||
SERVICE_SEND_STICKER: self.bot.sendSticker,
|
|
||||||
SERVICE_SEND_ANIMATION: self.bot.sendAnimation,
|
|
||||||
SERVICE_SEND_VIDEO: self.bot.sendVideo,
|
|
||||||
SERVICE_SEND_VOICE: self.bot.sendVoice,
|
|
||||||
SERVICE_SEND_DOCUMENT: self.bot.sendDocument,
|
|
||||||
}.get(file_type)
|
|
||||||
file_content = load_data(
|
file_content = load_data(
|
||||||
self.hass,
|
self.hass,
|
||||||
url=kwargs.get(ATTR_URL),
|
url=kwargs.get(ATTR_URL),
|
||||||
|
@ -691,17 +707,89 @@ class TelegramNotificationService:
|
||||||
authentication=kwargs.get(ATTR_AUTHENTICATION),
|
authentication=kwargs.get(ATTR_AUTHENTICATION),
|
||||||
verify_ssl=kwargs.get(ATTR_VERIFY_SSL),
|
verify_ssl=kwargs.get(ATTR_VERIFY_SSL),
|
||||||
)
|
)
|
||||||
|
|
||||||
if file_content:
|
if file_content:
|
||||||
for chat_id in self._get_target_chat_ids(target):
|
for chat_id in self._get_target_chat_ids(target):
|
||||||
_LOGGER.debug("Send file to chat ID %s. Caption: %s", chat_id, caption)
|
_LOGGER.debug("Sending file to chat ID %s", chat_id)
|
||||||
self._send_msg(
|
|
||||||
func_send,
|
if file_type == SERVICE_SEND_PHOTO:
|
||||||
"Error sending file",
|
self._send_msg(
|
||||||
chat_id,
|
self.bot.send_photo,
|
||||||
file_content,
|
"Error sending photo",
|
||||||
caption=caption,
|
params[ATTR_MESSAGE_TAG],
|
||||||
**params,
|
chat_id=chat_id,
|
||||||
)
|
photo=file_content,
|
||||||
|
caption=kwargs.get(ATTR_CAPTION),
|
||||||
|
disable_notification=params[ATTR_DISABLE_NOTIF],
|
||||||
|
reply_markup=params[ATTR_REPLYMARKUP],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
|
parse_mode=params[ATTR_PARSER],
|
||||||
|
)
|
||||||
|
|
||||||
|
elif file_type == SERVICE_SEND_STICKER:
|
||||||
|
self._send_msg(
|
||||||
|
self.bot.send_sticker,
|
||||||
|
"Error sending sticker",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
|
chat_id=chat_id,
|
||||||
|
sticker=file_content,
|
||||||
|
disable_notification=params[ATTR_DISABLE_NOTIF],
|
||||||
|
reply_markup=params[ATTR_REPLYMARKUP],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
|
)
|
||||||
|
|
||||||
|
elif file_type == SERVICE_SEND_VIDEO:
|
||||||
|
self._send_msg(
|
||||||
|
self.bot.send_video,
|
||||||
|
"Error sending video",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
|
chat_id=chat_id,
|
||||||
|
video=file_content,
|
||||||
|
caption=kwargs.get(ATTR_CAPTION),
|
||||||
|
disable_notification=params[ATTR_DISABLE_NOTIF],
|
||||||
|
reply_markup=params[ATTR_REPLYMARKUP],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
|
parse_mode=params[ATTR_PARSER],
|
||||||
|
)
|
||||||
|
elif file_type == SERVICE_SEND_DOCUMENT:
|
||||||
|
self._send_msg(
|
||||||
|
self.bot.send_document,
|
||||||
|
"Error sending document",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
|
chat_id=chat_id,
|
||||||
|
document=file_content,
|
||||||
|
caption=kwargs.get(ATTR_CAPTION),
|
||||||
|
disable_notification=params[ATTR_DISABLE_NOTIF],
|
||||||
|
reply_markup=params[ATTR_REPLYMARKUP],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
|
parse_mode=params[ATTR_PARSER],
|
||||||
|
)
|
||||||
|
elif file_type == SERVICE_SEND_VOICE:
|
||||||
|
self._send_msg(
|
||||||
|
self.bot.send_voice,
|
||||||
|
"Error sending voice",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
|
chat_id=chat_id,
|
||||||
|
voice=file_content,
|
||||||
|
caption=kwargs.get(ATTR_CAPTION),
|
||||||
|
disable_notification=params[ATTR_DISABLE_NOTIF],
|
||||||
|
reply_markup=params[ATTR_REPLYMARKUP],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
|
)
|
||||||
|
elif file_type == SERVICE_SEND_ANIMATION:
|
||||||
|
self._send_msg(
|
||||||
|
self.bot.send_animation,
|
||||||
|
"Error sending animation",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
|
chat_id=chat_id,
|
||||||
|
animation=file_content,
|
||||||
|
caption=kwargs.get(ATTR_CAPTION),
|
||||||
|
disable_notification=params[ATTR_DISABLE_NOTIF],
|
||||||
|
reply_markup=params[ATTR_REPLYMARKUP],
|
||||||
|
timeout=params[ATTR_TIMEOUT],
|
||||||
|
parse_mode=params[ATTR_PARSER],
|
||||||
|
)
|
||||||
|
|
||||||
file_content.seek(0)
|
file_content.seek(0)
|
||||||
else:
|
else:
|
||||||
_LOGGER.error("Can't send file with kwargs: %s", kwargs)
|
_LOGGER.error("Can't send file with kwargs: %s", kwargs)
|
||||||
|
@ -716,19 +804,23 @@ class TelegramNotificationService:
|
||||||
"Send location %s/%s to chat ID %s", latitude, longitude, chat_id
|
"Send location %s/%s to chat ID %s", latitude, longitude, chat_id
|
||||||
)
|
)
|
||||||
self._send_msg(
|
self._send_msg(
|
||||||
self.bot.sendLocation,
|
self.bot.send_location,
|
||||||
"Error sending location",
|
"Error sending location",
|
||||||
|
params[ATTR_MESSAGE_TAG],
|
||||||
chat_id=chat_id,
|
chat_id=chat_id,
|
||||||
latitude=latitude,
|
latitude=latitude,
|
||||||
longitude=longitude,
|
longitude=longitude,
|
||||||
**params,
|
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]
|
||||||
_LOGGER.debug("Leave from chat ID %s", chat_id)
|
_LOGGER.debug("Leave from chat ID %s", chat_id)
|
||||||
leaved = self._send_msg(self.bot.leaveChat, "Error leaving chat", chat_id)
|
leaved = self._send_msg(
|
||||||
|
self.bot.leave_chat, "Error leaving chat", None, chat_id
|
||||||
|
)
|
||||||
return leaved
|
return leaved
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"domain": "telegram_bot",
|
"domain": "telegram_bot",
|
||||||
"name": "Telegram bot",
|
"name": "Telegram bot",
|
||||||
"documentation": "https://www.home-assistant.io/integrations/telegram_bot",
|
"documentation": "https://www.home-assistant.io/integrations/telegram_bot",
|
||||||
"requirements": ["python-telegram-bot==11.1.0", "PySocks==1.7.1"],
|
"requirements": ["python-telegram-bot==13.1", "PySocks==1.7.1"],
|
||||||
"dependencies": ["http"],
|
"dependencies": ["http"],
|
||||||
"codeowners": []
|
"codeowners": []
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,10 @@ import logging
|
||||||
|
|
||||||
from telegram import Update
|
from telegram import Update
|
||||||
from telegram.error import NetworkError, RetryAfter, TelegramError, TimedOut
|
from telegram.error import NetworkError, RetryAfter, TelegramError, TimedOut
|
||||||
from telegram.ext import Handler, Updater
|
from telegram.ext import CallbackContext, Dispatcher, Handler, Updater
|
||||||
|
from telegram.utils.types import HandlerArg
|
||||||
|
|
||||||
from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP
|
from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP
|
||||||
from homeassistant.core import callback
|
|
||||||
|
|
||||||
from . import CONF_ALLOWED_CHAT_IDS, BaseTelegramBotEntity, initialize_bot
|
from . import CONF_ALLOWED_CHAT_IDS, BaseTelegramBotEntity, initialize_bot
|
||||||
|
|
||||||
|
@ -18,12 +18,10 @@ async def async_setup_platform(hass, config):
|
||||||
bot = initialize_bot(config)
|
bot = initialize_bot(config)
|
||||||
pol = TelegramPoll(bot, hass, config[CONF_ALLOWED_CHAT_IDS])
|
pol = TelegramPoll(bot, hass, config[CONF_ALLOWED_CHAT_IDS])
|
||||||
|
|
||||||
@callback
|
|
||||||
def _start_bot(_event):
|
def _start_bot(_event):
|
||||||
"""Start the bot."""
|
"""Start the bot."""
|
||||||
pol.start_polling()
|
pol.start_polling()
|
||||||
|
|
||||||
@callback
|
|
||||||
def _stop_bot(_event):
|
def _stop_bot(_event):
|
||||||
"""Stop the bot."""
|
"""Stop the bot."""
|
||||||
pol.stop_polling()
|
pol.stop_polling()
|
||||||
|
@ -34,15 +32,15 @@ async def async_setup_platform(hass, config):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def process_error(bot, update, error):
|
def process_error(update: Update, context: CallbackContext):
|
||||||
"""Telegram bot error handler."""
|
"""Telegram bot error handler."""
|
||||||
try:
|
try:
|
||||||
raise error
|
raise context.error
|
||||||
except (TimedOut, NetworkError, RetryAfter):
|
except (TimedOut, NetworkError, RetryAfter):
|
||||||
# Long polling timeout or connection problem. Nothing serious.
|
# Long polling timeout or connection problem. Nothing serious.
|
||||||
pass
|
pass
|
||||||
except TelegramError:
|
except TelegramError:
|
||||||
_LOGGER.error('Update "%s" caused error "%s"', update, error)
|
_LOGGER.error('Update "%s" caused error: "%s"', update, context.error)
|
||||||
|
|
||||||
|
|
||||||
def message_handler(handler):
|
def message_handler(handler):
|
||||||
|
@ -59,10 +57,17 @@ def message_handler(handler):
|
||||||
"""Check is update valid."""
|
"""Check is update valid."""
|
||||||
return isinstance(update, Update)
|
return isinstance(update, Update)
|
||||||
|
|
||||||
def handle_update(self, update, dispatcher):
|
def handle_update(
|
||||||
|
self,
|
||||||
|
update: HandlerArg,
|
||||||
|
dispatcher: Dispatcher,
|
||||||
|
check_result: object,
|
||||||
|
context: CallbackContext = None,
|
||||||
|
):
|
||||||
"""Handle update."""
|
"""Handle update."""
|
||||||
optional_args = self.collect_optional_args(dispatcher, update)
|
optional_args = self.collect_optional_args(dispatcher, update)
|
||||||
return self.callback(dispatcher.bot, update, **optional_args)
|
context.args = optional_args
|
||||||
|
return self.callback(update, context)
|
||||||
|
|
||||||
return MessageHandler()
|
return MessageHandler()
|
||||||
|
|
||||||
|
@ -89,6 +94,6 @@ class TelegramPoll(BaseTelegramBotEntity):
|
||||||
"""Stop the polling task."""
|
"""Stop the polling task."""
|
||||||
self.updater.stop()
|
self.updater.stop()
|
||||||
|
|
||||||
def process_update(self, bot, update):
|
def process_update(self, update: HandlerArg, context: CallbackContext):
|
||||||
"""Process incoming message."""
|
"""Process incoming message."""
|
||||||
self.process_message(update.to_dict())
|
self.process_message(update.to_dict())
|
||||||
|
|
|
@ -374,6 +374,9 @@ answer_callback_query:
|
||||||
show_alert:
|
show_alert:
|
||||||
description: Show a permanent notification.
|
description: Show a permanent notification.
|
||||||
example: true
|
example: true
|
||||||
|
timeout:
|
||||||
|
description: Timeout for sending the answer. Will help with timeout errors (poor internet connection, etc)
|
||||||
|
example: "1000"
|
||||||
|
|
||||||
delete_message:
|
delete_message:
|
||||||
description: Delete a previously sent message.
|
description: Delete a previously sent message.
|
||||||
|
|
|
@ -1816,7 +1816,7 @@ python-songpal==0.12
|
||||||
python-tado==0.8.1
|
python-tado==0.8.1
|
||||||
|
|
||||||
# homeassistant.components.telegram_bot
|
# homeassistant.components.telegram_bot
|
||||||
python-telegram-bot==11.1.0
|
python-telegram-bot==13.1
|
||||||
|
|
||||||
# homeassistant.components.vlc_telnet
|
# homeassistant.components.vlc_telnet
|
||||||
python-telnet-vlc==1.0.4
|
python-telnet-vlc==1.0.4
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue