freeswitcher 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -44,8 +44,8 @@ Example of creating an Outbound Eventsocket listener:
44
44
 
45
45
  class OesDemo < FSR::Listener::Outbound
46
46
 
47
- def session_initiated(session)
48
- number = session.headers[:caller_caller_id_number] # Grab the inbound caller id
47
+ def session_initiated
48
+ number = @session.headers[:caller_caller_id_number] # Grab the inbound caller id
49
49
  FSR::Log.info "*** Answering incoming call from #{number}"
50
50
  answer # Answer the call
51
51
  set("hangup_after_bridge", "true")# Set a variable
@@ -71,16 +71,14 @@ Example of creating an Outbound Eventsocket listener that can read DTMF input an
71
71
 
72
72
  class DtmfDemo < FSR::Listener::Outbound
73
73
 
74
- def session_initiated(session, step = 0)
75
- @step ||= step
76
- exten = session.headers[:channel_caller_id_number]
74
+ def session_initiated
75
+ exten = @session.headers[:caller_caller_id_number]
77
76
  FSR::Log.info "*** Answering incoming call from #{exten}"
78
77
  answer # Answer the call
79
78
  end
80
79
 
81
80
  def receive_reply(reply)
82
- exten = @session.headers[:channel_caller_id_number]
83
- @step += 1
81
+ exten = @session.headers[:caller_caller_id_number]
84
82
  case @step
85
83
  when 1
86
84
  FSR::Log.info "*** Reading dtmf for #{exten}"
@@ -89,7 +87,7 @@ Example of creating an Outbound Eventsocket listener that can read DTMF input an
89
87
  FSR::Log.info "*** updating session for #{exten}"
90
88
  update_session
91
89
  when 3
92
- FSR::Log.info "** Success, grabbed #{reply.content[:variable_test].strip} from #{exten}"
90
+ FSR::Log.info "** Success, grabbed #{@session.headers[:variable_test].strip} from #{exten}"
93
91
  FSR::Log.info "*** Hanging up call"
94
92
  hangup # Hangup the call
95
93
  end
@@ -8,16 +8,14 @@ FSR.load_all_applications
8
8
  FSR.load_all_commands
9
9
  class DtmfDemo < FSR::Listener::Outbound
10
10
 
11
- def session_initiated(session, step = 0)
12
- @step ||= step
13
- exten = session.headers[:channel_caller_id_number]
11
+ def session_initiated
12
+ exten = @session.headers[:caller_caller_id_number]
14
13
  FSR::Log.info "*** Answering incoming call from #{exten}"
15
14
  answer # Answer the call
16
15
  end
17
16
 
18
17
  def receive_reply(reply)
19
- exten = @session.headers[:channel_caller_id_number]
20
- @step += 1
18
+ exten = @session.headers[:caller_caller_id_number]
21
19
  case @step
22
20
  when 1
23
21
  FSR::Log.info "*** Reading dtmf for #{exten}"
@@ -26,7 +24,7 @@ class DtmfDemo < FSR::Listener::Outbound
26
24
  FSR::Log.info "*** updating session for #{exten}"
27
25
  update_session
28
26
  when 3
29
- FSR::Log.info "** Success, grabbed #{reply.content[:variable_test].strip} from #{exten}"
27
+ FSR::Log.info "** Success, grabbed #{@session.headers[:variable_test].strip} from #{exten}"
30
28
  FSR::Log.info "*** Hanging up call"
31
29
  hangup # Hangup the call
32
30
  end
@@ -6,8 +6,8 @@ require "fsr/listener/outbound"
6
6
 
7
7
  class OesDemo < FSR::Listener::Outbound
8
8
 
9
- def session_initiated(session)
10
- number = session.headers[:caller_caller_id_number] # Grab the inbound caller id
9
+ def session_initiated
10
+ number = @session.headers[:caller_caller_id_number] # Grab the inbound caller id
11
11
  FSR::Log.info "*** Answering incoming call from #{number}"
12
12
  answer # Answer the call
13
13
  log("1", "Pong from the FSR event socket!")
data/lib/fsr.rb CHANGED
@@ -6,7 +6,7 @@ require 'pp'
6
6
  module FSR
7
7
  # Global configuration options
8
8
  #
9
- VERSION = '0.0.12'
9
+ VERSION = '0.0.13'
10
10
  FS_INSTALL_PATHS = ["/usr/local/freeswitch", "/opt/freeswitch", "/usr/freeswitch"]
11
11
  DEFAULT_CALLER_ID_NUMBER = '8675309'
12
12
  DEFAULT_CALLER_ID_NAME = "FSR"
@@ -7,6 +7,7 @@ module FSR
7
7
  load_all_applications
8
8
  module Listener
