local http_request = require "http.request"
local cjson = require "cjson"
function hex_to_char(x)
return string.char(tonumber(x, 16))
end
function uri_decode(uri)
return uri:gsub("%%(%x%x)", hex_to_char)
end
function prepare_tts(text)
local sha = channel.SHA1(text):get()
local handle = assert(io.popen("flite -voice /etc/asterisk/voice.flitevox -o /tmp/" .. sha .. ".wav16", "w"))
handle:write(text)
assert(handle:close())
return "/tmp/" .. sha
end
function call_sgx_jmp(from_jid, to)
local req = http_request.new_from_uri(
"https://bandwidth-voice.jmp.chat/outbound/calls"
)
req.headers:upsert(":method", "POST")
req.headers:upsert("Content-Type", "application/json")
req.headers:upsert("Accept", "application/json")
req:set_body(cjson.encode({
from = "xmpp:" .. from_jid,
to = to
}))
local headers, stream = assert(req:go())
return cjson.decode(stream:get_body_as_string())
end
extensions = {
jmp = {
["_+X!"] = function(context, extension)
local from_cheogram = channel.CHEOGRAM:get() == "yes"
if from_cheogram then
channel.CDR("context"):set("jmp")
local from_header = channel.SIP_HEADER("From"):get()
local from = from_header:gsub("^[^<]*<sip:", ""):gsub(">.*$", "")
local from_jid = uri_decode(from:sub(0, from:find("@sip.cheogram.com") - 1))
local result = call_sgx_jmp(from_jid, extension)
channel.CDR("customer_id"):set(result.customer_id)
if result.tts then
local wav = prepare_tts(result.tts)
if result.from and result.to then
app.read("digits", wav, 1, nil, 3)
else
app.playback(wav)
end
os.remove(wav .. ".wav16")
if channel.digits:get() ~= "1" then
app.hangup()
return
end
end
if result.from and result.to then
channel.CALLERID("all"):set(result.from .. " <" .. result.from .. ">")
app.dial("SIP/bandwidth/" .. result.to)
else
app.log("NOTICE", "JMP rejected call from " .. from .. " (" .. from_jid .. "): no caller id found")
end
else
app.log("NOTICE", "Call from '' (" .. channel.CHANNEL("peerip"):get() .. ":0) to extension '" .. extension .. "' rejected in context 'jmp'.")
end
end;
};
}