Skip to content

Commit

Permalink
Merge pull request #4 from chris-teague/chat_command
Browse files Browse the repository at this point in the history
Added support for FreeSwitch Chat command
  • Loading branch information
bougyman committed Nov 24, 2012
2 parents 1ea7030 + d3f6910 commit a7a939a
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 3 deletions.
39 changes: 39 additions & 0 deletions lib/fsr/cmd/chat.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
require "fsr/app"
module FSR
module Cmd
class Chat < Command

attr_reader :fs_socket

def initialize(fs_socket = nil, args = {})

raise(ArgumentError, "args (Passed: <<<#{args}>>>) must be a hash") unless args.kind_of?(Hash)

@fs_socket = fs_socket # FSR::CommandSocket obj
@protocol = args[:protocol] ? args[:protocol] : 'sip'
raise(ArgumentError, "Cannot send chat with invalid protocol") unless @protocol.to_s.size > 0
@from = args[:from] # i.e. [email protected]
raise(ArgumentError, "Cannot send chat without :from set") unless @from.to_s.size > 0
@to = args[:to] # i.e. [email protected]
raise(ArgumentError, "Cannot send chat without :to set") unless @to.to_s.size > 0
@message = args[:message]
raise(ArgumentError, "Cannot send chat without :message set") unless @message.to_s.size > 0
@message.gsub!('|', '\|')
end

# Send the command to the event socket, using api by default.
def run(api_method = :api)
orig_command = "%s %s" % [api_method, raw]
Log.debug "saying #{orig_command}"
@fs_socket.say(orig_command)
end

# This method builds the API command to send to the freeswitch event socket
def raw
%Q(chat #{@protocol}|#{@from}|#{@to}|#{@message})
end
end

register(:chat, Chat)
end
end
6 changes: 4 additions & 2 deletions lib/fsr/cmd/sofia/status.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ def initialize(fs_socket = nil, args = {})
@fs_socket = fs_socket # FSR::CommandSocket object
@status = args[:status] # Status type; profile or gateway
@name = args[:name] # Name of profile or gateway
@xml_status = !!args[:xml_status] # Return results in xml rather than text
# If status is given, make sure it's profile or gateway
unless @status.nil?
raise "status must be profile or gateway" unless @status =~ /profile|gateway/i
Expand All @@ -27,10 +28,11 @@ def run(api_method = :api)

# This method builds the API command to send to the freeswitch event socket
def raw
status_type = @xml_status ? 'xmlstatus' : 'status'
if @status and @name
orig_command = "sofia status #{@status} #{@name}"
orig_command = "sofia #{status_type} #{@status} #{@name}"
else
orig_command = "sofia status"
orig_command = "sofia #{status_type}"
end
end
end
Expand Down
58 changes: 58 additions & 0 deletions spec/fsr/cmd/chat.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
require 'spec/helper'
require "fsr/cmd"
FSR::Cmd.load_command("chat")

describe "Testing FSR::Cmd::Chat" do
# Invalid originates
it "Must be passed an argument hash" do
lambda { FSR::Cmd::Chat.new(nil, :endpoint) }.should.raise(ArgumentError).
message.should.match(/args \(Passed: <<<.*?>>>\) must be a hash/)
end

it "Can not send a chat without a message" do
lambda { FSR::Cmd::Chat.new(nil, :to => '1000', :from => '1001') }.should.raise(ArgumentError).
message.should.match(/Cannot send chat without :message set/)
end

it "Can not send a chat without to set" do
lambda { FSR::Cmd::Chat.new(nil, :message => 'Hello', :from => '1001') }.should.raise(ArgumentError).
message.should.match(/Cannot send chat without :to set/)
end

it "Can not send a chat without from set" do
lambda { FSR::Cmd::Chat.new(nil, :message => 'Hello', :to => '1000') }.should.raise(ArgumentError).
message.should.match(/Cannot send chat without :from set/)
end

it "Can not send a chat with invalid protocol" do
lambda { FSR::Cmd::Chat.new(nil, :message => 'Hello', :to => '1000', :from => '1001', :protocol => '') }.should.raise(ArgumentError).
message.should.match(/Cannot send chat with invalid protocol/)
end

it "Creates a valid chat message with sensible default protocol" do
chat = FSR::Cmd::Chat.new(nil, :message => 'Hello', :to => '1000', :from => '1001')
chat.raw.should == "chat sip|1001|1000|Hello"
end

# Different options choices
it "Honours different protocols" do
chat = FSR::Cmd::Chat.new(nil, :message => 'Hello', :to => '1000', :from => '1001', :protocol => 'jingle')
chat.raw.should == "chat jingle|1001|1000|Hello"
end

it "Honours a more realistic to" do
chat = FSR::Cmd::Chat.new(nil, :message => 'Hello', :to => '[email protected]', :from => '1001')
chat.raw.should == "chat sip|1001|[email protected]|Hello"
end

it "Honours a more complex message" do
chat = FSR::Cmd::Chat.new(nil, :message => 'Hello, friendly sir. "*/;{(\|/;,@#,/', :to => '[email protected]', :from => '1001')
chat.raw.should == 'chat sip|1001|[email protected]|Hello, friendly sir. "*/;{(\\\|/;,@#,/'
end

it "Escapes pipes from messages" do
chat = FSR::Cmd::Chat.new(nil, :message => 'He||o there |ove|y', :to => '[email protected]', :from => '1001')
chat.raw.should == %Q(chat sip|1001|[email protected]|He\\|\\|o there \\|ove\\|y)
end

end
22 changes: 22 additions & 0 deletions spec/fsr/cmd/sofia.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,28 @@
status = sofia.status(:status => 'gateway', :name => 'server')
status.raw.should == "sofia status gateway server"
end
## Sofia XML Status ##
it "FSR::Cmd::Sofia should allow xmlstatus" do
sofia = FSR::Cmd::Sofia.new
status = sofia.status(:xml_status => true)
status.raw.should == "sofia xmlstatus"
end
# Sofia XML Status profile internal
it "FSR::Cmd::Sofia should allow status profile internal" do
sofia = FSR::Cmd::Sofia.new
status = sofia.status(:status => 'profile',
:name => 'internal',
:xml_status => true)
status.raw.should == "sofia xmlstatus profile internal"
end
# Sofia XML Status gateway server
it "FSR::Cmd::Sofia should allow status gateway server" do
sofia = FSR::Cmd::Sofia.new
status = sofia.status(:status => 'gateway',
:name => 'server',
:xml_status => true)
status.raw.should == "sofia xmlstatus gateway server"
end

## Sofia profile ##
it "FSR::Cmd::Sofia should allow profile" do
Expand Down
2 changes: 1 addition & 1 deletion spec/fsr/loading.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

# When you add commands you must modify the expected cmds_loaded behavior
it "Loads all commands" do
all_commands = [:kill, :uuid_dump, :originate, :sofia, :fsctl, :sofia_contact, :status, :calls, :call_center, :channels, :enum, :sched_hangup, :sched_transfer, :uuid_transfer, :uuid_send_dtmf, :conference, :valet_info] # If you add a command add it to this set
all_commands = [:kill, :uuid_dump, :originate, :chat, :sofia, :fsctl, :sofia_contact, :status, :calls, :call_center, :channels, :enum, :sched_hangup, :sched_transfer, :uuid_transfer, :uuid_send_dtmf, :conference, :valet_info] # If you add a command add it to this set
cmds_loaded = FSR.load_all_commands
cmds_loaded.kind_of?(Array).should == true
all_commands.each do |cmd|
Expand Down

0 comments on commit a7a939a

Please sign in to comment.