lib/adhearsion/translator/asterisk/component/composed_prompt.rb
# encoding: utf-8
require 'adhearsion/translator/asterisk/component/input_component'
require 'adhearsion/translator/asterisk/component/stop_by_redirect'
module Adhearsion
module Translator
class Asterisk
module Component
class ComposedPrompt < Component
include InputComponent
include StopByRedirect
def execute
validate
output_command.request!
setup_dtmf_recognizer
@output_incomplete = true
@output_component = Output.new(output_command, @call)
call.register_component @output_component
fut = Celluloid::Future.new { @output_component.execute }
case @output_command.response
when Adhearsion::Rayo::Ref
send_ref
else
set_node_response @output_command.response
end
if @component_node.barge_in
@barged = false
register_dtmf_event_handler
fut.value # Block until output is complete before starting timers
@output_incomplete = false
start_timers unless @barged
else
fut.value # Block until output is complete before allowing input
register_dtmf_event_handler
start_timers
end
end
def process_dtmf(digit)
if @component_node.barge_in && @output_incomplete
@output_component.stop_by_redirect Adhearsion::Event::Complete::Stop.new
@barged = true
end
super
end
def output_command
@output_command ||= @component_node.output
end
private
def input_node
@input_node ||= @component_node.input
end
def register_dtmf_event_handler
@dtmf_handler_id = call.register_handler :ami, [{:name => 'DTMF', [:[], 'End'] => 'Yes'}, {:name => 'DTMFEnd'}] do |event|
process_dtmf event['Digit']
end
end
def unregister_dtmf_event_handler
call.unregister_handler :ami, @dtmf_handler_id if instance_variable_defined?(:@dtmf_handler_id)
end
end
end
end
end
end