adhearsion 2.4.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -3
- data/CHANGELOG.md +29 -0
- data/Gemfile +0 -2
- data/Guardfile +2 -2
- data/README.markdown +3 -6
- data/Rakefile +1 -1
- data/adhearsion.gemspec +7 -2
- data/features/cli_create.feature +85 -7
- data/features/plugin_generator.feature +4 -0
- data/features/step_definitions/app_generator_steps.rb +8 -1
- data/lib/adhearsion.rb +6 -3
- data/lib/adhearsion/call.rb +101 -30
- data/lib/adhearsion/call_controller.rb +40 -12
- data/lib/adhearsion/call_controller/dial.rb +119 -36
- data/lib/adhearsion/call_controller/input.rb +11 -5
- data/lib/adhearsion/call_controller/output.rb +47 -33
- data/lib/adhearsion/call_controller/output/async_player.rb +3 -2
- data/lib/adhearsion/call_controller/output/formatter.rb +7 -2
- data/lib/adhearsion/call_controller/output/player.rb +2 -2
- data/lib/adhearsion/call_controller/record.rb +16 -13
- data/lib/adhearsion/call_controller/utility.rb +3 -3
- data/lib/adhearsion/calls.rb +21 -8
- data/lib/adhearsion/cli_commands/ahn_command.rb +1 -0
- data/lib/adhearsion/configuration.rb +2 -2
- data/lib/adhearsion/console.rb +3 -2
- data/lib/adhearsion/generators.rb +7 -9
- data/lib/adhearsion/generators/app/app_generator.rb +12 -2
- data/lib/adhearsion/generators/app/templates/Gemfile.erb +7 -9
- data/lib/adhearsion/generators/app/templates/README.md +0 -19
- data/lib/adhearsion/generators/app/templates/adhearsion.erb +37 -0
- data/lib/adhearsion/generators/app/templates/config/environment.rb +6 -1
- data/lib/adhearsion/generators/app/templates/events.erb +18 -0
- data/lib/adhearsion/generators/app/templates/routes.erb +19 -0
- data/lib/adhearsion/generators/app/templates/{lib/simon_game.rb → simon_game.rb} +0 -0
- data/lib/adhearsion/generators/app/templates/{spec/call_controllers/simon_game_spec.rb → simon_game_spec.rb} +0 -0
- data/lib/adhearsion/generators/controller/controller_generator.rb +2 -2
- data/lib/adhearsion/generators/controller/templates/lib/{controller.rb → controller.rb.erb} +0 -0
- data/lib/adhearsion/generators/controller/templates/spec/{controller_spec.rb → controller_spec.rb.erb} +0 -0
- data/lib/adhearsion/generators/plugin/plugin_generator.rb +16 -15
- data/lib/adhearsion/generators/plugin/templates/gitignore +17 -0
- data/lib/adhearsion/generators/plugin/templates/spec/plugin-template/controller_methods_spec.rb.tt +1 -1
- data/lib/adhearsion/initializer.rb +14 -2
- data/lib/adhearsion/logging.rb +1 -0
- data/lib/adhearsion/outbound_call.rb +3 -7
- data/lib/adhearsion/punchblock_plugin/initializer.rb +3 -2
- data/lib/adhearsion/router/openended_route.rb +1 -1
- data/lib/adhearsion/router/route.rb +4 -3
- data/lib/adhearsion/version.rb +1 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +811 -79
- data/spec/adhearsion/call_controller/output/formatter_spec.rb +13 -1
- data/spec/adhearsion/call_controller/output_spec.rb +35 -1
- data/spec/adhearsion/call_controller_spec.rb +174 -18
- data/spec/adhearsion/call_spec.rb +423 -39
- data/spec/adhearsion/calls_spec.rb +19 -3
- data/spec/adhearsion/outbound_call_spec.rb +88 -45
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +3 -3
- data/spec/adhearsion/router/route_spec.rb +2 -2
- data/spec/spec_helper.rb +2 -0
- metadata +92 -77
- data/features/app_generator.feature +0 -49
- data/lib/adhearsion/generators/app/templates/config/adhearsion.rb +0 -71
- data/lib/adhearsion/generators/plugin/templates/.gitignore +0 -9
@@ -28,7 +28,7 @@ module Adhearsion
|
|
28
28
|
klass.start args
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
#
|
32
32
|
# Return a ordered list of task with their class
|
33
33
|
#
|
34
34
|
def mappings
|
@@ -38,20 +38,18 @@ module Adhearsion
|
|
38
38
|
##
|
39
39
|
# Globally add a new generator class to +ahn generate+
|
40
40
|
#
|
41
|
-
# @param [Symbol] name
|
42
|
-
#
|
43
|
-
# @param [Class] klass
|
44
|
-
# class of generator
|
41
|
+
# @param [Symbol] name key name for generator mapping
|
42
|
+
# @param [Class] klass class of generator
|
45
43
|
#
|
46
44
|
# @return [Hash] generator mappings
|
47
45
|
#
|
48
46
|
# @example
|
49
|
-
#
|
47
|
+
# Adhearsion::Generators.add_generator :myplugin, MyPluginGenerator
|
50
48
|
#
|
51
49
|
def add_generator(name, klass)
|
52
50
|
mappings[name] = klass
|
53
51
|
end
|
54
52
|
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -4,19 +4,29 @@ module Adhearsion
|
|
4
4
|
module Generators
|
5
5
|
class AppGenerator < Generator
|
6
6
|
|
7
|
-
BASEDIRS = %w( config
|
8
|
-
EMPTYDIRS = %w( spec/support )
|
7
|
+
BASEDIRS = %w( config script spec )
|
8
|
+
EMPTYDIRS = %w( app/call_controllers lib spec/support spec/call_controllers )
|
9
|
+
|
10
|
+
class_option :empty, type: :boolean
|
9
11
|
|
10
12
|
def setup_project
|
11
13
|
self.destination_root = @generator_name
|
12
14
|
BASEDIRS.each { |dir| directory dir }
|
13
15
|
EMPTYDIRS.each { |dir| empty_directory dir }
|
16
|
+
|
14
17
|
template "Gemfile.erb", "Gemfile"
|
18
|
+
template "adhearsion.erb", "config/adhearsion.rb"
|
19
|
+
template "events.erb", "config/events.rb"
|
20
|
+
template "routes.erb", "config/routes.rb"
|
15
21
|
copy_file "gitignore", ".gitignore"
|
16
22
|
copy_file "rspec", ".rspec"
|
17
23
|
copy_file "Procfile"
|
18
24
|
copy_file "Rakefile"
|
19
25
|
copy_file "README.md"
|
26
|
+
unless options[:empty]
|
27
|
+
copy_file "simon_game.rb", "app/call_controllers/simon_game.rb"
|
28
|
+
copy_file "simon_game_spec.rb", "spec/call_controllers/simon_game_spec.rb"
|
29
|
+
end
|
20
30
|
chmod "script/ahn", 0755
|
21
31
|
end
|
22
32
|
end
|
@@ -2,22 +2,20 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gem 'adhearsion', '~> <%= Adhearsion::VERSION.split('.')[0,2].join('.') %>'
|
4
4
|
|
5
|
+
# Adhearsion depends on the Punchblock library, but here you can specify the major version your application depends on.
|
6
|
+
# Exercise care when updating the major version, since you might encounter API compatability in parts of your Adhearsion application that rely on the Punchblock API.
|
7
|
+
# On occasion, an update of Adhearsion might necessitate an update to Punchblock. You will have to manually allow that here, and take care in the upgrade.
|
8
|
+
gem 'punchblock', '~> <%= require "punchblock/version"; Punchblock::VERSION.split('.')[0,2].join('.') %>'
|
9
|
+
|
5
10
|
# This is here by default due to deprecation of #ask and #menu.
|
6
11
|
# See http://adhearsion.com/docs/common_problems#toc_3 for details
|
7
12
|
gem 'adhearsion-asr'
|
8
13
|
|
9
14
|
#
|
10
|
-
#
|
11
|
-
#
|
15
|
+
# Check http://ahnhub.com for a list of plugins you can use in your app.
|
16
|
+
# To use them, simply add them here and run `bundle install`.
|
12
17
|
#
|
13
18
|
|
14
|
-
# gem 'adhearsion-asterisk'
|
15
|
-
# gem 'adhearsion-rails'
|
16
|
-
# gem 'adhearsion-activerecord'
|
17
|
-
# gem 'adhearsion-ldap'
|
18
|
-
# gem 'adhearsion-xmpp'
|
19
|
-
# gem 'adhearsion-drb'
|
20
|
-
|
21
19
|
group :development, :test do
|
22
20
|
gem 'rspec'
|
23
21
|
end
|
@@ -17,8 +17,6 @@ If you are using Asterisk 1.8, you will need to add an additional context with t
|
|
17
17
|
|
18
18
|
## FreeSWITCH
|
19
19
|
|
20
|
-
### With mod_rayo (recommended)
|
21
|
-
|
22
20
|
* Ensure that mod_rayo is installed and configured according to its' documentation.
|
23
21
|
* Add an extension to your dialplan like so:
|
24
22
|
|
@@ -32,23 +30,6 @@ If you are using Asterisk 1.8, you will need to add an additional context with t
|
|
32
30
|
|
33
31
|
* Connect Adhearsion via XMPP using the Rayo protocol, as per the sample config.
|
34
32
|
|
35
|
-
### With Punchblock's FreeSWITCH mode (deprecated)
|
36
|
-
|
37
|
-
* Ensure that mod_event_socket is installed, and configure it in autoload_configs/event_socket.conf.xml to taste
|
38
|
-
* Add an extension to your dialplan like so:
|
39
|
-
|
40
|
-
```xml
|
41
|
-
<extension name='Adhearsion'>
|
42
|
-
<condition field="destination_number" expression="^10$">
|
43
|
-
<action application="set" data="hangup_after_bridge=false"/>
|
44
|
-
<action application="set" data="park_after_bridge=true"/>
|
45
|
-
<action application='rayo'/>
|
46
|
-
</condition>
|
47
|
-
</extension>
|
48
|
-
```
|
49
|
-
|
50
|
-
* Connect Adhearsion via EventSocket, as per the sample config.
|
51
|
-
|
52
33
|
## Voxeo PRISM
|
53
34
|
|
54
35
|
Install the [rayo-server](https://github.com/rayo/rayo-server) app into PRISM 11 and follow the [configuration guide](https://github.com/rayo/rayo-server/wiki/Single-node-and-cluster-configuration-reference).
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
Adhearsion.config do |config|
|
4
|
+
<% unless options[:empty] %>
|
5
|
+
# Centralized way to specify any Adhearsion platform or plugin configuration
|
6
|
+
# - Execute rake config:show to view the active configuration values
|
7
|
+
#
|
8
|
+
# To update a plugin configuration you can write either:
|
9
|
+
#
|
10
|
+
# * Option 1
|
11
|
+
# Adhearsion.config.<plugin-name> do |config|
|
12
|
+
# config.<key> = <value>
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# * Option 2
|
16
|
+
# Adhearsion.config do |config|
|
17
|
+
# config.<plugin-name>.<key> = <value>
|
18
|
+
# end
|
19
|
+
<% end %>
|
20
|
+
config.development do |dev|
|
21
|
+
dev.platform.logging.level = :debug
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Use with Rayo (eg Voxeo PRISM or FreeSWITCH mod_rayo)
|
26
|
+
#
|
27
|
+
# config.punchblock.username = "usera@freeswitch.local-dev.mojolingo.com" # Your XMPP JID for use with Rayo
|
28
|
+
# config.punchblock.password = "1" # Your XMPP password
|
29
|
+
|
30
|
+
##
|
31
|
+
# Use with Asterisk
|
32
|
+
#
|
33
|
+
# config.punchblock.platform = :asterisk # Use Asterisk
|
34
|
+
# config.punchblock.username = "manager" # Your AMI username
|
35
|
+
# config.punchblock.password = "password" # Your AMI password
|
36
|
+
# config.punchblock.host = "asterisk.local-dev.mojolingo.com" # Your AMI host
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
Adhearsion::Events.draw do
|
4
|
+
<% unless options[:empty] %>
|
5
|
+
# Register global handlers for events
|
6
|
+
#
|
7
|
+
# eg. Handling Punchblock events
|
8
|
+
# punchblock do |event|
|
9
|
+
# ...
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# eg Handling PeerStatus AMI events
|
13
|
+
# ami :name => 'PeerStatus' do |event|
|
14
|
+
# ...
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
<% end %>
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
<% unless options[:empty] %>
|
4
|
+
require 'call_controllers/simon_game'
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
Adhearsion.router do
|
8
|
+
<% if options[:empty] %>
|
9
|
+
route 'default' do
|
10
|
+
|
11
|
+
end
|
12
|
+
<% else %>
|
13
|
+
#
|
14
|
+
# Specify your call routes, directing calls with particular attributes to a controller
|
15
|
+
#
|
16
|
+
|
17
|
+
route 'default', SimonGame
|
18
|
+
<% end %>
|
19
|
+
end
|
File without changes
|
File without changes
|
@@ -15,8 +15,8 @@ module Adhearsion
|
|
15
15
|
self.destination_root = '.'
|
16
16
|
empty_directory 'lib'
|
17
17
|
empty_directory 'spec'
|
18
|
-
template 'lib/controller.rb', "lib/#{@controller_name.underscore}.rb"
|
19
|
-
template 'spec/controller_spec.rb', "spec/#{@controller_name.underscore}_spec.rb"
|
18
|
+
template 'lib/controller.rb.erb', "lib/#{@controller_name.underscore}.rb"
|
19
|
+
template 'spec/controller_spec.rb.erb', "spec/#{@controller_name.underscore}_spec.rb"
|
20
20
|
end
|
21
21
|
|
22
22
|
end
|
File without changes
|
File without changes
|
@@ -13,25 +13,26 @@ module Adhearsion
|
|
13
13
|
def create_plugin
|
14
14
|
@plugin_file = @plugin_name.underscore
|
15
15
|
@plugin_name = @plugin_name.camelize
|
16
|
-
self.destination_root =
|
16
|
+
self.destination_root = @plugin_file
|
17
17
|
|
18
|
-
empty_directory
|
19
|
-
empty_directory "
|
20
|
-
empty_directory "
|
21
|
-
empty_directory "#{@plugin_file}/spec"
|
18
|
+
empty_directory "lib"
|
19
|
+
empty_directory "lib/#{@plugin_file}"
|
20
|
+
empty_directory "spec"
|
22
21
|
|
23
|
-
|
24
|
-
template 'Rakefile.tt', "#{@plugin_file}/Rakefile"
|
25
|
-
template 'README.md.tt', "#{@plugin_file}/README.md"
|
26
|
-
template 'Gemfile.tt', "#{@plugin_file}/Gemfile"
|
22
|
+
copy_file "gitignore", ".gitignore"
|
27
23
|
|
28
|
-
template '
|
29
|
-
template '
|
30
|
-
template '
|
31
|
-
template '
|
24
|
+
template 'plugin-template.gemspec.tt', "#{@plugin_file}.gemspec"
|
25
|
+
template 'Rakefile.tt', "Rakefile"
|
26
|
+
template 'README.md.tt', "README.md"
|
27
|
+
template 'Gemfile.tt', "Gemfile"
|
32
28
|
|
33
|
-
template '
|
34
|
-
template '
|
29
|
+
template 'lib/plugin-template.rb.tt', "lib/#{@plugin_file}.rb"
|
30
|
+
template 'lib/plugin-template/version.rb.tt', "lib/#{@plugin_file}/version.rb"
|
31
|
+
template 'lib/plugin-template/plugin.rb.tt', "lib/#{@plugin_file}/plugin.rb"
|
32
|
+
template 'lib/plugin-template/controller_methods.rb.tt', "lib/#{@plugin_file}/controller_methods.rb"
|
33
|
+
|
34
|
+
template 'spec/spec_helper.rb.tt', "spec/spec_helper.rb"
|
35
|
+
template 'spec/plugin-template/controller_methods_spec.rb.tt', "spec/#{@plugin_file}/controller_methods_spec.rb"
|
35
36
|
end
|
36
37
|
|
37
38
|
end
|
@@ -34,7 +34,7 @@ module Adhearsion
|
|
34
34
|
@mode = options[:mode]
|
35
35
|
@pid_file = options[:pid_file].nil? ? ENV['PID_FILE'] : options[:pid_file]
|
36
36
|
@loaded_init_files = options[:loaded_init_files]
|
37
|
-
Adhearsion.
|
37
|
+
Adhearsion.root = '.'
|
38
38
|
end
|
39
39
|
|
40
40
|
def start
|
@@ -42,6 +42,8 @@ module Adhearsion
|
|
42
42
|
resolve_pid_file_path
|
43
43
|
load_lib_folder
|
44
44
|
load_config_file
|
45
|
+
load_events_file
|
46
|
+
load_routes_file
|
45
47
|
initialize_log_paths
|
46
48
|
|
47
49
|
if should_daemonize?
|
@@ -195,6 +197,16 @@ module Adhearsion
|
|
195
197
|
require "#{Adhearsion.config.root}/config/adhearsion.rb"
|
196
198
|
end
|
197
199
|
|
200
|
+
def load_events_file
|
201
|
+
path = "#{Adhearsion.config.root}/config/events.rb"
|
202
|
+
require path if File.exists?(path)
|
203
|
+
end
|
204
|
+
|
205
|
+
def load_routes_file
|
206
|
+
path = "#{Adhearsion.config.root}/config/routes.rb"
|
207
|
+
require path if File.exists?(path)
|
208
|
+
end
|
209
|
+
|
198
210
|
def init_get_logging_appenders
|
199
211
|
@file_loggers ||= memoize_logging_appenders
|
200
212
|
end
|
@@ -249,7 +261,7 @@ module Adhearsion
|
|
249
261
|
end
|
250
262
|
|
251
263
|
def launch_console
|
252
|
-
|
264
|
+
Thread.new do
|
253
265
|
catching_standard_errors do
|
254
266
|
Adhearsion::Console.run
|
255
267
|
end
|
data/lib/adhearsion/logging.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Adhearsion
|
4
4
|
class OutboundCall < Call
|
5
|
-
execute_block_on_receiver :
|
5
|
+
execute_block_on_receiver :on_answer, :execute_controller_or_router_on_answer, *execute_block_on_receiver
|
6
6
|
|
7
7
|
attr_reader :dial_command
|
8
8
|
|
@@ -73,7 +73,7 @@ module Adhearsion
|
|
73
73
|
wait_timeout = 60
|
74
74
|
end
|
75
75
|
|
76
|
-
write_and_await_response(Punchblock::Command::Dial.new(options), wait_timeout).tap do |dial_command|
|
76
|
+
write_and_await_response(Punchblock::Command::Dial.new(options), wait_timeout, true).tap do |dial_command|
|
77
77
|
@dial_command = dial_command
|
78
78
|
Adhearsion.active_calls << current_actor
|
79
79
|
Adhearsion::Events.trigger_immediately :call_dialed, current_actor
|
@@ -95,15 +95,11 @@ module Adhearsion
|
|
95
95
|
def run_router_on_answer
|
96
96
|
register_event_handler Punchblock::Event::Answered do |event|
|
97
97
|
run_router
|
98
|
-
throw :pass
|
99
98
|
end
|
100
99
|
end
|
101
100
|
|
102
101
|
def on_answer(&block)
|
103
|
-
register_event_handler Punchblock::Event::Answered
|
104
|
-
block.call event
|
105
|
-
throw :pass
|
106
|
-
end
|
102
|
+
register_event_handler Punchblock::Event::Answered, &block
|
107
103
|
end
|
108
104
|
|
109
105
|
def execute_controller_or_router_on_answer(controller, metadata = {}, &controller_block)
|
@@ -127,7 +127,8 @@ module Adhearsion
|
|
127
127
|
|
128
128
|
def dispatch_offer(offer)
|
129
129
|
catching_standard_errors do
|
130
|
-
call =
|
130
|
+
call = Call.new(offer)
|
131
|
+
Adhearsion.active_calls << call
|
131
132
|
case Adhearsion::Process.state_name
|
132
133
|
when :booting, :rejecting
|
133
134
|
logger.info "Declining call because the process is not yet running."
|
@@ -144,7 +145,7 @@ module Adhearsion
|
|
144
145
|
if call = Adhearsion.active_calls[event.target_call_id]
|
145
146
|
call.async.deliver_message event
|
146
147
|
else
|
147
|
-
logger.
|
148
|
+
logger.warn "Event received for inactive call #{event.target_call_id}: #{event.inspect}"
|
148
149
|
end
|
149
150
|
end
|
150
151
|
|
@@ -38,10 +38,11 @@ module Adhearsion
|
|
38
38
|
|
39
39
|
call.execute_controller controller, lambda { |call_actor|
|
40
40
|
begin
|
41
|
-
if call_actor
|
42
|
-
logger.info "Call routing completed
|
43
|
-
else
|
41
|
+
if call_actor.auto_hangup
|
42
|
+
logger.info "Call routing completed. Hanging up now..."
|
44
43
|
call_actor.hangup
|
44
|
+
else
|
45
|
+
logger.info "Call routing completed, keeping the call alive at controller/router request."
|
45
46
|
end
|
46
47
|
rescue Call::Hangup, Call::ExpiredError
|
47
48
|
end
|
data/lib/adhearsion/version.rb
CHANGED