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 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 = {
["_+1NXXNXXXXXX"] = 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.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;
};
}