freeswitcher 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/README +43 -0
- data/examples/dtmf_test.rb +37 -0
- data/{bin → examples}/ies_demo.rb +0 -0
- data/{bin → examples}/ies_demo_with_hook.rb +0 -2
- data/{bin → examples}/oes_demo.rb +0 -0
- data/lib/fsr.rb +1 -1
- data/lib/fsr/app/hangup.rb +3 -3
- data/lib/fsr/app/playback.rb +2 -3
- data/lib/fsr/app/read.rb +22 -0
- data/lib/fsr/app/transfer.rb +2 -2
- data/lib/fsr/app/uuid_dump.rb +22 -0
- data/lib/fsr/app/uuid_getvar.rb +23 -0
- data/lib/fsr/app/uuid_setvar.rb +24 -0
- data/lib/fsr/listener/outbound.rb +15 -2
- data/spec/fsr/app/hangup.rb +16 -0
- data/spec/fsr/app/log.rb +11 -0
- data/spec/fsr/app/playback.rb +11 -0
- data/spec/fsr/app/set.rb +12 -0
- data/spec/fsr/app/transfer.rb +11 -0
- data/spec/fsr/listener/inbound.rb +7 -0
- data/spec/fsr/loading.rb +1 -1
- metadata +60 -9
- data/bin/cmd_demo.rb +0 -19
- data/bin/oes_demo2.rb +0 -26
data/README
CHANGED
@@ -59,6 +59,49 @@ Example of creating an Outbound Eventsocket listener:
|
|
59
59
|
|
60
60
|
|
61
61
|
|
62
|
+
Example of creating an Outbound Eventsocket listener that can read DTMF input and keep state:
|
63
|
+
|
64
|
+
#!/usr/bin/env ruby
|
65
|
+
|
66
|
+
require "fsr/listener/outbound"
|
67
|
+
require 'pp'
|
68
|
+
|
69
|
+
FSR.load_all_applications
|
70
|
+
FSR.load_all_commands
|
71
|
+
|
72
|
+
class DtmfDemo < FSR::Listener::Outbound
|
73
|
+
|
74
|
+
def session_initiated(session, step = 0)
|
75
|
+
@step ||= step
|
76
|
+
exten = session.headers[:channel_caller_id_number]
|
77
|
+
pp session.headers
|
78
|
+
FSR::Log.info "*** Answering incoming call from #{exten}"
|
79
|
+
answer # Answer the call
|
80
|
+
end
|
81
|
+
|
82
|
+
def receive_reply(reply)
|
83
|
+
exten = @session.headers[:channel_caller_id_number]
|
84
|
+
@step += 1
|
85
|
+
case @step
|
86
|
+
when 1
|
87
|
+
FSR::Log.info "*** Reading dtmf for #{exten}"
|
88
|
+
read "/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav",4,10,"test",15000 # read test
|
89
|
+
when 2
|
90
|
+
FSR::Log.info "*** updating session for #{exten}"
|
91
|
+
update_session
|
92
|
+
when 3
|
93
|
+
FSR::Log.info "** Success, grabbed #{reply.content[:variable_test].strip} from #{exten}"
|
94
|
+
FSR::Log.info "*** Hanging up call"
|
95
|
+
hangup # Hangup the call
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
FSR.start_oes! DtmfDemo, :port => 8084, :host => "127.0.0.1"
|
102
|
+
|
103
|
+
|
104
|
+
|
62
105
|
Example of creating an Inbound Eventsocket listener:
|
63
106
|
|
64
107
|
#!/usr/bin/env ruby
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'eventmachine'
|
3
|
+
require "fsr/listener/outbound"
|
4
|
+
require 'pp'
|
5
|
+
$stdout.flush
|
6
|
+
FSR.load_all_applications
|
7
|
+
FSR.load_all_commands
|
8
|
+
class DtmfDemo < FSR::Listener::Outbound
|
9
|
+
|
10
|
+
def session_initiated(session, step = 0)
|
11
|
+
@step ||= step
|
12
|
+
exten = session.headers[:channel_caller_id_number]
|
13
|
+
pp session.headers
|
14
|
+
FSR::Log.info "*** Answering incoming call from #{exten}"
|
15
|
+
answer # Answer the call
|
16
|
+
end
|
17
|
+
|
18
|
+
def receive_reply(reply)
|
19
|
+
exten = @session.headers[:channel_caller_id_number]
|
20
|
+
@step += 1
|
21
|
+
case @step
|
22
|
+
when 1
|
23
|
+
FSR::Log.info "*** Reading dtmf for #{exten}"
|
24
|
+
read "/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav",4,10,"test",15000 # read test
|
25
|
+
when 2
|
26
|
+
FSR::Log.info "*** updating session for #{exten}"
|
27
|
+
update_session
|
28
|
+
when 3
|
29
|
+
FSR::Log.info "** Success, grabbed #{reply.content[:variable_test].strip} from #{exten}"
|
30
|
+
FSR::Log.info "*** Hanging up call"
|
31
|
+
hangup # Hangup the call
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
FSR.start_oes! DtmfDemo, :port => 8084, :host => "127.0.0.1"
|
File without changes
|
File without changes
|
data/lib/fsr.rb
CHANGED
data/lib/fsr/app/hangup.rb
CHANGED
@@ -3,12 +3,12 @@ module FSR
|
|
3
3
|
module App
|
4
4
|
# http://wiki.freeswitch.org/wiki/Misc._Dialplan_Tools_hangup
|
5
5
|
class Hangup < Application
|
6
|
-
def initialize(
|
7
|
-
@
|
6
|
+
def initialize(cause = nil)
|
7
|
+
@cause = cause
|
8
8
|
end
|
9
9
|
|
10
10
|
def arguments
|
11
|
-
@
|
11
|
+
@cause
|
12
12
|
end
|
13
13
|
|
14
14
|
def sendmsg
|
data/lib/fsr/app/playback.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
require "fsr/app"
|
3
2
|
module FSR
|
4
3
|
module App
|
@@ -10,11 +9,11 @@ module FSR
|
|
10
9
|
@wavfile = wavfile
|
11
10
|
end
|
12
11
|
def arguments
|
13
|
-
|
12
|
+
@wavfile
|
14
13
|
end
|
15
14
|
|
16
15
|
def sendmsg
|
17
|
-
"call-command: execute\nexecute-app-name: %s\nexecute-app-arg: %s\nevent-lock:true\n\n" % [app_name, arguments
|
16
|
+
"call-command: execute\nexecute-app-name: %s\nexecute-app-arg: %s\nevent-lock:true\n\n" % [app_name, arguments]
|
18
17
|
end
|
19
18
|
end
|
20
19
|
|
data/lib/fsr/app/read.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "fsr/app"
|
2
|
+
module FSR
|
3
|
+
# http://wiki.freeswitch.org/wiki/Misc._Dialplan_Tools_read
|
4
|
+
module App
|
5
|
+
class Read < Application
|
6
|
+
def initialize(sound_file, min = 0, max = 10, chan_var = "fsr_read_dtmf", timeout = 10000, terminators = ["#"])
|
7
|
+
@sound_file, @min, @max, @chan_var, @timeout, @terminators = sound_file, min, max, chan_var, timeout, terminators
|
8
|
+
end
|
9
|
+
|
10
|
+
def arguments
|
11
|
+
[@min, @max, @sound_file, @chan_var, @timeout, @terminators.join(",")]
|
12
|
+
end
|
13
|
+
|
14
|
+
def sendmsg
|
15
|
+
"call-command: execute\nexecute-app-name: %s\nexecute-app-arg: %s\nevent-lock:true\n\n" % [app_name, arguments.join(" ")]
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
register(:read, Read)
|
21
|
+
end
|
22
|
+
end
|
data/lib/fsr/app/transfer.rb
CHANGED
@@ -6,8 +6,8 @@ module FSR
|
|
6
6
|
|
7
7
|
def initialize(destination_number, dialplan = nil, context = nil)
|
8
8
|
@destination_number = destination_number
|
9
|
-
@dialplan = dialplan
|
10
|
-
@context = context
|
9
|
+
@dialplan = dialplan
|
10
|
+
@context = context
|
11
11
|
end
|
12
12
|
|
13
13
|
def arguments
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "fsr/app"
|
2
|
+
module FSR
|
3
|
+
#http://wiki.freeswitch.org/wiki/Mod_commands#uuid_dump
|
4
|
+
module App
|
5
|
+
class UuidDump < Application
|
6
|
+
def initialize(uuid)
|
7
|
+
@uuid = uuid # Unique channel ID
|
8
|
+
end
|
9
|
+
|
10
|
+
def arguments
|
11
|
+
[@uuid]
|
12
|
+
end
|
13
|
+
|
14
|
+
def sendmsg
|
15
|
+
"call-command: execute\nexecute-app-name: %s\nexecute-app-arg: %s\nevent-lock:true\n\n" % [app_name, arguments.join(" ")]
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
register(:uuid_dump, UuidDump)
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "fsr/app"
|
2
|
+
module FSR
|
3
|
+
#http://wiki.freeswitch.org/wiki/Mod_commands#uuid_getvar
|
4
|
+
module App
|
5
|
+
class UuidGetVar < Application
|
6
|
+
def initialize(uuid, var)
|
7
|
+
@uuid = uuid # Unique channel ID
|
8
|
+
@var = var # Channel variable you wish to 'get'
|
9
|
+
end
|
10
|
+
|
11
|
+
def arguments
|
12
|
+
[@uuid, @var]
|
13
|
+
end
|
14
|
+
|
15
|
+
def sendmsg
|
16
|
+
"call-command: execute\nexecute-app-name: %s\nexecute-app-arg: %s\nevent-lock:true\n\n" % [app_name, arguments.join(" ")]
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
register(:uuid_getvar, UuidGetVar)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "fsr/app"
|
2
|
+
module FSR
|
3
|
+
#http://wiki.freeswitch.org/wiki/Mod_commands#uuid_setvar
|
4
|
+
module App
|
5
|
+
class UuidSetVar < Application
|
6
|
+
def initialize(uuid, var, assignment)
|
7
|
+
@uuid = uuid # Unique channel ID
|
8
|
+
@var = var # Channel variable you wish to 'set'
|
9
|
+
@assignment
|
10
|
+
end
|
11
|
+
|
12
|
+
def arguments
|
13
|
+
[@uuid, @var, @assignment]
|
14
|
+
end
|
15
|
+
|
16
|
+
def sendmsg
|
17
|
+
"call-command: execute\nexecute-app-name: %s\nexecute-app-arg: %s\nevent-lock:true\n\n" % [app_name, arguments.join(" ")]
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
register(:uuid_setvar, UuidSetVar)
|
23
|
+
end
|
24
|
+
end
|
@@ -26,10 +26,17 @@ module FSR
|
|
26
26
|
hash_content = headers_2_hash(content)
|
27
27
|
session = HeaderAndContentResponse.new({:headers => hash_header, :content => hash_content})
|
28
28
|
if @session.nil?
|
29
|
-
@session =
|
29
|
+
@session = session
|
30
30
|
session_initiated(session)
|
31
31
|
else
|
32
|
-
|
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
|
33
40
|
end
|
34
41
|
end
|
35
42
|
|
@@ -56,6 +63,12 @@ module FSR
|
|
56
63
|
self.respond_to?(:send_data) ? send_data(message) : message
|
57
64
|
end
|
58
65
|
|
66
|
+
# Update_session
|
67
|
+
|
68
|
+
def update_session
|
69
|
+
send_data("api uuid_dump #{@session.headers[:unique_id]}\n\n")
|
70
|
+
end
|
71
|
+
|
59
72
|
end
|
60
73
|
|
61
74
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec/helper'
|
2
|
+
require "fsr/app"
|
3
|
+
FSR::App.load_application("hangup")
|
4
|
+
|
5
|
+
describe "Testing FSR::App::Hangup" do
|
6
|
+
it "Hangs up the channel" do
|
7
|
+
hangup = FSR::App::Hangup.new
|
8
|
+
hangup.sendmsg.should == "call-command: execute\nexecute-app-name: hangup\nexecute-app-arg: \n\n"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "Hangs up the channel using a hangup cause" do
|
12
|
+
hangup = FSR::App::Hangup.new("USER_BUSY")
|
13
|
+
hangup.sendmsg.should == "call-command: execute\nexecute-app-name: hangup\nexecute-app-arg: USER_BUSY\n\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/spec/fsr/app/log.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec/helper'
|
2
|
+
require "fsr/app"
|
3
|
+
FSR::App.load_application("log")
|
4
|
+
|
5
|
+
describe "Testing FSR::App::Log" do
|
6
|
+
it "Logs to the console" do
|
7
|
+
log = FSR::App::Log.new(1, "This is a test! :-)")
|
8
|
+
log.sendmsg.should == "call-command: execute\nexecute-app-name: log\nexecute-app-arg: 1 This is a test! :-)\nevent-lock:true\n\n"
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec/helper'
|
2
|
+
require "fsr/app"
|
3
|
+
FSR::App.load_application("playback")
|
4
|
+
|
5
|
+
describe "Testing FSR::App::Playback" do
|
6
|
+
it "Plays a file or stream" do
|
7
|
+
playback = FSR::App::Playback.new("shout://scfire-ntc-aa01.stream.aol.com/stream/1035")
|
8
|
+
playback.sendmsg.should == "call-command: execute\nexecute-app-name: playback\nexecute-app-arg: shout://scfire-ntc-aa01.stream.aol.com/stream/1035\nevent-lock:true\n\n"
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
data/spec/fsr/app/set.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec/helper'
|
2
|
+
require "fsr/app"
|
3
|
+
FSR::App.load_application("set")
|
4
|
+
|
5
|
+
describe "Testing FSR::App::Set" do
|
6
|
+
# Utilize the [] shortcut to start a conference
|
7
|
+
it "Sets a single variable" do
|
8
|
+
set = FSR::App::Set.new("hangup_after_bridge", true)
|
9
|
+
set.sendmsg.should == "call-command: execute\nexecute-app-name: set\nexecute-app-arg: hangup_after_bridge=true\nevent-lock:true\n\n"
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec/helper'
|
2
|
+
require "fsr/app"
|
3
|
+
FSR::App.load_application("transfer")
|
4
|
+
|
5
|
+
describe "Testing FSR::App::Transfer" do
|
6
|
+
it "Transfers the call" do
|
7
|
+
transfer = FSR::App::Transfer.new("500", "XML", "default")
|
8
|
+
transfer.sendmsg.should == "call-command: execute\nexecute-app-name: transfer\nexecute-app-arg: 500 XML default\nevent-lock:true\n\n"
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
@@ -16,4 +16,11 @@ describe "Testing FSR::Listener::Inbound" do
|
|
16
16
|
FSR::Listener::Inbound.method_defined?(:post_init).should == true
|
17
17
|
end
|
18
18
|
|
19
|
+
it "adds and deletes hooks" do
|
20
|
+
FSL::Inbound.add_event_hook(:CHANNEL_CREATE) {|event| puts event.inspect }
|
21
|
+
FSL::Inbound::HOOKS.size.should == 1
|
22
|
+
FSL::Inbound.del_event_hook(:CHANNEL_CREATE)
|
23
|
+
FSL::Inbound::HOOKS.size.should == 0
|
24
|
+
end
|
25
|
+
|
19
26
|
end
|
data/spec/fsr/loading.rb
CHANGED
@@ -4,7 +4,7 @@ require 'spec/helper'
|
|
4
4
|
describe "Testing FSR module loading methods" do
|
5
5
|
# When you add applications you must modify the expected apps_loaded behavior
|
6
6
|
it "Loads all applications" do
|
7
|
-
all_apps = [:set, :transfer, :speak, :fs_sleep, :playback, :answer, :fifo, :bridge, :hangup, :conference, :fs_break, :log]
|
7
|
+
all_apps = [:uuid_dump, :uuid_setvar, :uuid_getvar, :read, :set, :transfer, :speak, :fs_sleep, :playback, :answer, :fifo, :bridge, :hangup, :conference, :fs_break, :log]
|
8
8
|
# Add any apps which will load to this set
|
9
9
|
apps_loaded = FSR.load_all_applications
|
10
10
|
apps_loaded.kind_of?(Array).should == true
|
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.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jayson Vaughn
|
@@ -12,7 +12,7 @@ autorequire:
|
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
14
|
|
15
|
-
date: 2009-04-
|
15
|
+
date: 2009-04-16 00:00:00 -05:00
|
16
16
|
default_executable:
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
@@ -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 Inbound Eventsocket listener: #!/usr/bin/env ruby require 'fsr' require \"fsr/listener/inbound\" 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(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/listener/outbound\" require 'pp' 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] pp session.headers 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\" 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
|
|
@@ -38,12 +38,11 @@ files:
|
|
38
38
|
- NEWS
|
39
39
|
- README
|
40
40
|
- Rakefile
|
41
|
-
-
|
42
|
-
-
|
43
|
-
-
|
44
|
-
-
|
45
|
-
-
|
46
|
-
- bin/oes_demo2.rb
|
41
|
+
- examples
|
42
|
+
- examples/dtmf_test.rb
|
43
|
+
- examples/ies_demo.rb
|
44
|
+
- examples/ies_demo_with_hook.rb
|
45
|
+
- examples/oes_demo.rb
|
47
46
|
- lib
|
48
47
|
- lib/fsr
|
49
48
|
- lib/fsr/app
|
@@ -56,9 +55,13 @@ files:
|
|
56
55
|
- lib/fsr/app/hangup.rb
|
57
56
|
- lib/fsr/app/log.rb
|
58
57
|
- lib/fsr/app/playback.rb
|
58
|
+
- lib/fsr/app/read.rb
|
59
59
|
- lib/fsr/app/set.rb
|
60
60
|
- lib/fsr/app/speak.rb
|
61
61
|
- lib/fsr/app/transfer.rb
|
62
|
+
- lib/fsr/app/uuid_dump.rb
|
63
|
+
- lib/fsr/app/uuid_getvar.rb
|
64
|
+
- lib/fsr/app/uuid_setvar.rb
|
62
65
|
- lib/fsr/app.rb
|
63
66
|
- lib/fsr/cmd
|
64
67
|
- lib/fsr/cmd/fsctl.rb
|
@@ -159,6 +162,49 @@ post_install_message: |
|
|
159
162
|
|
160
163
|
|
161
164
|
|
165
|
+
Example of creating an Outbound Eventsocket listener that can read DTMF input and keep state:
|
166
|
+
|
167
|
+
#!/usr/bin/env ruby
|
168
|
+
|
169
|
+
require "fsr/listener/outbound"
|
170
|
+
require 'pp'
|
171
|
+
|
172
|
+
FSR.load_all_applications
|
173
|
+
FSR.load_all_commands
|
174
|
+
|
175
|
+
class DtmfDemo < FSR::Listener::Outbound
|
176
|
+
|
177
|
+
def session_initiated(session, step = 0)
|
178
|
+
@step ||= step
|
179
|
+
exten = session.headers[:channel_caller_id_number]
|
180
|
+
pp session.headers
|
181
|
+
FSR::Log.info "*** Answering incoming call from #{exten}"
|
182
|
+
answer # Answer the call
|
183
|
+
end
|
184
|
+
|
185
|
+
def receive_reply(reply)
|
186
|
+
exten = @session.headers[:channel_caller_id_number]
|
187
|
+
@step += 1
|
188
|
+
case @step
|
189
|
+
when 1
|
190
|
+
FSR::Log.info "*** Reading dtmf for #{exten}"
|
191
|
+
read "/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav",4,10,"test",15000 # read test
|
192
|
+
when 2
|
193
|
+
FSR::Log.info "*** updating session for #{exten}"
|
194
|
+
update_session
|
195
|
+
when 3
|
196
|
+
FSR::Log.info "** Success, grabbed #{reply.content[:variable_test].strip} from #{exten}"
|
197
|
+
FSR::Log.info "*** Hanging up call"
|
198
|
+
hangup # Hangup the call
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
FSR.start_oes! DtmfDemo, :port => 8084, :host => "127.0.0.1"
|
205
|
+
|
206
|
+
|
207
|
+
|
162
208
|
Example of creating an Inbound Eventsocket listener:
|
163
209
|
|
164
210
|
#!/usr/bin/env ruby
|
@@ -214,6 +260,11 @@ test_files:
|
|
214
260
|
- spec/fsr/app/bridge.rb
|
215
261
|
- spec/fsr/app/conference.rb
|
216
262
|
- spec/fsr/app/fifo.rb
|
263
|
+
- spec/fsr/app/hangup.rb
|
264
|
+
- spec/fsr/app/log.rb
|
265
|
+
- spec/fsr/app/playback.rb
|
266
|
+
- spec/fsr/app/set.rb
|
267
|
+
- spec/fsr/app/transfer.rb
|
217
268
|
- spec/fsr/app.rb
|
218
269
|
- spec/fsr/cmd
|
219
270
|
- spec/fsr/cmd/originate.rb
|
data/bin/cmd_demo.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'pp'
|
4
|
-
require File.join(File.dirname(__FILE__), "..", 'lib', 'fsr')
|
5
|
-
require "fsr/cmd"
|
6
|
-
|
7
|
-
FSR.load_all_commands
|
8
|
-
sock = FSR::CommandSocket.new
|
9
|
-
|
10
|
-
# Check the status of our server
|
11
|
-
pp sock.status.run
|
12
|
-
|
13
|
-
# Check max sessions
|
14
|
-
pp sock.fsctl.max_sessions
|
15
|
-
# Set max sessions
|
16
|
-
pp sock.fsctl.max_sessions = 3000
|
17
|
-
|
18
|
-
# Check up a sofia user
|
19
|
-
pp sock.sofia_contact(:contact => "internal/user@domain.com").run
|
data/bin/oes_demo2.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'eventmachine'
|
5
|
-
require 'pp'
|
6
|
-
require File.join(File.dirname(__FILE__), "..", 'lib', 'fsr')
|
7
|
-
puts $LOAD_PATH.inspect
|
8
|
-
$stdout.flush
|
9
|
-
require "fsr/listener/outbound"
|
10
|
-
|
11
|
-
class OesDemo < EventMachine::Protocols::HeaderAndContentProtocol
|
12
|
-
|
13
|
-
def post_init
|
14
|
-
send_data("connect\r\n\r\n")
|
15
|
-
end
|
16
|
-
|
17
|
-
def receive_request(header, content)
|
18
|
-
pp "BEGINNING"
|
19
|
-
pp header
|
20
|
-
pp content
|
21
|
-
pp "END"
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
FSR.start_oes!(OesDemo, :port => 1888, :host => "192.168.6.32")
|