Software apps and online services | ||||||
![]()  | 
  | |||||
This is game word association.
Start: ask Magical Lambda
Alexa: Welcome message... first word is banana.
You: My Answer is XXXXX.
XXXX is associated word from "banana"
Alexa: Confirming and say XXXX
You: say yes if XXXX is recognized properly. if not say again.
Alexa: next associated word from XXXX if Alexa found the word but Alexa ask you to teach associated word from XXXX if Alexa not found the word.
from __future__ import print_function
import boto3
import urllib2
from boto3.dynamodb.conditions import Key, Attr
dynamodb = boto3.resource('dynamodb')
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
    }
def update_history(base_history, new_history):
    base_history.append(new_history)
    return base_history
def get_com_answer(history, player_answer):
    table = dynamodb.Table('magical_lambda_words')
    print(player_answer)
    try:
        response = table.query(
          KeyConditionExpression=Key('word').eq(player_answer)
        )
    except:
        print("Word not found error #{player_answer}")
    print(response)
    if response['Count'] is 0:
        return None
    else:
        ng_words = [w['word'] for w in history]
        answer_candidates = [w for w in response['Items'][0]['values'] if not w in ng_words]
        print(answer_candidates)
        return answer_candidates[0] if len(answer_candidates) > 0 else None
def get_welcome_response():
    session_attributes = {}
    card_title = "Welcome"
    speech_output = "Welcome to the Magical Lambda. " \
                    "You must do the imagination game with me, " \
                    "You must imagin a word from a word I said" \
                    "The first word banana" \
    history = update_history([], {"type": "com", "word": "banana", "count": 1})
    session_attributes["history"] = history
    reprompt_text = "Let imagine a word from banana."
    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 = "Thank you for trying the Magical Lambda. "
    should_end_session = True
    return build_response({}, build_speechlet_response(
        card_title, speech_output, None, should_end_session))
def memory_player_answer(key, new_word):
    table = dynamodb.Table('magical_lambda_words')
    item = table.get_item(Key={'word':key})
    print(item)
    if item:
        item['Item']['values'] = item['Item']['values'].append(new_word)
        table.update_item(
            key={'word':key}, 
            UpdateExpression='SET values = :val1', 
            ExpressionAttributeValues={':val1': item['Item']['values']})
    else:
        table.put_item(Item={'word':key, 'values':[new_word]})
        
    return True
def associatable(from_word, to_word):
    return True
def accept_player_voice(intent, session):
    card_title = 'MagicalLambdaAcceptIntent::Accept'
    session_attributes = {}
    should_end_session = False
    if 'Answer' in intent['slots']:
        player_answer = intent['slots']['Answer']['value']
        speech_output = "Your answer is " + player_answer + "yes, if you ok, no, say again"
        reprompt_text = "Please yes or answer again"
        session_attributes["Answer"] = player_answer
        session_attributes["history"] = session['attributes']['history']
        
    else:
        speech_output = "I'm not sure what your a word is. Please try again."
        reprompt_text = "I'm not sure what your a woad is. "
    return build_response(session_attributes, build_speechlet_response(
        card_title, speech_output, reprompt_text, should_end_session))
def respond_from_com(intent, session):
    card_title = 'MagicalLambdaAnswerIntent::Answer'
    session_attributes = {}
    should_end_session = False
    if 'Confirm' in intent['slots']:
        player_respond = intent['slots']['Confirm']['value']
        if player_respond == 'yes':
            player_answer = session['attributes']['Answer']
            history = session['attributes']['history']
            previous_word = history[-1]["word"] if history[-1]["type"] == 'com' else None
            if previous_word is None:
                raise ValueError("Game could not proceeding.")
            if associatable(previous_word, player_answer):
                com_answer = get_com_answer(history, player_answer)
                if com_answer is None:
                    speech_output = "I can not imagin a associated word from a " + player_answer + "I lose. you have strong imagination. Please tell associated word."
                    reprompt_text = ""
                    session_attributes["Answer"] = player_answer
                    should_end_session = False
                else:
                    speech_output = "Your a word is " + player_answer + "." + "I imagined a " + com_answer + "." + " Please say next word."
                    reprompt_text = "Please imagin a word from " + com_answer
                    recently_player_answer = {"type":"player", "word":player_answer, "count":len(history)+1}
                    recentry_com_answer = {"type":"com", "word":com_answer, "count":len(history)+2}
                    history = update_history(history, recently_player_answer)
                    history = update_history(history, recentry_com_answer)
                    session_attributes["history"] = history
            else:
                speech_output = "Your answer is not associatable from #{previous_word}. You lose."
                reprompt_text = ""
                should_end_session = True
    else:
        speech_output = "I'm not sure what your a word is. Please try again."
        reprompt_text = "I'm not sure what your a woad is. "
    return build_response(session_attributes, build_speechlet_response(
        card_title, speech_output, reprompt_text, should_end_session))
def respond_to_teach(intent, session):
    card_title = 'MagicalLambdaTeachIntent::Teach'
    session_attributes = {}
    should_end_session = True
    if 'Word' in intent['slots']:
        keyword = session['attributes']['Answer']
        associated_word = intent['slots']['Word']
        memory_player_answer(keyword, associated_word)
        speech_output = "I remembered. Thank you."
        reprompt_text = "Please teach again"
    else:
        speech_output = "I'm not sure what your a word is. Please try again."
        reprompt_text = "I'm not sure what your a woad is. "
    return build_response(session_attributes, build_speechlet_response(
        card_title, speech_output, reprompt_text, should_end_session))
   
def on_session_started(session_started_request, session):
    print("on_session_started requestId=" + session_started_request['requestId']
          + ", sessionId=" + session['sessionId'])
def on_launch(launch_request, session):
    print("on_launch requestId=" + launch_request['requestId'] +
          ", sessionId=" + session['sessionId'])
    return get_welcome_response()
def on_intent(intent_request, session):
    print("on_intent requestId=" + intent_request['requestId'] +
          ", sessionId=" + session['sessionId'])
    intent = intent_request['intent']
    intent_name = intent_request['intent']['name']
    if intent_name == "MagicalLambdaAcceptIntent":
        return accept_player_voice(intent, session)
    elif intent_name == "MagicalLambdaAnswerIntent":
        return respond_from_com(intent, session)
    elif intent_name == "MagicalLambdaTeachIntent":
        return respond_to_teach(intent, session)
    else:
        raise ValueError("Invalid intent")
def on_session_ended(session_ended_request, session):
    print("on_session_ended requestId=" + session_ended_request['requestId'] +
          ", sessionId=" + session['sessionId'])
def lambda_handler(event, context):
    print("event.session.application.applicationId=" +
          event['session']['application']['applicationId'])
    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'])









Comments