1 """Services for Google Mail integration."""
3 from __future__
import annotations
5 from datetime
import datetime, timedelta
6 from typing
import TYPE_CHECKING
8 from googleapiclient.http
import HttpRequest
9 import voluptuous
as vol
21 ATTR_RESTRICT_CONTACTS,
29 from .
import GoogleMailConfigEntry
31 SERVICE_SET_VACATION =
"set_vacation"
33 SERVICE_VACATION_SCHEMA = vol.All(
34 cv.make_entity_service_schema(
36 vol.Required(ATTR_ENABLED, default=
True): cv.boolean,
37 vol.Optional(ATTR_TITLE): cv.string,
38 vol.Required(ATTR_MESSAGE): cv.string,
39 vol.Optional(ATTR_PLAIN_TEXT, default=
True): cv.boolean,
40 vol.Optional(ATTR_RESTRICT_CONTACTS): cv.boolean,
41 vol.Optional(ATTR_RESTRICT_DOMAIN): cv.boolean,
42 vol.Optional(ATTR_START): cv.date,
43 vol.Optional(ATTR_END): cv.date,
50 """Set up services for Google Mail integration."""
52 async
def extract_gmail_config_entries(
54 ) -> list[GoogleMailConfigEntry]:
58 if (entry := hass.config_entries.async_get_entry(entry_id))
59 and entry.domain == DOMAIN
62 async
def gmail_service(call: ServiceCall) ->
None:
63 """Call Google Mail service."""
64 for entry
in await extract_gmail_config_entries(call):
66 auth = entry.runtime_data
67 except AttributeError
as ex:
68 raise ValueError(f
"Config entry not loaded: {entry.entry_id}")
from ex
69 service = await auth.get_resource()
72 "enableAutoReply": call.data[ATTR_ENABLED],
73 "responseSubject": call.data.get(ATTR_TITLE),
75 if contacts := call.data.get(ATTR_RESTRICT_CONTACTS):
76 _settings[
"restrictToContacts"] = contacts
77 if domain := call.data.get(ATTR_RESTRICT_DOMAIN):
78 _settings[
"restrictToDomain"] = domain
79 if _date := call.data.get(ATTR_START):
80 _dt = datetime.combine(_date, datetime.min.time())
81 _settings[
"startTime"] = _dt.timestamp() * 1000
82 if _date := call.data.get(ATTR_END):
83 _dt = datetime.combine(_date, datetime.min.time())
84 _settings[
"endTime"] = (_dt +
timedelta(days=1)).timestamp() * 1000
85 if call.data[ATTR_PLAIN_TEXT]:
86 _settings[
"responseBodyPlainText"] = call.data[ATTR_MESSAGE]
88 _settings[
"responseBodyHtml"] = call.data[ATTR_MESSAGE]
89 settings: HttpRequest = (
92 .updateVacation(userId=ATTR_ME, body=_settings)
94 await hass.async_add_executor_job(settings.execute)
96 hass.services.async_register(
98 service=SERVICE_SET_VACATION,
99 schema=SERVICE_VACATION_SCHEMA,
100 service_func=gmail_service,
None async_setup_services(HomeAssistant hass)
set[str] async_extract_config_entry_ids(HomeAssistant hass, ServiceCall service_call, bool expand_group=True)