9
9
  class Outbound < EventMachine::Protocols::HeaderAndContentProtocol
10
+ attr_reader :session
10
11
 
11
12
  # Include FSR::App to get all the applications defined as methods
12
13
  include FSR::App
@@ -15,40 +16,23 @@ module FSR
15
16
  SENDMSG_METHOD_DEFINITION = "def %s(*args, &block); sendmsg super; end"
16
17
  APPLICATIONS.each { |app, obj| module_eval(SENDMSG_METHOD_DEFINITION % app.to_s) }
17
18
 
18
- def post_init
19
- @session = nil # holds the session object
20
- send_data("connect\n\n")
21
- FSR::Log.debug "Accepting connections."
19
+ # session_initiated is called when a @session is first created.
20
+ # Overwrite this in your worker class with the call/channel
21
+ # handling logic you desire
22
+ def session_initiated
23
+ FSR::Log.warn "#{self.class.name}#session_initiated not overwritten"
24
+ FSR::Log.debug session_data.inspect
22
25
  end
23
26
 
24
- def receive_request(header, content)
25
- hash_header = headers_2_hash(header)
26
- hash_content = headers_2_hash(content)
27
- session = HeaderAndContentResponse.new({:headers => hash_header, :content => hash_content})
28
- if @session.nil?
29
- @session = session
30
- session_initiated(session)
31
- else
32
- if session.headers[:event_name].nil?
33
- receive_reply(session)
34
- else
35
- if session.headers[:event_name].to_s.match(/CHANNEL_DATA/i)
36
- @session = session
37
- receive_reply(HeaderAndConentResponse.new({:headers => {:session => "update"}, :content => {}}))
38
- end
39
- end
40
- end
41
- end
42
-
43
- # Received data dispatches the data received by the EM socket,
44
- # Either as a Session, a continuation of a Session, or as a Session's last CommandReply
45
-
46
- def session_initiated(session)
47
- session
48
- end
49
-
50
- def receive_reply(session)
51
- session
27
+ # receive_reply is called when a response is received.
28
+ # Overwrite this in your worker class with the call/channel
29
+ # handling logic you desire, taking @step into account for
30
+ # state management between commands
31
+ # @param reply This HeaderAndContent instance will have the channel variables
32
+ # in #content, if the session has been updated
33
+ def receive_reply(reply)
34
+ FSR::Log.warn "#{self.class.name}#receive_reply not overwritten"
35
+ FSR::Log.debug reply.inspect
52
36
  end
53
37
 
54
38
  # sendmsg sends data to the EM app socket via #send_data, or
@@ -69,7 +53,50 @@ module FSR
69
53
  send_data("api uuid_dump #{@session.headers[:unique_id]}\n\n")
70
54
  end
71
55
 
56
+ protected
57
+ def post_init
58
+ @session = nil # holds the session object
59
+ send_data("connect\n\n")
60
+ FSR::Log.debug "Accepting connections."
61
+ end
62
+
63
+ # receive_request is called each time data is received by the event machine
64
+ # it will manipulate the received data into either a new session or a reply,
65
+ # to be picked up by #session_initiated or #receive_reply.
66
+ # If your listener is listening for events, this will also renew your @session
67
+ # each time you receive a CHANNEL_DATA event.
68
+ # @param header The header of the request, as passed by HeaderAndContentProtocol
69
+ # @param content The content of the request, as passed by HeaderAndContentProtocol
70
+ #
71
+ # @returns HeaderAndContentResponse
72
+ def receive_request(header, content)
73
+ hash_header = headers_2_hash(header)
74
+ hash_content = headers_2_hash(content)
75
+ session_header_and_content = HeaderAndContentResponse.new({:headers => hash_header, :content => hash_content})
76
+ # If we're a new session, call session initiate
77
+ if @session.nil?
78
+ @session = session_header_and_content
79
+ @step = 0
80
+ session_initiated
81
+ elsif session_header_and_content.content[:event_name] # If content includes an event_name, it must be a response from an api command
82
+ if session_header_and_content.content[:event_name].to_s.match(/CHANNEL_DATA/i) # Anytime we see CHANNEL_DATA event, we want to update our @session
83
+ session_header_and_content = HeaderAndContentResponse.new({:headers => hash_header.merge(hash_content.strip_value_newlines), :content => {}})
84
+ @session = session_header_and_content
85
+ @step += 1
86
+ receive_reply(hash_header)
87
+ end
88
+ else
89
+ @step += 1
90
+ receive_reply(session_header_and_content)
91
+ end
92
+ end
93
+
72
94
  end
95
+ end
96
+ end
73
97
 
98
+ class Hash
99
+ def strip_value_newlines
100
+ Hash[self.map { |k,v| v.respond_to?(:to_s) ? [k, v.to_s.strip] : [k, v] }]
74
101
  end
75
102
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: freeswitcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jayson Vaughn
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: "0"
27
27
  version:
28
- description: "========================================================= FreeSWITCHeR Copyright (c) 2009 The Rubyists (Jayson Vaughn, Tj Vanderpoel, Michael Fellinger, Kevin Berry) Distributed under the terms of the MIT License. ========================================================== About ----- *** STILL UNDER HEAVY DEVELOPMENT *** A ruby library for interacting with the \"FreeSWITCH\" (http://www.freeswitch.org) opensource telephony platform *** STILL UNDER HEAVY DEVELOPMENT *** Requirements ------------ - ruby (>= 1.8) - eventmachine (If you wish to use Outbound and Inbound listener) Usage ----- Example of originating a new call in 'irb' using FSR::CommandSocket#originate: irb(main):001:0> require 'fsr' => true irb(main):002:0> FSR.load_all_commands => [:sofia, :originate] irb(main):003:0> sock = FSR::CommandSocket.new => #<FSR::CommandSocket:0xb7a89104 @server=\"127.0.0.1\", @socket=#<TCPSocket:0xb7a8908c>, @port=\"8021\", @auth=\"ClueCon\"> irb(main):007:0> sock.originate(:target => 'sofia/gateway/carlos/8179395222', :endpoint => FSR::App::Bridge.new(\"user/bougyman\")).run => {\"Job-UUID\"=>\"732075a4-7dd5-4258-b124-6284a82a5ae7\", \"body\"=>\"\", \"Content-Type\"=>\"command/reply\", \"Reply-Text\"=>\"+OK Job-UUID: 732075a4-7dd5-4258-b124-6284a82a5ae7\"} Example of creating an Outbound Eventsocket listener: #!/usr/bin/env ruby require 'fsr' require \"fsr/listener/outbound\" class OesDemo < FSR::Listener::Outbound def session_initiated(session) number = session.headers[:caller_caller_id_number] # Grab the inbound caller id FSR::Log.info \"*** Answering incoming call from #{number}\" answer # Answer the call set(\"hangup_after_bridge\", \"true\")# Set a variable speak 'Hello, This is your phone switch. Have a great day' # use mod_flite to speak hangup # Hangup the call end end FSR.start_oes!(OesDemo, :port => 1888, :host => \"localhost\") Example of creating an Outbound Eventsocket listener that can read DTMF input and keep state: #!/usr/bin/env ruby require 'fsr' require 'fsr/listener/outbound' FSR.load_all_applications FSR.load_all_commands class DtmfDemo < FSR::Listener::Outbound def session_initiated(session, step = 0) @step ||= step exten = session.headers[:channel_caller_id_number] FSR::Log.info \"*** Answering incoming call from #{exten}\" answer # Answer the call end def receive_reply(reply) exten = @session.headers[:channel_caller_id_number] @step += 1 case @step when 1 FSR::Log.info \"*** Reading dtmf for #{exten}\" read \"/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav\",4,10,\"test\",15000 # read test when 2 FSR::Log.info \"*** updating session for #{exten}\" update_session when 3 FSR::Log.info \"** Success, grabbed #{reply.content[:variable_test].strip} from #{exten}\" FSR::Log.info \"*** Hanging up call\" hangup # Hangup the call end end end FSR.start_oes! DtmfDemo, :port => 8084, :host => \"127.0.0.1\" Example of creating an Inbound Eventsocket listener: #!/usr/bin/env ruby require 'fsr' require 'fsr/listener/inbound' require 'pp' class IesDemo < FSR::Listener::Inbound def on_event(event) pp event.headers pp event.content[:event_name] end end FSR.start_ies!(IesDemo, :host => \"localhost\", :port => 8021) Support ------- Home page at http://code.rubyists.com/projects/fs #rubyists on FreeNode"
28
+ description: "========================================================= FreeSWITCHeR Copyright (c) 2009 The Rubyists (Jayson Vaughn, Tj Vanderpoel, Michael Fellinger, Kevin Berry) Distributed under the terms of the MIT License. ========================================================== About ----- *** STILL UNDER HEAVY DEVELOPMENT *** A ruby library for interacting with the \"FreeSWITCH\" (http://www.freeswitch.org) opensource telephony platform *** STILL UNDER HEAVY DEVELOPMENT *** Requirements ------------ - ruby (>= 1.8) - eventmachine (If you wish to use Outbound and Inbound listener) Usage ----- Example of originating a new call in 'irb' using FSR::CommandSocket#originate: irb(main):001:0> require 'fsr' => true irb(main):002:0> FSR.load_all_commands => [:sofia, :originate] irb(main):003:0> sock = FSR::CommandSocket.new => #<FSR::CommandSocket:0xb7a89104 @server=\"127.0.0.1\", @socket=#<TCPSocket:0xb7a8908c>, @port=\"8021\", @auth=\"ClueCon\"> irb(main):007:0> sock.originate(:target => 'sofia/gateway/carlos/8179395222', :endpoint => FSR::App::Bridge.new(\"user/bougyman\")).run => {\"Job-UUID\"=>\"732075a4-7dd5-4258-b124-6284a82a5ae7\", \"body\"=>\"\", \"Content-Type\"=>\"command/reply\", \"Reply-Text\"=>\"+OK Job-UUID: 732075a4-7dd5-4258-b124-6284a82a5ae7\"} Example of creating an Outbound Eventsocket listener: #!/usr/bin/env ruby require 'fsr' require \"fsr/listener/outbound\" class OesDemo < FSR::Listener::Outbound def session_initiated number = @session.headers[:caller_caller_id_number] # Grab the inbound caller id FSR::Log.info \"*** Answering incoming call from #{number}\" answer # Answer the call set(\"hangup_after_bridge\", \"true\")# Set a variable speak 'Hello, This is your phone switch. Have a great day' # use mod_flite to speak hangup # Hangup the call end end FSR.start_oes!(OesDemo, :port => 1888, :host => \"localhost\") Example of creating an Outbound Eventsocket listener that can read DTMF input and keep state: #!/usr/bin/env ruby require 'fsr' require 'fsr/listener/outbound' FSR.load_all_applications FSR.load_all_commands class DtmfDemo < FSR::Listener::Outbound def session_initiated exten = @session.headers[:caller_caller_id_number] FSR::Log.info \"*** Answering incoming call from #{exten}\" answer # Answer the call end def receive_reply(reply) exten = @session.headers[:caller_caller_id_number] case @step when 1 FSR::Log.info \"*** Reading dtmf for #{exten}\" read \"/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav\",4,10,\"test\",15000 # read test when 2 FSR::Log.info \"*** updating session for #{exten}\" update_session when 3 FSR::Log.info \"** Success, grabbed #{@session.headers[:variable_test].strip} from #{exten}\" FSR::Log.info \"*** Hanging up call\" hangup # Hangup the call end end end FSR.start_oes! DtmfDemo, :port => 8084, :host => \"127.0.0.1\" Example of creating an Inbound Eventsocket listener: #!/usr/bin/env ruby require 'fsr' require 'fsr/listener/inbound' require 'pp' class IesDemo < FSR::Listener::Inbound def on_event(event) pp event.headers pp event.content[:event_name] end end FSR.start_ies!(IesDemo, :host => \"localhost\", :port => 8021) Support ------- Home page at http://code.rubyists.com/projects/fs #rubyists on FreeNode"
29
29
  email: FreeSWITCHeR@rubyists.com
