summaryrefslogtreecommitdiff
path: root/misc/freeswitch
diff options
context:
space:
mode:
Diffstat (limited to 'misc/freeswitch')
-rw-r--r--misc/freeswitch/conf/freeswitch.xml95
-rw-r--r--misc/freeswitch/scripts/common/conference.lua11
-rw-r--r--misc/freeswitch/scripts/common/sip_account.lua1
-rw-r--r--misc/freeswitch/scripts/dialplan/call_parking.lua83
-rw-r--r--misc/freeswitch/scripts/dialplan/dialplan.lua12
-rw-r--r--misc/freeswitch/scripts/dialplan/functions.lua23
6 files changed, 208 insertions, 17 deletions
diff --git a/misc/freeswitch/conf/freeswitch.xml b/misc/freeswitch/conf/freeswitch.xml
index a5fe873..4969b07 100644
--- a/misc/freeswitch/conf/freeswitch.xml
+++ b/misc/freeswitch/conf/freeswitch.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="freeswitch/xml">
- <X-PRE-PROCESS cmd="set" data="sound_prefix=/opt/freeswitch/sounds/en/us/callie"/>
<section name="languages" description="Language Management">
- <language name="en" say-module="en" sound-prefix="/opt/freeswitch/sounds/en/us/callie">
+ <language name="en" say-module="en">
<phrases>
<macros>
<macro name="voicemail_hello">
@@ -463,10 +462,55 @@
</match>
</input>
</macro>
+ <macro name="conference_welcome">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="play-file" data="conference/conf-welcome.wav"/>
+ </match>
+ </input>
+ </macro>
+ <macro name="conference_goodbye">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="play-file" data="conference/conf-goodbye.wav"/>
+ </match>
+ </input>
+ </macro>
+ <macro name="conference_bad_pin">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="play-file" data="conference/conf-bad-pin.wav"/>
+ </match>
+ </input>
+ </macro>
+ <macro name="conference_record_name">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="play-file" data="voicemail/vm-record_name1.wav"/>
+ <action function="play-file" data="tone_stream://%(1000,0,500)"/>
+ </match>
+ </input>
+ </macro>
+ <macro name="conference_has_joined">
+ <input pattern="^(.+)$">
+ <match>
+ <action function="play-file" data="$1"/>
+ <action function="play-file" data="conference/conf-has_joined.wav"/>
+ </match>
+ </input>
+ </macro>
+ <macro name="conference_has_left">
+ <input pattern="^(.+)$">
+ <match>
+ <action function="play-file" data="$1"/>
+ <action function="play-file" data="conference/conf-has_left.wav"/>
+ </match>
+ </input>
+ </macro>
</macros>
</phrases>
</language>
- <language name="de" say-module="de" sound-prefix="/opt/freeswitch/sounds/de/de/callie">
+ <language name="de" say-module="de">
<phrases>
<macros>
<macro name="voicemail_hello">
@@ -927,6 +971,51 @@
</match>
</input>
</macro>
+ <macro name="conference_welcome">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="play-file" data="conference/conf-welcome.wav"/>
+ </match>
+ </input>
+ </macro>
+ <macro name="conference_goodbye">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="play-file" data="conference/conf-goodbye.wav"/>
+ </match>
+ </input>
+ </macro>
+ <macro name="conference_bad_pin">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="play-file" data="conference/conf-bad-pin.wav"/>
+ </match>
+ </input>
+ </macro>
+ <macro name="conference_record_name">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="play-file" data="voicemail/vm-record_name1.wav"/>
+ <action function="play-file" data="tone_stream://%(1000,0,500)"/>
+ </match>
+ </input>
+ </macro>
+ <macro name="conference_has_joined">
+ <input pattern="^(.+)$">
+ <match>
+ <action function="play-file" data="$1"/>
+ <action function="play-file" data="conference/conf-has_joined.wav"/>
+ </match>
+ </input>
+ </macro>
+ <macro name="conference_has_left">
+ <input pattern="^(.+)$">
+ <match>
+ <action function="play-file" data="$1"/>
+ <action function="play-file" data="conference/conf-has_left.wav"/>
+ </match>
+ </input>
+ </macro>
</macros>
</phrases>
</language>
diff --git a/misc/freeswitch/scripts/common/conference.lua b/misc/freeswitch/scripts/common/conference.lua
index ca5fa62..f6a4d87 100644
--- a/misc/freeswitch/scripts/common/conference.lua
+++ b/misc/freeswitch/scripts/common/conference.lua
@@ -157,7 +157,7 @@ function Conference.enter(self, caller, domain)
caller:answer();
caller:sleep(1000);
- caller.session:streamFile('conference/conf-welcome.wav');
+ caller.session:sayPhrase('conference_welcome');
if pin and pin ~= "" then
local digits = "";
@@ -165,12 +165,12 @@ function Conference.enter(self, caller, domain)
if digits == pin then
break
elseif digits ~= "" then
- caller.session:streamFile('conference/conf-bad-pin.wav');
+ caller.session:sayPhrase('conference_bad_pin');
end
digits = caller.session:read(PIN_LENGTH_MIN, PIN_LENGTH_MAX, 'conference/conf-enter_conf_pin.wav', PIN_TIMEOUT, '#');
end
if digits ~= pin then
- caller.session:streamFile("conference/conf-goodbye.wav");
+ caller.session:sayPhrase('conference_goodbye');
return "CALL_REJECTED";
end
end
@@ -192,8 +192,7 @@ function Conference.enter(self, caller, domain)
if common.str.to_b(self.record.announce_new_member_by_name) or common.str.to_b(self.record.announce_left_member_by_name) then
local uid = session:get_uuid();
name_file = "/tmp/conference_caller_name_" .. uid .. ".wav";
- caller.session:streamFile("voicemail/vm-record_name1.wav");
- caller.session:execute("playback", "tone_stream://%(1000,0,500)");
+ caller.session:sayPhrase('conference_record_name');
session:recordFile(name_file, ANNOUNCEMENT_MAX_LEN, ANNOUNCEMENT_SILENCE_THRESHOLD, ANNOUNCEMENT_SILENCE_LEN);
caller.session:streamFile(name_file);
end
@@ -209,7 +208,7 @@ function Conference.enter(self, caller, domain)
local result = caller.session:execute('conference', self.record.id .. "@profile_" .. self.record.id .. "++flags{" .. table.concat(flags, '|') .. "}");
self.log:debug('exited conference - result: ' .. tostring(result));
- caller.session:streamFile("conference/conf-goodbye.wav")
+ caller.session:sayPhrase('conference_goodbye');
-- Play leaving caller's name if recorded
if name_file then
diff --git a/misc/freeswitch/scripts/common/sip_account.lua b/misc/freeswitch/scripts/common/sip_account.lua
index d023f20..5b1ea56 100644
--- a/misc/freeswitch/scripts/common/sip_account.lua
+++ b/misc/freeswitch/scripts/common/sip_account.lua
@@ -38,6 +38,7 @@ function SipAccount.find_by_sql(self, where)
`a`.`sip_accountable_id`, \
`a`.`hotdeskable`, \
`a`.`gs_node_id`, \
+ `a`.`language_code`, \
`b`.`host`, \
`c`.`sip_host`, \
`c`.`profile_name` \
diff --git a/misc/freeswitch/scripts/dialplan/call_parking.lua b/misc/freeswitch/scripts/dialplan/call_parking.lua
new file mode 100644
index 0000000..cc2cf4b
--- /dev/null
+++ b/misc/freeswitch/scripts/dialplan/call_parking.lua
@@ -0,0 +1,83 @@
+-- Gemeinschaft 5 module: call parking class
+-- (c) AMOOMA GmbH 2013
+--
+
+module(...,package.seeall)
+
+PARKING_STALL_FORMAT = '[0-9A-Z_%+%-]+';
+UUID_FORMAT = '[0-9a-f%-]+';
+
+CallParking = {}
+
+-- create acd object
+function CallParking.new(self, arg)
+ arg = arg or {}
+ object = arg.object or {}
+ setmetatable(object, self);
+ self.__index = self;
+ self.class = 'parkingstall';
+ self.log = arg.log;
+ self.database = arg.database;
+ self.lot = arg.lot or 'default';
+ self.caller = arg.caller;
+ return object;
+end
+
+
+function CallParking.find_by_name(self, name)
+ local sql_query = 'SELECT * FROM `parking_stalls` WHERE `name`= '.. self.database:escape(name, '"') .. ' LIMIT 1';
+ local parking_stall = nil;
+
+ self.database:query(sql_query, function(entry)
+ parking_stall = CallParking:new(self);
+ parking_stall.record = entry;
+ parking_stall.id = tonumber(entry.id);
+ parking_stall.name = entry.name;
+ end)
+
+ return parking_stall;
+end
+
+
+function CallParking.list_occupied(self, lot)
+ lot = lot or self.lot;
+
+ require 'common.fapi'
+ local valet_info = common.fapi.FApi:new{ log = self.log }:execute('valet_info', lot);
+
+ local parking_stalls = {};
+ tostring(valet_info):gsub('<extension uuid="(' .. UUID_FORMAT .. ')">(' .. PARKING_STALL_FORMAT .. ')</extension>', function(channel_uuid, parking_stall)
+ parking_stalls[parking_stall] = channel_uuid;
+ end);
+
+ return parking_stalls;
+end
+
+
+function CallParking.occupied(self)
+ local occupied_stalls = self:list_occupied();
+ if occupied_stalls then
+ return occupied_stalls[self.name];
+ end
+end
+
+
+function CallParking.park_retrieve(self)
+ self.caller:execute("valet_park", self.lot .. ' ' .. self.name);
+end
+
+
+function CallParking.park(self)
+ if self:occupied() then
+ return false;
+ end
+ self.caller:execute("valet_park", self.lot .. ' ' .. self.name);
+end
+
+
+function CallParking.retrieve(self)
+ if not self:occupied() then
+ return false;
+ end
+ self.caller:execute("valet_park", self.lot .. ' ' .. self.name);
+end
diff --git a/misc/freeswitch/scripts/dialplan/dialplan.lua b/misc/freeswitch/scripts/dialplan/dialplan.lua
index 72503e5..b27bb9d 100644
--- a/misc/freeswitch/scripts/dialplan/dialplan.lua
+++ b/misc/freeswitch/scripts/dialplan/dialplan.lua
@@ -270,7 +270,10 @@ function Dialplan.retrieve_caller_data(self)
for index, caller_number in ipairs(self.caller.caller_phone_numbers) do
self.caller.caller_phone_numbers_hash[caller_number] = true;
end
- self.log:info('CALLER_DATA - caller account: ', self.caller.account.class, '=', self.caller.account.id, '/', self.caller.account.uuid, ', phone_numbers: ', #self.caller.caller_phone_numbers);
+ if not common.str.blank(self.caller.account.record.language_code) then
+ self.caller.language = self.caller.account.record.language_code;
+ end
+ self.log:info('CALLER_DATA - caller account: ', self.caller.account.class, '=', self.caller.account.id, '/', self.caller.account.uuid, ', phone_numbers: ', #self.caller.caller_phone_numbers, ', language: ', self.caller.language);
if self.caller.account.owner then
self.log:info('CALLER_DATA - caller owner: ', self.caller.account.owner.class, '=', self.caller.account.owner.id, '/', self.caller.account.owner.uuid);
else
@@ -859,7 +862,6 @@ function Dialplan.run(self, destination)
self.caller:set_variable('hangup_after_bridge', false);
self.caller:set_variable('bridge_early_media', 'true');
- self.caller:set_variable('default_language', self.default_language);
self.caller:set_variable('gs_save_cdr', true);
self.caller:set_variable('gs_call_service', 'dial');
self.caller.session:setAutoHangup(false);
@@ -876,6 +878,8 @@ function Dialplan.run(self, destination)
self:retrieve_caller_data();
self.route_failover = common.configuration_table.get(self.database, 'call_route', 'failover');
+ self.caller.language = self.caller.language or self.default_language;
+
if not destination or destination.type == 'unknown' then
local route = nil;
if self.caller.gateway then
@@ -937,7 +941,9 @@ function Dialplan.run(self, destination)
end
end
- self.log:info('DIALPLAN start - caller_id: ',self.caller.caller_id_number, ' "', self.caller.caller_id_name, '" , number: ', destination.number);
+ self.caller:set_variable('default_language', self.caller.language);
+ self.caller:set_variable('sound_prefix', common.str.try(self.config, 'sounds.' .. tostring(self.caller.language)));
+ self.log:info('DIALPLAN start - caller_id: ',self.caller.caller_id_number, ' "', self.caller.caller_id_name, '" , number: ', destination.number, ', language: ', self.caller.language);
local result = { continue = false };
local loop = self.caller.loop_count;
diff --git a/misc/freeswitch/scripts/dialplan/functions.lua b/misc/freeswitch/scripts/dialplan/functions.lua
index 4430be1..acfa336 100644
--- a/misc/freeswitch/scripts/dialplan/functions.lua
+++ b/misc/freeswitch/scripts/dialplan/functions.lua
@@ -111,8 +111,8 @@ function Functions.dialplan_function(self, caller, dialed_number)
result = "+" .. tostring(parameters[3]);
elseif fid == "hangup" then
result = self:hangup(caller, parameters[3], parameters[4]);
- elseif fid == "park" then
- result = self:park(caller, parameters[3]);
+ elseif fid == "cpa" then
+ result = self:call_parking_inout(caller, parameters[3], parameters[4]);
end
return result;
@@ -898,6 +898,7 @@ function Functions.acd_membership_toggle(self, caller, agent_id, phone_number)
return { continue = false, code = 200, phrase = 'OK', no_cdr = true }
end
+
function Functions.hangup(self, caller, code, phrase)
require 'common.str'
@@ -914,8 +915,20 @@ function Functions.hangup(self, caller, code, phrase)
return { continue = false, code = code, phrase = phrase:gsub('_', ' '), no_cdr = true }
end
-function Functions.park(self, caller, lot)
- self.log:info("FUNCTION_PARK lot: ", lot);
- caller:execute("valet_park", 'valet_lot ' .. lot);
+
+function Functions.call_parking_inout(self, caller, stall_name, lot_name)
+ require 'dialplan.call_parking';
+ local parking_stall = dialplan.call_parking.CallParking:new{ log = self.log, database = self.database, caller = caller }:find_by_name(stall_name);
+
+ if not parking_stall then
+ return { continue = false, code = 404, phrase = 'Parking stall not found', no_cdr = true }
+ end
+
+ if lot_name and parking_stall.lot ~= lot_name then
+ return { continue = false, code = 404, phrase = 'Parking lot not found', no_cdr = true }
+ end
+
+ parking_stall:park_retrieve();
+
return { continue = false, code = 200, phrase = 'OK', no_cdr = true }
end