adhearsion 2.6.4 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +6 -9
- data/CHANGELOG.md +22 -7
- data/Gemfile +2 -0
- data/README.markdown +4 -5
- data/Rakefile +1 -2
- data/adhearsion.gemspec +19 -8
- data/features/cli_create.feature +19 -3
- data/features/step_definitions/cli_steps.rb +0 -11
- data/features/support/env.rb +3 -4
- data/lib/adhearsion.rb +48 -27
- data/lib/adhearsion/call.rb +34 -50
- data/lib/adhearsion/call_controller.rb +6 -12
- data/lib/adhearsion/call_controller/dial.rb +15 -53
- data/lib/adhearsion/call_controller/input.rb +39 -162
- data/lib/adhearsion/call_controller/input/ask_grammar_builder.rb +44 -0
- data/lib/adhearsion/call_controller/input/menu_builder.rb +136 -0
- data/lib/adhearsion/call_controller/input/prompt_builder.rb +78 -0
- data/lib/adhearsion/call_controller/input/result.rb +46 -0
- data/lib/adhearsion/call_controller/output.rb +48 -67
- data/lib/adhearsion/call_controller/output/abstract_player.rb +3 -3
- data/lib/adhearsion/call_controller/output/async_player.rb +3 -3
- data/lib/adhearsion/call_controller/output/player.rb +1 -1
- data/lib/adhearsion/call_controller/record.rb +23 -8
- data/lib/adhearsion/calls.rb +1 -1
- data/lib/adhearsion/cli_commands/ahn_command.rb +2 -65
- data/lib/adhearsion/cli_commands/thor_errors.rb +0 -6
- data/lib/adhearsion/configuration.rb +91 -39
- data/lib/adhearsion/core_ext/blather/stanza.rb +41 -0
- data/lib/adhearsion/core_ext/blather/stanza/presence.rb +13 -0
- data/lib/adhearsion/error.rb +5 -0
- data/lib/adhearsion/event.rb +21 -0
- data/lib/adhearsion/event/active_speaker.rb +11 -0
- data/lib/adhearsion/event/answered.rb +11 -0
- data/lib/adhearsion/event/asterisk.rb +10 -0
- data/lib/adhearsion/event/asterisk/ami.rb +34 -0
- data/lib/adhearsion/event/complete.rb +75 -0
- data/lib/adhearsion/event/dtmf.rb +11 -0
- data/lib/adhearsion/event/end.rb +22 -0
- data/lib/adhearsion/event/input_timers_started.rb +9 -0
- data/lib/adhearsion/event/joined.rb +17 -0
- data/lib/adhearsion/event/offer.rb +14 -0
- data/lib/adhearsion/event/ringing.rb +11 -0
- data/lib/adhearsion/event/started_speaking.rb +13 -0
- data/lib/adhearsion/event/stopped_speaking.rb +13 -0
- data/lib/adhearsion/event/unjoined.rb +17 -0
- data/lib/adhearsion/events.rb +47 -66
- data/lib/adhearsion/foundation.rb +0 -1
- data/lib/adhearsion/foundation/object.rb +0 -5
- data/lib/adhearsion/generators/app/app_generator.rb +4 -1
- data/lib/adhearsion/generators/app/templates/Gemfile.erb +2 -10
- data/lib/adhearsion/generators/app/templates/adhearsion.erb +9 -9
- data/lib/adhearsion/generators/app/templates/config.ru +7 -0
- data/lib/adhearsion/generators/app/templates/en.yml +4 -0
- data/lib/adhearsion/generators/app/templates/events.erb +2 -2
- data/lib/adhearsion/generators/app/templates/hello_world.wav +0 -0
- data/lib/adhearsion/generators/app/templates/simon_game.rb +2 -1
- data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +2 -2
- data/lib/adhearsion/has_headers.rb +34 -0
- data/lib/adhearsion/http_server.rb +37 -0
- data/lib/adhearsion/initializer.rb +19 -153
- data/lib/adhearsion/logging.rb +6 -25
- data/lib/adhearsion/outbound_call.rb +5 -5
- data/lib/adhearsion/plugin.rb +1 -0
- data/lib/adhearsion/protocol_error.rb +26 -0
- data/lib/adhearsion/rayo.rb +30 -0
- data/lib/adhearsion/rayo/client.rb +62 -0
- data/lib/adhearsion/rayo/client/component_registry.rb +33 -0
- data/lib/adhearsion/rayo/command.rb +21 -0
- data/lib/adhearsion/rayo/command/accept.rb +16 -0
- data/lib/adhearsion/rayo/command/answer.rb +16 -0
- data/lib/adhearsion/rayo/command/dial.rb +57 -0
- data/lib/adhearsion/rayo/command/hangup.rb +16 -0
- data/lib/adhearsion/rayo/command/join.rb +43 -0
- data/lib/adhearsion/rayo/command/mute.rb +13 -0
- data/lib/adhearsion/rayo/command/redirect.rb +23 -0
- data/lib/adhearsion/rayo/command/reject.rb +40 -0
- data/lib/adhearsion/rayo/command/unjoin.rb +24 -0
- data/lib/adhearsion/rayo/command/unmute.rb +13 -0
- data/lib/adhearsion/rayo/command_node.rb +47 -0
- data/lib/adhearsion/rayo/component.rb +21 -0
- data/lib/adhearsion/rayo/component/asterisk.rb +13 -0
- data/lib/adhearsion/rayo/component/asterisk/agi.rb +14 -0
- data/lib/adhearsion/rayo/component/asterisk/agi/command.rb +46 -0
- data/lib/adhearsion/rayo/component/asterisk/ami.rb +14 -0
- data/lib/adhearsion/rayo/component/asterisk/ami/action.rb +61 -0
- data/lib/adhearsion/rayo/component/component_node.rb +90 -0
- data/lib/adhearsion/rayo/component/input.rb +186 -0
- data/lib/adhearsion/rayo/component/output.rb +471 -0
- data/lib/adhearsion/rayo/component/prompt.rb +53 -0
- data/lib/adhearsion/rayo/component/receive_fax.rb +26 -0
- data/lib/adhearsion/rayo/component/record.rb +165 -0
- data/lib/adhearsion/rayo/component/send_fax.rb +64 -0
- data/lib/adhearsion/rayo/component/stop.rb +11 -0
- data/lib/adhearsion/rayo/connection.rb +12 -0
- data/lib/adhearsion/rayo/connection/asterisk.rb +74 -0
- data/lib/adhearsion/rayo/connection/connected.rb +22 -0
- data/lib/adhearsion/rayo/connection/generic_connection.rb +22 -0
- data/lib/adhearsion/rayo/connection/xmpp.rb +198 -0
- data/lib/adhearsion/rayo/disconnected_error.rb +22 -0
- data/lib/adhearsion/{punchblock_plugin → rayo}/initializer.rb +19 -19
- data/lib/adhearsion/rayo/rayo_node.rb +127 -0
- data/lib/adhearsion/rayo/ref.rb +57 -0
- data/lib/adhearsion/statistics.rb +1 -1
- data/lib/adhearsion/tasks.rb +1 -2
- data/lib/adhearsion/tasks/configuration.rb +1 -1
- data/lib/adhearsion/tasks/environment.rb +0 -2
- data/lib/adhearsion/tasks/i18n.rb +49 -0
- data/lib/adhearsion/translator.rb +11 -0
- data/lib/adhearsion/translator/asterisk.rb +234 -0
- data/lib/adhearsion/translator/asterisk/agi_app.rb +17 -0
- data/lib/adhearsion/translator/asterisk/agi_command.rb +45 -0
- data/lib/adhearsion/translator/asterisk/ami_error_converter.rb +20 -0
- data/lib/adhearsion/translator/asterisk/call.rb +416 -0
- data/lib/adhearsion/translator/asterisk/channel.rb +43 -0
- data/lib/adhearsion/translator/asterisk/component.rb +88 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk.rb +15 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk/agi_command.rb +42 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk/ami_action.rb +68 -0
- data/lib/adhearsion/translator/asterisk/component/composed_prompt.rb +76 -0
- data/lib/adhearsion/translator/asterisk/component/dtmf_recognizer.rb +137 -0
- data/lib/adhearsion/translator/asterisk/component/input.rb +34 -0
- data/lib/adhearsion/translator/asterisk/component/input_component.rb +90 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_native_prompt.rb +71 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_prompt.rb +55 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_recog_prompt.rb +165 -0
- data/lib/adhearsion/translator/asterisk/component/output.rb +233 -0
- data/lib/adhearsion/translator/asterisk/component/record.rb +101 -0
- data/lib/adhearsion/translator/asterisk/component/stop_by_redirect.rb +30 -0
- data/lib/adhearsion/translator/asterisk/unimrcp_app.rb +28 -0
- data/lib/adhearsion/uri_list.rb +21 -0
- data/lib/adhearsion/version.rb +1 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +79 -1420
- data/spec/adhearsion/call_controller/input_spec.rb +1141 -237
- data/spec/adhearsion/call_controller/output/async_player_spec.rb +10 -10
- data/spec/adhearsion/call_controller/output/player_spec.rb +8 -8
- data/spec/adhearsion/call_controller/output_spec.rb +162 -215
- data/spec/adhearsion/call_controller/record_spec.rb +15 -16
- data/spec/adhearsion/call_controller_spec.rb +23 -40
- data/spec/adhearsion/call_spec.rb +123 -129
- data/spec/adhearsion/calls_spec.rb +3 -3
- data/spec/adhearsion/configuration_spec.rb +94 -108
- data/spec/adhearsion/event/answered_spec.rb +50 -0
- data/spec/adhearsion/event/asterisk/Find Results +402 -0
- data/spec/adhearsion/event/asterisk/ami_spec.rb +81 -0
- data/spec/adhearsion/event/complete_spec.rb +176 -0
- data/spec/adhearsion/event/dtmf_spec.rb +35 -0
- data/spec/adhearsion/event/end_spec.rb +85 -0
- data/spec/adhearsion/event/input_timers_started_spec.rb +19 -0
- data/spec/adhearsion/event/joined_spec.rb +53 -0
- data/spec/adhearsion/event/offer_spec.rb +106 -0
- data/spec/adhearsion/event/ringing_spec.rb +50 -0
- data/spec/adhearsion/event/started_speaking_spec.rb +37 -0
- data/spec/adhearsion/event/stopped_speaking_spec.rb +37 -0
- data/spec/adhearsion/event/unjoined_spec.rb +48 -0
- data/spec/adhearsion/event/untitled +0 -0
- data/spec/adhearsion/events_spec.rb +19 -45
- data/spec/adhearsion/initializer_spec.rb +12 -184
- data/spec/adhearsion/logging_spec.rb +5 -20
- data/spec/adhearsion/outbound_call_spec.rb +13 -13
- data/spec/adhearsion/plugin_spec.rb +3 -4
- data/spec/adhearsion/protocol_error_spec.rb +91 -0
- data/spec/adhearsion/rayo/client/component_registry_spec.rb +26 -0
- data/spec/adhearsion/rayo/client_spec.rb +134 -0
- data/spec/adhearsion/rayo/command/accept_spec.rb +63 -0
- data/spec/adhearsion/rayo/command/answer_spec.rb +73 -0
- data/spec/adhearsion/rayo/command/dial_spec.rb +156 -0
- data/spec/adhearsion/rayo/command/hangup_spec.rb +63 -0
- data/spec/adhearsion/rayo/command/join_spec.rb +158 -0
- data/spec/adhearsion/rayo/command/mute_spec.rb +32 -0
- data/spec/adhearsion/rayo/command/redirect_spec.rb +89 -0
- data/spec/adhearsion/rayo/command/reject_spec.rb +117 -0
- data/spec/adhearsion/rayo/command/unjoin_spec.rb +82 -0
- data/spec/adhearsion/rayo/command/unmute_spec.rb +32 -0
- data/spec/adhearsion/rayo/command_node_spec.rb +101 -0
- data/spec/adhearsion/rayo/component/asterisk/agi/command_spec.rb +111 -0
- data/spec/adhearsion/rayo/component/asterisk/ami/action_spec.rb +173 -0
- data/spec/adhearsion/rayo/component/component_node_spec.rb +110 -0
- data/spec/adhearsion/rayo/component/input_spec.rb +715 -0
- data/spec/adhearsion/rayo/component/output_spec.rb +1030 -0
- data/spec/adhearsion/rayo/component/prompt_spec.rb +171 -0
- data/spec/adhearsion/rayo/component/receive_fax_spec.rb +136 -0
- data/spec/adhearsion/rayo/component/record_spec.rb +497 -0
- data/spec/adhearsion/rayo/component/send_fax_spec.rb +144 -0
- data/spec/adhearsion/rayo/connection/asterisk_spec.rb +118 -0
- data/spec/adhearsion/rayo/connection/xmpp_spec.rb +449 -0
- data/spec/adhearsion/rayo/initializer_spec.rb +353 -0
- data/spec/adhearsion/rayo/ref_spec.rb +168 -0
- data/spec/adhearsion/rayo_spec.rb +7 -0
- data/spec/adhearsion/router/route_spec.rb +1 -1
- data/spec/adhearsion/statistics_spec.rb +2 -5
- data/spec/adhearsion/translator/asterisk/call_spec.rb +2047 -0
- data/spec/adhearsion/translator/asterisk/component/asterisk/agi_command_spec.rb +256 -0
- data/spec/adhearsion/translator/asterisk/component/asterisk/ami_action_spec.rb +151 -0
- data/spec/adhearsion/translator/asterisk/component/composed_prompt_spec.rb +257 -0
- data/spec/adhearsion/translator/asterisk/component/input_spec.rb +571 -0
- data/spec/adhearsion/translator/asterisk/component/mrcp_native_prompt_spec.rb +774 -0
- data/spec/adhearsion/translator/asterisk/component/mrcp_prompt_spec.rb +1244 -0
- data/spec/adhearsion/translator/asterisk/component/output_spec.rb +1850 -0
- data/spec/adhearsion/translator/asterisk/component/record_spec.rb +426 -0
- data/spec/adhearsion/translator/asterisk/component/stop_by_redirect_spec.rb +62 -0
- data/spec/adhearsion/translator/asterisk/component_spec.rb +83 -0
- data/spec/adhearsion/translator/asterisk_spec.rb +685 -0
- data/spec/adhearsion/uri_list_spec.rb +88 -0
- data/spec/adhearsion_spec.rb +89 -14
- data/spec/fixtures/locale/en.yml +13 -0
- data/spec/fixtures/locale/it.yml +13 -0
- data/spec/spec_helper.rb +18 -5
- data/spec/support/call_controller_test_helpers.rb +3 -2
- data/spec/support/initializer_stubs.rb +3 -1
- data/spec/support/punchblock_examples.rb +65 -0
- data/spec/support/punchblock_mocks.rb +12 -0
- metadata +412 -70
- data/features/cli_daemon.feature +0 -20
- data/features/cli_restart.feature +0 -52
- data/features/cli_stop.feature +0 -50
- data/lib/adhearsion/call_controller/menu_dsl.rb +0 -21
- data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +0 -26
- data/lib/adhearsion/call_controller/menu_dsl/calculated_match.rb +0 -43
- data/lib/adhearsion/call_controller/menu_dsl/calculated_match_collection.rb +0 -45
- data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +0 -11
- data/lib/adhearsion/call_controller/menu_dsl/match_calculator.rb +0 -40
- data/lib/adhearsion/call_controller/menu_dsl/menu.rb +0 -207
- data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +0 -92
- data/lib/adhearsion/call_controller/menu_dsl/range_match_calculator.rb +0 -60
- data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +0 -25
- data/lib/adhearsion/call_controller/utility.rb +0 -77
- data/lib/adhearsion/foundation/custom_daemonizer.rb +0 -52
- data/lib/adhearsion/punchblock_plugin.rb +0 -63
- data/scripts/cloc-1.64.pl +0 -10483
- data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +0 -76
- data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +0 -60
- data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +0 -61
- data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +0 -39
- data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +0 -17
- data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +0 -165
- data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +0 -420
- data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +0 -32
- data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +0 -40
- data/spec/adhearsion/call_controller/utility_spec.rb +0 -90
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +0 -356
- data/spec/adhearsion/punchblock_plugin_spec.rb +0 -59
@@ -26,13 +26,13 @@ module Adhearsion
|
|
26
26
|
def new_output(options)
|
27
27
|
defaults = {}
|
28
28
|
|
29
|
-
default_voice = Adhearsion.config.
|
29
|
+
default_voice = Adhearsion.config.core.media.default_voice
|
30
30
|
defaults[:voice] = default_voice if default_voice
|
31
31
|
|
32
|
-
renderer = Adhearsion.config.
|
32
|
+
renderer = Adhearsion.config.core.media.default_renderer
|
33
33
|
defaults[:renderer] = renderer if renderer
|
34
34
|
|
35
|
-
|
35
|
+
Adhearsion::Rayo::Component::Output.new defaults.merge(options)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -12,13 +12,13 @@ module Adhearsion
|
|
12
12
|
def output(content, options = {})
|
13
13
|
options.merge! :ssml => content
|
14
14
|
component = new_output options
|
15
|
-
component.register_event_handler
|
16
|
-
controller.logger.error event if event.reason.is_a?(
|
15
|
+
component.register_event_handler Adhearsion::Event::Complete do |event|
|
16
|
+
controller.logger.error event if event.reason.is_a?(Adhearsion::Event::Complete::Error)
|
17
17
|
throw :pass
|
18
18
|
end
|
19
19
|
controller.write_and_await_response component
|
20
20
|
component
|
21
|
-
rescue
|
21
|
+
rescue Adhearsion::ProtocolError => e
|
22
22
|
raise PlaybackError, "Async output failed due to #{e.inspect}"
|
23
23
|
end
|
24
24
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
require 'ruby_speech'
|
4
|
+
|
3
5
|
module Adhearsion
|
4
6
|
class CallController
|
5
7
|
module Record
|
@@ -33,7 +35,7 @@ module Adhearsion
|
|
33
35
|
|
34
36
|
interruptible = options.delete :interruptible
|
35
37
|
@stopper_component = interruptible ? setup_stopper(interruptible) : nil
|
36
|
-
@record_component =
|
38
|
+
@record_component = Adhearsion::Rayo::Component::Record.new options
|
37
39
|
end
|
38
40
|
|
39
41
|
#
|
@@ -51,26 +53,39 @@ module Adhearsion
|
|
51
53
|
#
|
52
54
|
# Set a callback to be executed when recording completes
|
53
55
|
#
|
54
|
-
# @yield [
|
56
|
+
# @yield [Adhearsion::Event::Complete] the complete Event for the recording
|
55
57
|
#
|
56
58
|
def handle_record_completion(&block)
|
57
|
-
@record_component.register_event_handler
|
59
|
+
@record_component.register_event_handler Adhearsion::Event::Complete, &block
|
58
60
|
end
|
59
61
|
|
60
62
|
private
|
61
63
|
|
62
64
|
def setup_stopper(interrupt_digits)
|
63
65
|
interrupt_digits = interrupt_digits == true ? '0123456789#*' : interrupt_digits.to_s
|
64
|
-
@stopper_component =
|
66
|
+
@stopper_component = Adhearsion::Rayo::Component::Input.new :mode => :dtmf,
|
65
67
|
:grammar => {
|
66
|
-
:value =>
|
68
|
+
:value => grammar_accept(interrupt_digits)
|
67
69
|
}
|
68
|
-
@stopper_component.register_event_handler
|
70
|
+
@stopper_component.register_event_handler Adhearsion::Event::Complete do |event|
|
69
71
|
@record_component.stop! unless @record_component.complete?
|
70
72
|
end
|
71
73
|
@stopper_component
|
72
74
|
end
|
73
75
|
|
76
|
+
def grammar_accept(digits = '0123456789#*')
|
77
|
+
allowed_digits = '0123456789#*'
|
78
|
+
gram_digits = digits.chars.select { |x| allowed_digits.include? x }
|
79
|
+
|
80
|
+
RubySpeech::GRXML.draw :mode => 'dtmf', :root => 'inputdigits' do
|
81
|
+
rule id: 'inputdigits', scope: 'public' do
|
82
|
+
one_of do
|
83
|
+
gram_digits.each { |d| item { d.to_s } }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
74
89
|
def execute_stopper
|
75
90
|
@controller.write_and_await_response @stopper_component if @stopper_component
|
76
91
|
end
|
@@ -118,9 +133,9 @@ module Adhearsion
|
|
118
133
|
# @option options [Boolean, String, Optional] :interruptible Allows the recording to be terminated by any single DTMF key, default is false
|
119
134
|
#
|
120
135
|
# @yield [event] Handle the recording completion event asyncronously.
|
121
|
-
# @yieldparam [
|
136
|
+
# @yieldparam [Adhearsion::Event::Complete] event the complete event for the recording
|
122
137
|
#
|
123
|
-
# @return
|
138
|
+
# @return Adhearsion::Rayo::Component::Record
|
124
139
|
#
|
125
140
|
def record(options = {})
|
126
141
|
recorder = Recorder.new self, options
|
data/lib/adhearsion/calls.rb
CHANGED
@@ -94,7 +94,7 @@ module Adhearsion
|
|
94
94
|
return unless reason
|
95
95
|
Adhearsion::Events.trigger :exception, reason
|
96
96
|
logger.error "Call #{call_id} terminated abnormally due to #{reason}. Forcing hangup."
|
97
|
-
|
97
|
+
Adhearsion.client.execute_command Adhearsion::Rayo::Command::Hangup.new, :async => true, :call_id => call_id
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
@@ -40,70 +40,13 @@ module Adhearsion
|
|
40
40
|
desc "start </path/to/directory>", "Start the Adhearsion server in the foreground with a console"
|
41
41
|
method_option :noconsole, type: :boolean, aliases: %w{--no-console}
|
42
42
|
def start(path = nil)
|
43
|
-
start_app path, options[:noconsole] ? :simple : :console
|
44
|
-
end
|
45
|
-
|
46
|
-
desc "daemon </path/to/directory>", "Start the Adhearsion server in the background"
|
47
|
-
method_option :pidfile, :type => :string, :aliases => %w(--pid-file)
|
48
|
-
def daemon(path = nil)
|
49
|
-
start_app path, :daemon, options[:pidfile]
|
50
|
-
end
|
51
|
-
|
52
|
-
desc "stop </path/to/directory>", "Stop a running Adhearsion server"
|
53
|
-
method_option :pidfile, :type => :string, :aliases => %w(--pid-file)
|
54
|
-
def stop(path = nil)
|
55
|
-
path = execute_from_app_dir! path
|
56
|
-
|
57
|
-
pid_file = if options[:pidfile]
|
58
|
-
File.exists?(File.expand_path(options[:pidfile])) ?
|
59
|
-
options[:pidfile] :
|
60
|
-
File.join(path, options[:pidfile])
|
61
|
-
else
|
62
|
-
path = Dir.pwd
|
63
|
-
File.join path, Adhearsion::Initializer::DEFAULT_PID_FILE_NAME
|
64
|
-
end
|
65
|
-
pid_file = File.expand_path pid_file
|
66
|
-
|
67
|
-
begin
|
68
|
-
pid = File.read(pid_file).to_i
|
69
|
-
rescue
|
70
|
-
raise PIDReadError, pid_file
|
71
|
-
end
|
72
|
-
|
73
|
-
raise PIDReadError, pid_file if pid.nil?
|
74
|
-
|
75
|
-
say "Stopping Adhearsion server at #{path} with pid #{pid}"
|
76
|
-
waiting_timeout = Time.now + 15
|
77
|
-
begin
|
78
|
-
::Process.kill "TERM", pid
|
79
|
-
sleep 0.25 while process_exists?(pid) && Time.now < waiting_timeout
|
80
|
-
::Process.kill "KILL", pid
|
81
|
-
rescue Errno::ESRCH
|
82
|
-
end
|
83
|
-
|
84
|
-
File.delete pid_file if File.exists? pid_file
|
85
|
-
end
|
86
|
-
|
87
|
-
desc "restart </path/to/directory>", "Restart the Adhearsion server"
|
88
|
-
method_option :pidfile, :type => :string, :aliases => %w(--pid-file)
|
89
|
-
def restart(path = nil)
|
90
43
|
path = execute_from_app_dir! path
|
91
|
-
|
92
|
-
|
93
|
-
rescue PIDReadError => e
|
94
|
-
puts e.message
|
95
|
-
end
|
96
|
-
invoke :daemon
|
44
|
+
say "Starting Adhearsion server at #{Dir.pwd}"
|
45
|
+
Adhearsion::Initializer.start :console => !options[:noconsole]
|
97
46
|
end
|
98
47
|
|
99
48
|
protected
|
100
49
|
|
101
|
-
def start_app(path, mode, pid_file = nil)
|
102
|
-
path = execute_from_app_dir! path
|
103
|
-
say "Starting Adhearsion server at #{Dir.pwd}"
|
104
|
-
Adhearsion::Initializer.start :mode => mode, :pid_file => pid_file
|
105
|
-
end
|
106
|
-
|
107
50
|
def execute_from_app_dir!(path)
|
108
51
|
if in_app? and running_script_ahn?
|
109
52
|
return Dir.pwd
|
@@ -130,12 +73,6 @@ module Adhearsion
|
|
130
73
|
ScriptAhnLoader.in_ahn_application? or ScriptAhnLoader.in_ahn_application_subdirectory?
|
131
74
|
end
|
132
75
|
|
133
|
-
def process_exists?(pid = nil)
|
134
|
-
# FIXME: Raise some error here
|
135
|
-
return false if pid.nil?
|
136
|
-
`ps -p #{pid} | sed -e '1d'`.strip.empty?
|
137
|
-
end
|
138
|
-
|
139
76
|
def method_missing(action, *args)
|
140
77
|
help
|
141
78
|
raise UnknownCommand, [action, *args] * " "
|
@@ -7,22 +7,35 @@ module Adhearsion
|
|
7
7
|
|
8
8
|
ConfigurationError = Class.new Adhearsion::Error # Error raised while trying to configure a non existent plugin
|
9
9
|
|
10
|
+
def self.validate_number(value)
|
11
|
+
return 1.0/0.0 if ["Infinity", 1.0/0.0].include? value
|
12
|
+
value.to_i
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.default_port_for_platform(platform)
|
16
|
+
case platform
|
17
|
+
when :asterisk then 5038
|
18
|
+
when :xmpp then 5222
|
19
|
+
else nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
10
23
|
##
|
11
24
|
# Initialize the configuration object
|
12
25
|
#
|
13
|
-
# * &block
|
26
|
+
# * &block core configuration block
|
14
27
|
# Adhearsion::Configuration.new do
|
15
28
|
# foo "bar", :desc => "My description"
|
16
29
|
# end
|
17
30
|
#
|
18
31
|
# @return [Adhearsion::Configuration]
|
19
|
-
def initialize(&block)
|
20
|
-
initialize_environments
|
32
|
+
def initialize(env = :development, &block)
|
33
|
+
initialize_environments env
|
21
34
|
|
22
35
|
Loquacious.env_config = true
|
23
36
|
Loquacious.env_prefix = "AHN"
|
24
37
|
|
25
|
-
Loquacious::Configuration.for :
|
38
|
+
Loquacious::Configuration.for :core do
|
26
39
|
root nil, :desc => "Adhearsion application root folder"
|
27
40
|
|
28
41
|
lib "lib", :desc => <<-__
|
@@ -31,30 +44,41 @@ module Adhearsion
|
|
31
44
|
want these files to be loaded. This folder is relative to the application root folder.
|
32
45
|
__
|
33
46
|
|
34
|
-
environment :development, :transform => Proc.new { |v| v.to_sym }, :desc => <<-__
|
35
|
-
Active environment. Supported values: development, production, staging, test
|
36
|
-
__
|
37
|
-
|
38
47
|
process_name "ahn", :desc => <<-__
|
39
48
|
Adhearsion process name, useful to make it easier to find in the process list
|
40
49
|
Pro tip: set this to your application's name and you can do "killall myapp"
|
41
50
|
Does not work under JRuby.
|
42
51
|
__
|
43
52
|
|
53
|
+
event_threads 5, transform: Proc.new { |v| Adhearsion::Configuration.validate_number v }, desc: <<-__
|
54
|
+
The number of threads to include in the event worker pool."
|
55
|
+
__
|
56
|
+
|
44
57
|
desc "Log configuration"
|
45
58
|
logging {
|
46
59
|
level :info, :transform => Proc.new { |v| v.to_sym }, :desc => <<-__
|
47
60
|
Supported levels (in increasing severity) -- :trace < :debug < :info < :warn < :error < :fatal
|
48
61
|
__
|
49
|
-
outputters ["log/adhearsion.log"], :transform => Proc.new { |val| Array(val) }, :desc => <<-__
|
50
|
-
An array of log outputters to use. The default is to log to stdout and log/adhearsion.log.
|
51
|
-
Each item must be either a string to use as a filename, or a valid Logging appender (see http://github.com/TwP/logging)
|
52
|
-
__
|
53
62
|
formatter nil, :desc => <<-__
|
54
|
-
A log formatter to apply to
|
63
|
+
A log formatter to apply to the stream. If nil, the Adhearsion default formatter will be used.
|
55
64
|
__
|
56
65
|
}
|
57
66
|
|
67
|
+
type :xmpp , :transform => Proc.new { |v| v.to_sym }, :desc => <<-__
|
68
|
+
Platform used to connect to the Telephony provider. Currently supported values:
|
69
|
+
- :xmpp
|
70
|
+
- :asterisk
|
71
|
+
__
|
72
|
+
username "usera@127.0.0.1", :desc => "Authentication credentials"
|
73
|
+
password "1" , :desc => "Authentication credentials"
|
74
|
+
host nil , :desc => "Host to connect to (where rayo/asterisk is located)"
|
75
|
+
port Proc.new { Adhearsion::Configuration.default_port_for_platform type }, :transform => Proc.new { |v| Adhearsion::Configuration.validate_number v }, :desc => "Port used to connect"
|
76
|
+
certs_directory nil , :desc => "Directory containing certificates for securing the connection."
|
77
|
+
root_domain nil , :desc => "The root domain at which to address the server"
|
78
|
+
connection_timeout 60 , :transform => Proc.new { |v| Adhearsion::Configuration.validate_number v }, :desc => "The amount of time to wait for a connection"
|
79
|
+
reconnect_attempts 1.0/0.0 , :transform => Proc.new { |v| Adhearsion::Configuration.validate_number v }, :desc => "The number of times to (re)attempt connection to the server"
|
80
|
+
reconnect_timer 5 , :transform => Proc.new { |v| Adhearsion::Configuration.validate_number v }, :desc => "Delay between connection attempts"
|
81
|
+
|
58
82
|
after_hangup_lifetime 1, :transform => Proc.new { |v| v.to_i }, :desc => <<-__
|
59
83
|
Lifetime of a call after it has hung up. Should be set to the minimum functional value for your application. Call actors (threads) living after hangup consume more system resources and reduce the concurrent call capacity of your application.
|
60
84
|
__
|
@@ -63,19 +87,57 @@ module Adhearsion
|
|
63
87
|
media {
|
64
88
|
default_voice nil, desc: 'The default voice used for all output. Set nil to use platform default.'
|
65
89
|
default_renderer nil, desc: 'The default renderer used for all output. Set nil to use platform default.'
|
90
|
+
|
91
|
+
min_confidence 0.5, desc: 'The default minimum confidence level used for all recognizer invocations.', transform: Proc.new { |v| v.to_f }
|
92
|
+
timeout 5, desc: 'The default timeout (in seconds) used for all recognizer invocations.', transform: Proc.new { |v| v.to_i }
|
93
|
+
inter_digit_timeout 2, desc: 'The timeout used between DTMF digits and to terminate partial invocations', transform: Proc.new { |v| v.to_i }
|
94
|
+
recognizer nil, desc: 'The default recognizer used for all input. Set nil to use platform default.'
|
95
|
+
input_language 'en-US', desc: 'The default language set on generated grammars. Set nil to use platform default.'
|
66
96
|
}
|
97
|
+
|
98
|
+
desc "Internationalisation"
|
99
|
+
i18n {
|
100
|
+
locale_path ["config/locales"], transform: Proc.new { |v| v.split ':' }, desc: <<-__
|
101
|
+
List of directories from which to load locale data, colon-delimited
|
102
|
+
__
|
103
|
+
audio_path "app/assets/audio", desc: <<-__
|
104
|
+
Base path from which audio files can be found. May be a filesystem path or some other URL (like HTTP)
|
105
|
+
__
|
106
|
+
fallback true, desc: <<-__
|
107
|
+
Whether to include text for translations that provide both text & audio. True or false.
|
108
|
+
__
|
109
|
+
}
|
110
|
+
|
111
|
+
desc "HTTP server"
|
112
|
+
http do
|
113
|
+
enable true, desc: "Enable or disable the HTTP server"
|
114
|
+
host "0.0.0.0", desc: "IP to bind the HTTP listener to"
|
115
|
+
port "8080", desc: "Port to bind the HTTP listener to"
|
116
|
+
rackup 'config.ru', desc: 'Path to Rack configuration file (relative to Adhearsion application root)'
|
117
|
+
end
|
67
118
|
end
|
68
119
|
|
69
|
-
Loquacious::Configuration.for :
|
120
|
+
Loquacious::Configuration.for :core, &block if block_given?
|
70
121
|
|
71
122
|
self
|
72
123
|
end
|
73
124
|
|
74
|
-
def initialize_environments
|
125
|
+
def initialize_environments(active_environment)
|
75
126
|
# Create a method per each valid environment that, when invoked, may execute
|
76
127
|
# the block received if the environment is active
|
77
|
-
valid_environments.each do |
|
78
|
-
|
128
|
+
valid_environments.each do |env|
|
129
|
+
define_singleton_method env.to_sym do |*args, &block|
|
130
|
+
logger.trace "Ignoring configuration for inactive environment #{env}"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
define_singleton_method active_environment do |*args, &block|
|
135
|
+
self.instance_eval(&block) unless block.nil?
|
136
|
+
self
|
137
|
+
end
|
138
|
+
|
139
|
+
if valid_environment?(active_environment)
|
140
|
+
logger.warn "You tried to initialize with an invalid environment name #{active_environment}; environment-specific config may not load successfully. Valid values are #{valid_environments}."
|
79
141
|
end
|
80
142
|
end
|
81
143
|
|
@@ -87,20 +149,10 @@ module Adhearsion
|
|
87
149
|
@valid_environments ||= [:production, :development, :staging, :test]
|
88
150
|
end
|
89
151
|
|
90
|
-
def add_environment(env)
|
91
|
-
return if self.class.method_defined? env.to_sym
|
92
|
-
self.class.send(:define_method, env.to_sym) do |*args, &block|
|
93
|
-
unless block.nil? || env != self.platform.environment.to_sym
|
94
|
-
self.instance_eval(&block)
|
95
|
-
end
|
96
|
-
self
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
152
|
##
|
101
153
|
# Direct access to a specific configuration object
|
102
154
|
#
|
103
|
-
# Adhearsion.config[:
|
155
|
+
# Adhearsion.config[:core] => returns the configuration object associated with Adhearsion core
|
104
156
|
#
|
105
157
|
# @return [Loquacious::Configuration] configuration object or nil if the plugin does not exist
|
106
158
|
def [](value)
|
@@ -119,33 +171,33 @@ module Adhearsion
|
|
119
171
|
|
120
172
|
# root accessor
|
121
173
|
def root
|
122
|
-
|
174
|
+
core.root
|
123
175
|
end
|
124
176
|
|
125
177
|
##
|
126
|
-
# Handle the Adhearsion
|
178
|
+
# Handle the Adhearsion core configuration
|
127
179
|
#
|
128
180
|
# It accepts a block that will be executed in the Adhearsion config var environment
|
129
181
|
# to update the desired values
|
130
182
|
#
|
131
|
-
# Adhearsion.config.
|
183
|
+
# Adhearsion.config.core do
|
132
184
|
# foo "bar", :desc => "My new description"
|
133
185
|
# end
|
134
186
|
#
|
135
|
-
# values = Adhearsion.config.
|
187
|
+
# values = Adhearsion.config.core
|
136
188
|
# values.foo => "bar"
|
137
189
|
#
|
138
190
|
# @return [Loquacious::Configuration] configuration object or nil if the plugin does not exist
|
139
|
-
def
|
140
|
-
Loquacious::Configuration.for :
|
191
|
+
def core(&block)
|
192
|
+
Loquacious::Configuration.for :core, &block
|
141
193
|
end
|
142
194
|
|
143
195
|
##
|
144
|
-
# Fetchs the configuration info for the Adhearsion
|
196
|
+
# Fetchs the configuration info for the Adhearsion core or a specific plugin
|
145
197
|
# @param name [Symbol]
|
146
|
-
# - :all => Adhearsion
|
147
|
-
# - nil => Adhearsion
|
148
|
-
# - :
|
198
|
+
# - :all => Adhearsion core and all the loaded plugins
|
199
|
+
# - nil => Adhearsion core configuration
|
200
|
+
# - :core => Adhearsion core configuration
|
149
201
|
# - :<plugin-config-name> => Adhearsion plugin configuration
|
150
202
|
#
|
151
203
|
# @param args [Hash]
|
@@ -155,7 +207,7 @@ module Adhearsion
|
|
155
207
|
def description(name, args = {:show_values => true})
|
156
208
|
desc = StringIO.new
|
157
209
|
|
158
|
-
name.nil? and name = :
|
210
|
+
name.nil? and name = :core
|
159
211
|
if name.eql? :all
|
160
212
|
value = ""
|
161
213
|
Loquacious::Configuration.instance_variable_get("@table").keys.map do |config|
|