30
30
  executables: []
31
31
 
@@ -147,8 +147,8 @@ post_install_message: |
147
147
 
148
148
  class OesDemo < FSR::Listener::Outbound
149
149
 
150
- def session_initiated(session)
151
- number = session.headers[:caller_caller_id_number] # Grab the inbound caller id
150
+ def session_initiated
151
+ number = @session.headers[:caller_caller_id_number] # Grab the inbound caller id
152
152
  FSR::Log.info "*** Answering incoming call from #{number}"
153
153
  answer # Answer the call
154
154
  set("hangup_after_bridge", "true")# Set a variable
@@ -174,16 +174,14 @@ post_install_message: |
174
174
 
175
175
  class DtmfDemo < FSR::Listener::Outbound
176
176
 
177
- def session_initiated(session, step = 0)
178
- @step ||= step
179
- exten = session.headers[:channel_caller_id_number]
177
+ def session_initiated
178
+ exten = @session.headers[:caller_caller_id_number]
180
179
  FSR::Log.info "*** Answering incoming call from #{exten}"
181
180
  answer # Answer the call
182
181
  end
183
182
 
184
183
  def receive_reply(reply)
185
- exten = @session.headers[:channel_caller_id_number]
186
- @step += 1
184
+ exten = @session.headers[:caller_caller_id_number]
187
185
  case @step
188
186
  when 1
189
187
  FSR::Log.info "*** Reading dtmf for #{exten}"
@@ -192,7 +190,7 @@ post_install_message: |
192
190
  FSR::Log.info "*** updating session for #{exten}"
193
191
  update_session
194
192
  when 3
195
- FSR::Log.info "** Success, grabbed #{reply.content[:variable_test].strip} from #{exten}"
193
+ FSR::Log.info "** Success, grabbed #{@session.headers[:variable_test].strip} from #{exten}"
196
194
  FSR::Log.info "*** Hanging up call"
197
195
  hangup # Hangup the call
198
196
  end