Class: Punchblock::Translator::Asterisk
- Inherits:
-
Object
- Object
- Punchblock::Translator::Asterisk
show all
- Extended by:
- ActiveSupport::Autoload
- Includes:
- Celluloid
- Defined in:
- lib/punchblock/translator/asterisk.rb,
lib/punchblock/translator/asterisk/call.rb,
lib/punchblock/translator/asterisk/component.rb,
lib/punchblock/translator/asterisk/component/input.rb,
lib/punchblock/translator/asterisk/component/output.rb,
lib/punchblock/translator/asterisk/component/record.rb,
lib/punchblock/translator/asterisk/component/asterisk.rb,
lib/punchblock/translator/asterisk/component/stop_by_redirect.rb,
lib/punchblock/translator/asterisk/component/asterisk/ami_action.rb,
lib/punchblock/translator/asterisk/component/asterisk/agi_command.rb
Defined Under Namespace
Modules: Component
Classes: Call
Constant Summary
collapse
- REDIRECT_CONTEXT =
'adhearsion-redirect'
- REDIRECT_EXTENSION =
'1'
- REDIRECT_PRIORITY =
'1'
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
#initialize(ami_client, connection, media_engine = nil) ⇒ Asterisk
Returns a new instance of Asterisk.
24
25
26
27
28
|
# File 'lib/punchblock/translator/asterisk.rb', line 24
def initialize(ami_client, connection, media_engine = nil)
@ami_client, @connection, @media_engine = ami_client, connection, media_engine
@calls, @components, @channel_to_call_id = {}, {}, {}
@fully_booted_count = 0
end
|
Instance Attribute Details
#ami_client ⇒ Object
Returns the value of attribute ami_client.
16
17
18
|
# File 'lib/punchblock/translator/asterisk.rb', line 16
def ami_client
@ami_client
end
|
Returns the value of attribute calls.
16
17
18
|
# File 'lib/punchblock/translator/asterisk.rb', line 16
def calls
@calls
end
|
#connection ⇒ Object
Returns the value of attribute connection.
16
17
18
|
# File 'lib/punchblock/translator/asterisk.rb', line 16
def connection
@connection
end
|
Returns the value of attribute media_engine.
16
17
18
|
# File 'lib/punchblock/translator/asterisk.rb', line 16
def media_engine
@media_engine
end
|
Instance Method Details
#actor_died(actor, reason) ⇒ Object
155
156
157
158
159
160
161
162
163
|
# File 'lib/punchblock/translator/asterisk.rb', line 155
def actor_died(actor, reason)
return unless reason
if id = @calls.key(actor)
@calls.delete id
end_event = Punchblock::Event::End.new :target_call_id => id,
:reason => :error
handle_pb_event end_event
end
end
|
#call_for_channel(channel) ⇒ Object
44
45
46
|
# File 'lib/punchblock/translator/asterisk.rb', line 44
def call_for_channel(channel)
call_with_id @channel_to_call_id[channel]
end
|
#call_with_id(call_id) ⇒ Object
40
41
42
|
# File 'lib/punchblock/translator/asterisk.rb', line 40
def call_with_id(call_id)
@calls[call_id]
end
|
#check_recording_directory ⇒ Object
151
152
153
|
# File 'lib/punchblock/translator/asterisk.rb', line 151
def check_recording_directory
pb_logger.warning "Recordings directory #{Component::Record::RECORDING_BASE_PATH} does not exist. Recording might not work. This warning can be ignored if Adhearsion is running on a separate machine than Asterisk. See http://adhearsion.com/docs/call-controllers#recording" unless File.exists?(Component::Record::RECORDING_BASE_PATH)
end
|
#component_with_id(component_id) ⇒ Object
52
53
54
|
# File 'lib/punchblock/translator/asterisk.rb', line 52
def component_with_id(component_id)
@components[component_id]
end
|
#deregister_call(call) ⇒ Object
35
36
37
38
|
# File 'lib/punchblock/translator/asterisk.rb', line 35
def deregister_call(call)
@channel_to_call_id.delete call.channel
@calls.delete call.id
end
|
#execute_call_command(command) ⇒ Object
103
104
105
106
107
108
109
|
# File 'lib/punchblock/translator/asterisk.rb', line 103
def execute_call_command(command)
if call = call_with_id(command.target_call_id)
call.execute_command! command
else
command.response = ProtocolError.new.setup :item_not_found, "Could not find a call with ID #{command.target_call_id}", command.target_call_id
end
end
|
#execute_command(command, options = {}) ⇒ Object
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
# File 'lib/punchblock/translator/asterisk.rb', line 88
def execute_command(command, options = {})
command.request!
command.target_call_id ||= options[:call_id]
command.component_id ||= options[:component_id]
if command.target_call_id
execute_call_command command
elsif command.component_id
execute_component_command command
else
execute_global_command command
end
end
|
#execute_component_command(command) ⇒ Object
111
112
113
114
115
116
117
|
# File 'lib/punchblock/translator/asterisk.rb', line 111
def execute_component_command(command)
if (component = component_with_id(command.component_id))
component.execute_command! command
else
command.response = ProtocolError.new.setup :item_not_found, "Could not find a component with ID #{command.component_id}", command.target_call_id, command.component_id
end
end
|
#execute_global_command(command) ⇒ Object
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# File 'lib/punchblock/translator/asterisk.rb', line 119
def execute_global_command(command)
case command
when Punchblock::Component::Asterisk::AMI::Action
component = Component::Asterisk::AMIAction.new command, current_actor
register_component component
component.execute!
when Punchblock::Command::Dial
call = Call.new_link command.to, current_actor
register_call call
call.dial! command
else
command.response = ProtocolError.new.setup 'command-not-acceptable', "Did not understand command"
end
end
|
#handle_ami_event(event) ⇒ Object
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/punchblock/translator/asterisk.rb', line 61
def handle_ami_event(event)
return unless event.is_a? RubyAMI::Event
if event.name.downcase == "fullybooted"
@fully_booted_count += 1
if @fully_booted_count >= 2
handle_pb_event Connection::Connected.new
@fully_booted_count = 0
run_at_fully_booted
end
return
end
handle_varset_ami_event event
ami_dispatch_to_or_create_call event
unless ami_event_known_call?(event)
handle_pb_event Event::Asterisk::AMI::Event.new(:name => event.name, :attributes => event.)
end
end
|
#handle_pb_event(event) ⇒ Object
84
85
86
|
# File 'lib/punchblock/translator/asterisk.rb', line 84
def handle_pb_event(event)
connection.handle_event event
end
|
#register_call(call) ⇒ Object
30
31
32
33
|
# File 'lib/punchblock/translator/asterisk.rb', line 30
def register_call(call)
@channel_to_call_id[call.channel] = call.id
@calls[call.id] ||= call
end
|
#register_component(component) ⇒ Object
48
49
50
|
# File 'lib/punchblock/translator/asterisk.rb', line 48
def register_component(component)
@components[component.id] ||= component
end
|
#run_at_fully_booted ⇒ Object
138
139
140
141
142
143
144
145
146
147
148
149
|
# File 'lib/punchblock/translator/asterisk.rb', line 138
def run_at_fully_booted
send_ami_action('Command', {
'Command' => "dialplan add extension #{REDIRECT_EXTENSION},#{REDIRECT_PRIORITY},AGI,agi:async into #{REDIRECT_CONTEXT}"
})
send_ami_action('Command', {
'Command' => "dialplan show #{REDIRECT_CONTEXT}"
}) do |result|
if result.text_body =~ /failed/
pb_logger.error "Punchblock failed to add the #{REDIRECT_EXTENSION} extension to the #{REDIRECT_CONTEXT} context. Please add a [#{REDIRECT_CONTEXT}] entry to your dialplan."
end
end
end
|
#send_ami_action(name, headers = {}, &block) ⇒ Object
134
135
136
|
# File 'lib/punchblock/translator/asterisk.rb', line 134
def send_ami_action(name, = {}, &block)
ami_client.send_action name, , &block
end
|
56
57
58
59
|
# File 'lib/punchblock/translator/asterisk.rb', line 56
def shutdown
@calls.values.each(&:shutdown!)
current_actor.terminate!
end
|