Skip to content

Instantly share code, notes, and snippets.

@marinho
Created June 25, 2017 08:26
Show Gist options
  • Save marinho/cb91fdf7975b9d81d287f4c6f68c97b1 to your computer and use it in GitHub Desktop.
Save marinho/cb91fdf7975b9d81d287f4c6f68c97b1 to your computer and use it in GitHub Desktop.
# coding=utf-8
from __future__ import print_function
from datetime import date, datetime
# --------------- Helpers that build all of the responses ----------------------
def build_speechlet_response(title, output, reprompt_text, should_end_session):
return {
'outputSpeech': {
'type': 'PlainText',
'text': output
},
'card': {
'type': 'Simple',
'title': "SessionSpeechlet - " + title,
'content': "SessionSpeechlet - " + output
},
'reprompt': {
'outputSpeech': {
'type': 'PlainText',
'text': reprompt_text
}
},
'shouldEndSession': should_end_session
}
def build_response(session_attributes, speechlet_response):
return {
'version': '1.0',
'sessionAttributes': session_attributes,
'response': speechlet_response
}
# --------------- Functions that control the skill's behavior ------------------
def get_welcome_response():
""" If we wanted to initialize the session to have some attributes we could
add those here
"""
session_attributes = {}
card_title = "Welcome"
speech_output = u"Frage mich wann ist nächste schulferien."
reprompt_text = ""
should_end_session = False
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def handle_session_end_request():
card_title = "Session Ended"
speech_output = u"Danke für deine frage"
# Setting this to true ends the session and exits the skill.
should_end_session = True
return build_response({}, build_speechlet_response(
card_title, speech_output, None, should_end_session))
VACATIONS = (
{"start": date(2017, 7, 20), "end": date(2017, 9, 1), "label": u"Es ist Sommerferien bis Erste September"},
{"start": date(2017, 10, 2), "end": date(2017, 10, 3), "label": u"Es ist Tag der Deutschen Einheit"},
{"start": date(2017, 10, 23), "end": date(2017, 11, 4), "label": u"Es ist Herbstferien bis Vierte November"},
{"start": date(2017, 12, 21), "end": date(2018, 1, 2), "label": u"Es ist Weinachtsferien bis Zweite Januar"},
{"start": date(2018, 2, 5), "end": date(2018, 2, 9), "label": u"Es ist Winterferien bis Neunte Februar"},
{"start": date(2018, 3, 26), "end": date(2018, 4, 6), "label": u"Es ist Osterferien bis Sechste April"},
{"start": date(2018, 4, 30), "end": date(2018, 5, 1), "label": u"Es ist Pfingstferien bis Erste Mai"},
{"start": date(2018, 5, 10), "end": date(2018, 5, 10), "label": u"Es ist Christi Himmelfahrt Tag"},
{"start": date(2018, 5, 21), "end": date(2018, 5, 22), "label": u"Es ist Pfingstferien bis 22 Mai"},
{"start": date(2018, 7, 5), "end": date(2018, 8, 17), "label": u"Es ist Sommerferien bis 17 August"},
{"start": date(2018, 10, 3), "end": date(2018, 10, 3), "label": u"Es ist Tag der Deutschen Einheit"},
{"start": date(2018, 10, 22), "end": date(2018, 11, 2), "label": u"Es ist Herbstferien bis Zweite November"},
{"start": date(2018, 12, 24), "end": date(2019, 11, 4), "label": u"Es ist Weinachtsferien bis Vierte Januar"},
)
def get_vacation_label(day):
if day.weekday() in (5, 6):
return True, u"ihr habt ein Wochenende"
try:
vacation = [v for v in VACATIONS if v["start"] <= day <= v["end"]][0]
return True, vacation["label"]
except IndexError:
return False, u"Es ist ein normal schultag."
def school_open_today(intent, session):
session_attributes = {}
reprompt_text = None
day = date.today()
no, label = get_vacation_label(day)
speech_output = (u"Nein. " if no else u"Ja. ") + label
should_end_session = False
return build_response(session_attributes, build_speechlet_response(
intent['name'], speech_output, reprompt_text, should_end_session))
def is_today_vacation(intent, session):
session_attributes = {}
reprompt_text = None
day = date.today()
yes, label = get_vacation_label(day)
speech_output = (u"Ja. " if yes else u"Nein. ") + label
should_end_session = False
return build_response(session_attributes, build_speechlet_response(
intent['name'], speech_output, reprompt_text, should_end_session))
def when_is_next_vacation(intent, session):
session_attributes = {}
reprompt_text = None
day = date.today()
next_vacation = [v for v in VACATIONS if v["start"] > day][0]
next_str = next_vacation["start"].strftime("%d.%m.%Y")
speech_output = u"Die nächste ferien ist bei {0}: {1}".format(next_str, next_vacation["label"])
should_end_session = False
return build_response(session_attributes, build_speechlet_response(
intent['name'], speech_output, reprompt_text, should_end_session))
def is_day_x_vacation(intent, session):
session_attributes = {}
reprompt_text = None
day_str = intent["slots"]["Date"]["value"]
day = datetime.strptime(day_str, '%Y-%m-%d').date()
yes, label = get_vacation_label(day)
speech_output = (u"Ja. " if yes else u"Nein. ") + label
should_end_session = False
return build_response(session_attributes, build_speechlet_response(
intent['name'], speech_output, reprompt_text, should_end_session))
def is_day_x_school_open(intent, session):
session_attributes = {}
reprompt_text = None
day_str = intent["slots"]["Date"]["value"]
day = datetime.strptime(day_str, '%Y-%m-%d').date()
no, label = get_vacation_label(day)
speech_output = (u"Nein. " if no else u"Ja. ") + label
should_end_session = False
return build_response(session_attributes, build_speechlet_response(
intent['name'], speech_output, reprompt_text, should_end_session))
# --------------- Events ------------------
def on_session_started(session_started_request, session):
""" Called when the session starts """
print("on_session_started requestId=" + session_started_request['requestId']
+ ", sessionId=" + session['sessionId'])
def on_launch(launch_request, session):
""" Called when the user launches the skill without specifying what they
want
"""
print("on_launch requestId=" + launch_request['requestId'] +
", sessionId=" + session['sessionId'])
# Dispatch to your skill's launch
return get_welcome_response()
def on_intent(intent_request, session):
""" Called when the user specifies an intent for this skill """
print("on_intent requestId=" + intent_request['requestId'] +
", sessionId=" + session['sessionId'])
intent = intent_request['intent']
intent_name = intent_request['intent']['name']
# Dispatch to your skill's intent handlers
if intent_name == "AMAZON.HelpIntent":
return get_welcome_response()
elif intent_name in ("AMAZON.CancelIntent", "AMAZON.StopIntent"):
return handle_session_end_request()
elif intent_name == "SchoolOpenTodayIntent":
return school_open_today(intent, session)
elif intent_name == "IsTodayVacationIntent":
return is_today_vacation(intent, session)
elif intent_name == "WhenIsTheNextVacationIntent":
return when_is_next_vacation(intent, session)
elif intent_name == "IsDayXVacationIntent":
return is_day_x_vacation(intent, session)
elif intent_name == "IsDayXSchoolOpenIntent":
return is_day_x_school_open(intent, session)
else:
raise ValueError("Invalid intent")
def on_session_ended(session_ended_request, session):
""" Called when the user ends the session.
Is not called when the skill returns should_end_session=true
"""
print("on_session_ended requestId=" + session_ended_request['requestId'] +
", sessionId=" + session['sessionId'])
# add cleanup logic here
# --------------- Main handler ------------------
def lambda_handler(event, context):
""" Route the incoming request based on type (LaunchRequest, IntentRequest,
etc.) The JSON body of the request is provided in the event parameter.
"""
print("event.session.application.applicationId=" +
event['session']['application']['applicationId'])
"""
Uncomment this if statement and populate with your skill's application ID to
prevent someone else from configuring a skill that sends requests to this
function.
"""
# if (event['session']['application']['applicationId'] !=
# "amzn1.echo-sdk-ams.app.[unique-value-here]"):
# raise ValueError("Invalid Application ID")
if event['session']['new']:
on_session_started({'requestId': event['request']['requestId']},
event['session'])
if event['request']['type'] == "LaunchRequest":
return on_launch(event['request'], event['session'])
elif event['request']['type'] == "IntentRequest":
return on_intent(event['request'], event['session'])
elif event['request']['type'] == "SessionEndedRequest":
return on_session_ended(event['request'], event['session'])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment