mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 15:17:35 +00:00
Fix ended session when there isn't any response from the user (#72218)
* Fix end session when there isn't any response This PR fixes #72153 * Added test case as requested https://github.com/home-assistant/core/pull/72218#discussion_r881584812
This commit is contained in:
parent
88129dbe91
commit
beab6e2e5f
@ -127,11 +127,6 @@ async def async_handle_message(hass, message):
|
|||||||
|
|
||||||
|
|
||||||
@HANDLERS.register("SessionEndedRequest")
|
@HANDLERS.register("SessionEndedRequest")
|
||||||
async def async_handle_session_end(hass, message):
|
|
||||||
"""Handle a session end request."""
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
@HANDLERS.register("IntentRequest")
|
@HANDLERS.register("IntentRequest")
|
||||||
@HANDLERS.register("LaunchRequest")
|
@HANDLERS.register("LaunchRequest")
|
||||||
async def async_handle_intent(hass, message):
|
async def async_handle_intent(hass, message):
|
||||||
@ -151,6 +146,11 @@ async def async_handle_intent(hass, message):
|
|||||||
intent_name = (
|
intent_name = (
|
||||||
message.get("session", {}).get("application", {}).get("applicationId")
|
message.get("session", {}).get("application", {}).get("applicationId")
|
||||||
)
|
)
|
||||||
|
elif req["type"] == "SessionEndedRequest":
|
||||||
|
app_id = message.get("session", {}).get("application", {}).get("applicationId")
|
||||||
|
intent_name = f"{app_id}.{req['type']}"
|
||||||
|
alexa_response.variables["reason"] = req["reason"]
|
||||||
|
alexa_response.variables["error"] = req.get("error")
|
||||||
else:
|
else:
|
||||||
intent_name = alexa_intent_info["name"]
|
intent_name = alexa_intent_info["name"]
|
||||||
|
|
||||||
|
@ -99,11 +99,13 @@ class ScriptIntentHandler(intent.IntentHandler):
|
|||||||
speech[CONF_TYPE],
|
speech[CONF_TYPE],
|
||||||
)
|
)
|
||||||
|
|
||||||
if reprompt is not None and reprompt[CONF_TEXT].template:
|
if reprompt is not None:
|
||||||
response.async_set_reprompt(
|
text_reprompt = reprompt[CONF_TEXT].async_render(slots, parse_result=False)
|
||||||
reprompt[CONF_TEXT].async_render(slots, parse_result=False),
|
if text_reprompt:
|
||||||
reprompt[CONF_TYPE],
|
response.async_set_reprompt(
|
||||||
)
|
text_reprompt,
|
||||||
|
reprompt[CONF_TYPE],
|
||||||
|
)
|
||||||
|
|
||||||
if card is not None:
|
if card is not None:
|
||||||
response.async_set_card(
|
response.async_set_card(
|
||||||
|
@ -490,8 +490,11 @@ async def test_intent_session_ended_request(alexa_client):
|
|||||||
|
|
||||||
req = await _intent_req(alexa_client, data)
|
req = await _intent_req(alexa_client, data)
|
||||||
assert req.status == HTTPStatus.OK
|
assert req.status == HTTPStatus.OK
|
||||||
text = await req.text()
|
data = await req.json()
|
||||||
assert text == ""
|
assert (
|
||||||
|
data["response"]["outputSpeech"]["text"]
|
||||||
|
== "This intent is not yet configured within Home Assistant."
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_intent_from_built_in_intent_library(alexa_client):
|
async def test_intent_from_built_in_intent_library(alexa_client):
|
||||||
|
@ -38,6 +38,8 @@ async def test_intent_script(hass):
|
|||||||
|
|
||||||
assert response.speech["plain"]["speech"] == "Good morning Paulus"
|
assert response.speech["plain"]["speech"] == "Good morning Paulus"
|
||||||
|
|
||||||
|
assert not (response.reprompt)
|
||||||
|
|
||||||
assert response.card["simple"]["title"] == "Hello Paulus"
|
assert response.card["simple"]["title"] == "Hello Paulus"
|
||||||
assert response.card["simple"]["content"] == "Content for Paulus"
|
assert response.card["simple"]["content"] == "Content for Paulus"
|
||||||
|
|
||||||
@ -85,3 +87,49 @@ async def test_intent_script_wait_response(hass):
|
|||||||
|
|
||||||
assert response.card["simple"]["title"] == "Hello Paulus"
|
assert response.card["simple"]["title"] == "Hello Paulus"
|
||||||
assert response.card["simple"]["content"] == "Content for Paulus"
|
assert response.card["simple"]["content"] == "Content for Paulus"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_intent_script_falsy_reprompt(hass):
|
||||||
|
"""Test intent scripts work."""
|
||||||
|
calls = async_mock_service(hass, "test", "service")
|
||||||
|
|
||||||
|
await async_setup_component(
|
||||||
|
hass,
|
||||||
|
"intent_script",
|
||||||
|
{
|
||||||
|
"intent_script": {
|
||||||
|
"HelloWorld": {
|
||||||
|
"action": {
|
||||||
|
"service": "test.service",
|
||||||
|
"data_template": {"hello": "{{ name }}"},
|
||||||
|
},
|
||||||
|
"card": {
|
||||||
|
"title": "Hello {{ name }}",
|
||||||
|
"content": "Content for {{ name }}",
|
||||||
|
},
|
||||||
|
"speech": {
|
||||||
|
"type": "ssml",
|
||||||
|
"text": '<speak><amazon:effect name="whispered">Good morning {{ name }}</amazon:effect></speak>',
|
||||||
|
},
|
||||||
|
"reprompt": {"text": "{{ null }}"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
response = await intent.async_handle(
|
||||||
|
hass, "test", "HelloWorld", {"name": {"value": "Paulus"}}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert len(calls) == 1
|
||||||
|
assert calls[0].data["hello"] == "Paulus"
|
||||||
|
|
||||||
|
assert (
|
||||||
|
response.speech["ssml"]["speech"]
|
||||||
|
== '<speak><amazon:effect name="whispered">Good morning Paulus</amazon:effect></speak>'
|
||||||
|
)
|
||||||
|
|
||||||
|
assert not (response.reprompt)
|
||||||
|
|
||||||
|
assert response.card["simple"]["title"] == "Hello Paulus"
|
||||||
|
assert response.card["simple"]["content"] == "Content for Paulus"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user