class AskIO

Attributes

invocation[R]
utterances[R]

Public Class Methods

new(manifest, model, debug: false, userid: nil, deviceid: nil, appid: nil, modelid: nil) click to toggle source
# File lib/askio.rb, line 15
def initialize(manifest, model, debug: false, userid: nil, 
               deviceid: nil, appid: nil, modelid: nil)

  @debug, @userid, @deviceid, @appid = debug, userid, deviceid, appid
  @modelid = modelid
  
  @locale = manifest['manifest']['publishingInformation']['locales']\
      .keys.first
  puts '@locale: ' + @locale.inspect if @debug
  
  @invocation = model['interactionModel']['languageModel']['invocationName']
  
  @utterances = model['interactionModel']['languageModel']\
                                      ['intents'].inject({}) do |r, intent|
    intent['samples'].each {|x| r[x.downcase] = intent['name']}
    r
  end

  puts '  debugger::@utterances: ' + @utterances.inspect if @debug

  @endpoint = manifest['manifest']['apis']['custom']['endpoint']['uri']

  puts '  debugger: @endpoint: ' + @endpoint.inspect if @debug
  
end

Public Instance Methods

ask(request, &blk) click to toggle source
# File lib/askio.rb, line 41
def ask(request, &blk)
  
          
  r = @utterances[request]
  puts '  debugger: r: ' + r.inspect if @debug
  puts

  if r then

    puts '  debugger: your intent is to ' + r if @debug

    respond(r, &blk)      

  end        
          
end

Private Instance Methods

post(url, h) click to toggle source
# File lib/askio.rb, line 61
def post(url, h)

  r = RestClient.post(url, h.to_json, 
                     headers={content_type: :json, accept: :json})
  JSON.parse r.body, symbolize_names: true

end
respond(intent=nil) { |modelid, symbolize| ... } click to toggle source
# File lib/askio.rb, line 69
def respond(intent=nil)

  h = {"version"=>"1.0",
   "session"=>
    {"new"=>true,
     "sessionId"=>"amzn1.echo-api.session.1",
     "application"=>
      {"applicationId"=>""},
     "user"=>
      {"userId"=>""}},
   "context"=>
    {"System"=>
      {"application"=>
        {"applicationId"=>""},
       "user"=>
        {"userId"=>""},
       "device"=>
        {"deviceId"=>"",
         "supportedInterfaces"=>{}},
       "apiEndpoint"=>"https://api.eu.amazonalexa.com",
       "apiAccessToken"=>
        "A"}},
   "request"=> {}
  }
  
  if @userid then
    h['session']['user']['userId'] = @userid
    h['context']['System']['user']['userId'] = @userid     
  end
  
  h['context']['System']['device']['deviceId'] = @deviceid if @deviceid
  
  if @appid then
    h['session']['application']['applicationId'] = @appid
    h['context']['System']['application']['applicationId'] = @appid
  end
  
  
  h['request'] = if intent then
    {
      "type"=>"IntentRequest",
      "requestId"=>"amzn1.echo-api.request.0",
      "timestamp"=>Time.now.utc.iso8601,
      "locale"=>@locale,
      "intent"=>{"name"=>intent, "confirmationStatus"=>"NONE"},
      "dialogState"=>"STARTED"
    }
  else
    {
      "type"=>"LaunchRequest",
      "requestId"=>"amzn1.echo-api.request.a",
      "timestamp"=> Time.now.utc.iso8601,
      "locale"=>@locale,
      "shouldLinkResultBeReturned"=>false
    }      
  end
  
  puts ('before post | h: ' + h.inspect).debug if @debug
  
  r = if block_given? then
  
    puts 'inside block'.info if @debug
    
    symbolize = -> (h) do

      h.inject({}) do |r,x|

        key, val = x    
        r.merge({key.to_sym => val.is_a?(Hash) ? symbolize[val] : val})

      end

    end

    yield(@modelid, symbolize[h]) 
    
  else
    
    post @endpoint, h
    
  end
  
  puts '  degbugger: r: ' + r.inspect if @debug

  speech = r[:response][:outputSpeech]
  speech[:text] || speech[:ssml]

end