class AlexaUtteranceResponder

Attributes

deviceid[RW]
invocation[R]

Public Class Methods

new(modelmds=[], reg: nil, debug: false, userid: nil, deviceid: nil) click to toggle source
# File lib/alexa_utteranceresponder.rb, line 19
def initialize(modelmds=[], reg: nil, debug: false, 
               userid: nil, deviceid: nil)
  
  @reg, @debug, @userid, @deviceid = reg, debug, userid, deviceid

  @models = modelmds.inject({}) do |r,x|
    
    amb = AlexaModelBuilder.new(x)
    r.merge(amb.invocation || amb.name => amb)
    
  end

  
end

Public Instance Methods

ask(s, userid: @userid, deviceid: @deviceid, &blk) click to toggle source
# File lib/alexa_utteranceresponder.rb, line 34
def ask(s, userid: @userid, deviceid: @deviceid, &blk)
  
  puts
  puts '  debugger: s: ' + s.inspect if @debug

  active = if @reg then
  
    puts 'reg available'.info if @debug
  
    e = @reg.get_key 'hkey_apps/alexa/accounts'
    euserid = e.xpath('*/id').find {|x| x.text.to_s == userid}
    puts 'euserid: ' + euserid.text.inspect if @debug
  
    if euserid then
      
      eactive = euserid.parent.text('active')
      puts 'eactive: ' + eactive.to_s.inspect if @debug
      
      if eactive then
        eactive.to_s.split
      else
        user = euserid.parent.name
        @reg.set_key "hkey_apps/alexa/accounts/#{user}/active", @models.keys.join(' ')
        @models.keys
      end
    end

  else
    @models.keys
  end

  invocations = active.map {|invocation| invocation.gsub(/ /,'\s') }\
      .join('|')
  puts 'invocations: ' + invocations.inspect if @debug
  
  regex = %r{

    (?<ask>(?<action>tell|ask)\s(?<invocation>#{invocations})\s(?<request>.*)){0}
    (?<open>(?<action>open)\s(?<invocation>#{invocations})){0}
    \g<ask>|\g<open>
  }x
      
  r2 = s.downcase.gsub(/,/,'').match(regex)
  
  puts '  debugger: r2: ' + r2.inspect if @debug
  puts    
  
  model_id = if r2 then
    return respond() if r2[:action] == 'open'      
    r2[:invocation]
  else
    
    puts 'searching all utterances'.info if @debug
    puts ('s: ' + s.inspect).debug if @debug
    
    
    # attempt to find the request from utterances in all skills
    active.detect do |name|

      model = @models[name]
      puts 'utterances: ' + model.utterances.map(&:downcase).inspect if @debug
      model.utterances.map(&:downcase).include? s
      
    end
          
  end
    
  return "hmmm, I don't know that one." unless model_id        

  puts ('model_id: ' + model_id.inspect).debug if @debug
  #puts '@models: ' + @models.inspect if @debug
  amb = @models[model_id]
  #puts 'amb: ' + amb.inspect if @debug
  
  aio = AskIO.new(amb.to_manifest, amb.to_model, debug: @debug, 
                    userid: @userid, deviceid: deviceid, modelid: model_id)
      
  
  request = r2 ? r2[:request] : s
  puts ('request: ' + request.inspect).debug if @debug
  r = aio.ask request, &blk
  
  r ? r : "I'm sorry I didn't understand what you said"

end
sample_utterances() click to toggle source
# File lib/alexa_utteranceresponder.rb, line 120
def sample_utterances()
  
  @models.to_a.sample(3).map do |key, model|
    
    if model.invocation then
      "tell %s, %s" % [key.capitalize, model.utterances.sample.capitalize]
    else
      "%s" % [model.utterances.sample]
    end
    
  end

end