class GoogleAssistant::Assistant

Constants

InvalidInputPrompt
InvalidIntent
InvalidMessage
InvalidPermission
InvalidPermissionContext
MissingRequestInputs
MissingRequestIntent

Attributes

params[R]
response[R]

Public Class Methods

new(params, response) click to toggle source
# File lib/google_assistant/assistant.rb, line 17
def initialize(params, response)
  @params = params
  @response = response
end

Public Instance Methods

arguments() click to toggle source
# File lib/google_assistant/assistant.rb, line 34
def arguments
  @_arguments ||= inputs[0]["arguments"].map do |argument|
    Argument.from(argument)
  end
end
ask(prompt:, no_input_prompt: []) click to toggle source
# File lib/google_assistant/assistant.rb, line 73
def ask(prompt:, no_input_prompt: [])
  raise InvalidInputPrompt if prompt.nil? || prompt.empty?

  no_input_prompt = [*no_input_prompt].compact
  prompt = build_input_prompt(prompt, no_input_prompt)
  expected_intent = build_expected_intent(StandardIntents::TEXT)

  build_ask_response(prompt, expected_intent)
end
ask_for_permission(context:, permissions:) click to toggle source
# File lib/google_assistant/assistant.rb, line 83
def ask_for_permission(context:, permissions:)
  raise InvalidPermissionContext if context.nil? || context.empty?

  permissions = [*permissions].compact
  raise InvalidPermission unless Permission.valid?(permissions)
  raise InvalidPermission if permissions.size == 0

  prompt = build_input_prompt("placeholder for permission")
  expected_intent = build_expected_intent(StandardIntents::PERMISSION, permissions, context)

  build_ask_response(prompt, expected_intent)
end
conversation() click to toggle source
# File lib/google_assistant/assistant.rb, line 47
def conversation
  @_conversation ||= Conversation.new(conversation_params)
end
device() click to toggle source
# File lib/google_assistant/assistant.rb, line 55
def device
  @_device ||= Device.new(device_params)
end
intent() click to toggle source
# File lib/google_assistant/assistant.rb, line 30
def intent
  @_intent ||= Intent.new(intent_string)
end
permission_granted?() click to toggle source
# File lib/google_assistant/assistant.rb, line 40
def permission_granted?
  arguments.any? do |argument|
    argument.is_a?(PermissionArgument) &&
      argument.permission_granted?
  end
end
respond_to() { |self| ... } click to toggle source
# File lib/google_assistant/assistant.rb, line 22
def respond_to(&block)
  yield(self)

  response.headers["Google-Assistant-API-Version"] = "v1"

  intent.call
end
tell(message) click to toggle source
# File lib/google_assistant/assistant.rb, line 59
def tell(message)
  raise InvalidMessage if message.nil? || message.empty?

  final_response = { speech_response: {} }

  if is_ssml?(message)
    final_response[:speech_response][:ssml] = message
  else
    final_response[:speech_response][:text_to_speech] = message
  end

  build_response(nil, false, nil, final_response)
end
user() click to toggle source
# File lib/google_assistant/assistant.rb, line 51
def user
  @_user ||= User.new(user_params)
end

Private Instance Methods

build_ask_response(prompt, expected_intent) click to toggle source
# File lib/google_assistant/assistant.rb, line 113
def build_ask_response(prompt, expected_intent)
  expected_inputs = [{
    input_prompt: prompt,
    possible_intents: [expected_intent]
  }]

  build_response(
    conversation.dialog_state,
    true,
    expected_inputs,
    nil
  )
end
build_expected_intent(intent, permissions = nil, context = nil) click to toggle source
# File lib/google_assistant/assistant.rb, line 138
def build_expected_intent(intent, permissions = nil, context = nil)
  raise InvalidIntent if intent.nil? || intent.empty?

  expected_intent = { intent: intent }

  unless context.nil? || permissions.nil?
    expected_intent[:input_value_spec] = {
      permission_value_spec: {
        opt_context: context,
        permissions: permissions
      }
    }
  end

  expected_intent
end
build_input_prompt(initial_prompt, no_inputs = []) click to toggle source
# File lib/google_assistant/assistant.rb, line 98
def build_input_prompt(initial_prompt, no_inputs = [])
  initial_prompts = [
    { prompt_type(initial_prompt) => initial_prompt }
  ]

  no_input_prompts = no_inputs.map do |prompt|
    { prompt_type(prompt) => prompt }
  end

  {
    initial_prompts: initial_prompts,
    no_input_prompts: no_input_prompts
  }
end
build_response(dialog_state, expect_user_response, expected_input, final_response) click to toggle source
# File lib/google_assistant/assistant.rb, line 127
def build_response(dialog_state, expect_user_response, expected_input, final_response)
  response = {}

  response[:conversation_token] = dialog_state.to_json if dialog_state
  response[:expect_user_response] = expect_user_response
  response[:expected_inputs] = expected_input if expected_input
  response[:final_response] = final_response if !expect_user_response && final_response

  response
end
conversation_params() click to toggle source
# File lib/google_assistant/assistant.rb, line 173
def conversation_params
  params["conversation"] || {}
end
device_params() click to toggle source
# File lib/google_assistant/assistant.rb, line 181
def device_params
  params["device"] || {}
end
inputs() click to toggle source
# File lib/google_assistant/assistant.rb, line 163
def inputs
  raise MissingRequestInputs if params["inputs"].nil?
  params["inputs"]
end
intent_string() click to toggle source
# File lib/google_assistant/assistant.rb, line 168
def intent_string
  raise MissingRequestIntent if inputs[0]["intent"].nil?
  inputs[0]["intent"]
end
is_ssml?(text) click to toggle source
# File lib/google_assistant/assistant.rb, line 155
def is_ssml?(text)
  text =~ /^<speak\b[^>]*>(.*?)<\/speak>$/
end
prompt_type(text) click to toggle source
# File lib/google_assistant/assistant.rb, line 159
def prompt_type(text)
  is_ssml?(text) ? :ssml : :text_to_speech
end
user_params() click to toggle source
# File lib/google_assistant/assistant.rb, line 177
def user_params
  params["user"] || {}
end