"""The Matrix bot component.""" from __future__ import annotations from typing import TYPE_CHECKING import voluptuous as vol from homeassistant.components.notify import ATTR_DATA, ATTR_MESSAGE, ATTR_TARGET from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.helpers import config_validation as cv from .const import ( ATTR_FORMAT, ATTR_IMAGES, ATTR_MESSAGE_ID, ATTR_REACTION, ATTR_ROOM, ATTR_THREAD_ID, CONF_ROOMS_REGEX, DOMAIN, FORMAT_HTML, FORMAT_TEXT, SERVICE_REACT, SERVICE_SEND_MESSAGE, ) if TYPE_CHECKING: from . import MatrixBot MESSAGE_FORMATS = [FORMAT_HTML, FORMAT_TEXT] DEFAULT_MESSAGE_FORMAT = FORMAT_TEXT SERVICE_SCHEMA_SEND_MESSAGE = vol.Schema( { vol.Required(ATTR_MESSAGE): cv.string, vol.Optional(ATTR_DATA, default={}): { vol.Optional(ATTR_FORMAT, default=DEFAULT_MESSAGE_FORMAT): vol.In( MESSAGE_FORMATS ), vol.Optional(ATTR_IMAGES): vol.All(cv.ensure_list, [cv.string]), vol.Optional(ATTR_THREAD_ID): cv.string, }, vol.Required(ATTR_TARGET): vol.All( cv.ensure_list, [cv.matches_regex(CONF_ROOMS_REGEX)] ), } ) SERVICE_SCHEMA_REACT = vol.Schema( { vol.Required(ATTR_REACTION): cv.string, vol.Required(ATTR_ROOM): cv.matches_regex(CONF_ROOMS_REGEX), vol.Required(ATTR_MESSAGE_ID): cv.string, } ) async def _handle_send_message(call: ServiceCall) -> None: """Handle the send_message service call.""" matrix_bot: MatrixBot = call.hass.data[DOMAIN] await matrix_bot.handle_send_message(call) async def _handle_react(call: ServiceCall) -> None: """Handle the react service call.""" matrix_bot: MatrixBot = call.hass.data[DOMAIN] await matrix_bot.handle_send_reaction(call) @callback def async_setup_services(hass: HomeAssistant) -> None: """Set up the Matrix bot component.""" hass.services.async_register( DOMAIN, SERVICE_SEND_MESSAGE, _handle_send_message, schema=SERVICE_SCHEMA_SEND_MESSAGE, ) hass.services.async_register( DOMAIN, SERVICE_REACT, _handle_react, schema=SERVICE_SCHEMA_REACT, )