1 | изначальная версия редактировать | |
если правильно понял задачу... не тестировал...
-- extensions.lua
technology="SIP"
extensions={}
dialincontext="dialin" -- имя контекста входящих звонков
dialoutcontext="dialout" -- имя контекста исходящих звонков
spygocontext="spygo"
spyspoolcontext="spyspool"
spyspoolexten="start"
spystartcontext="spystart"
spystartexten="start"
env=getfenv()
asterisk_exten_table="extensions"
operatorlist = {"0001","0002","0003","0004","0005"} -- устройства операторов которых нужно обзванивать для прослушивания
callorder = "random" -- может быть - random или seq (в случайном или по порядку)
CALLSPOOL_TMPFILE = "/tmp/%s.call"
CALLSPOOL_WORKINGDIR = "/var/spool/asterisk/outgoing"
MEDIA_STARTLISTENING_NOTIFICATION = "now-listening" -- медиа файл который будет проигрываться оператору перед включением в канал
callfile= [[
Channel: Local/%s@%s
Context: %s
Extension: %s
Priority: 1
Set: PEERCHAN=%s
Set: TOANNOUNCE=%s
]]
function macrooption(peerannounce)
return ("M(%s,%s,%s)"):format(spygocontext,channel.CHANNEL:get(),peerannounce)
end
t=env[asterisk_exten_table]
t[dialoutcontext] = {} -- контекст для исходящих вызовов
t[dialincontext]["_X."] = function(c,e)
app.dial( ("%s/%s/%s"):format(technology, outgoingpeer, e), null, macrooption(channel.CHANNEL("peername"):get()))
app.hangup()
end
t[dialincontext] = {} -- контекст для входящих вызовов
t[dialincontext]["_X."] = function(c,e)
app.dial(("%s/%s"):format(technology, e),null,macrooption(e))
app.hangup()
end
t[("macro-%s"):format(spygocontext)] = {} -- макрос создающий .call файл
t[("macro-%s"):format(spygocontext)]['s'] = function(c,e)
tmpfilename=CALLSPOOL_TMPFILE:format(channel.UNIQUEID:get())
local file = assert(io.open(tmpfilename, "w"))
assert(file:write(callfile:format(spyspoolexten,spyspoolexten,spystartcontext,spystartexten,channel.ARG1:get(),channel.ARG1:get())))
assert(file:close())
assert(os.rename(tmpfilename, CALLSPOOL_WORKINGDIR))
end
t[spyspoolcontext] = {} -- контекст с циклом обзвона операторов
t[spyspoolcontext][spyspoolexten] = function(c,e)
ol_len = #operatorlist
for i = 1, ol_len do
({random = function()
nextoperator = math.random(#operators)
operator = operators[nextoperator]
table.remove(operators,nextoperator)
end,
seq = function()
operator = operators[i]
end
})[callorder]()
app.dial(("%s/%s"):format(technology,operator))
end
end
t[spystartcontext] = {} -- контекст осуществляющий включение в канал
t[spystartcontext][spystartexten] = function(c,e)
local peerchan=channel.PEERCHAN:get()
app.wait(1)
app.answer()
app.playback("silence/1")
app.playback(MEDIA_STARTLISTENING_NOTIFICATION)
if (channel.TOANNOUNCE:get()):match('%d') then -- если в имени пира цифры то проговариваем ему
app.playback("silence/1")
app.saydigits(channel.TOANNOUNCE:get())
end
app.playback("silence/1")
app.channspy(channel.PEERCHAN:get())
app.hangup()
endp.playback("silence/1")
app.playback(MEDIA_STARTLISTENING_NOTIFICATION)
if (channel.TOANNOUNCE:get()):match('%d') then -- если в имени пира цифры то проговариваем ему
app.playback("silence/1")
app.saydigits(channel.TOANNOUNCE:get())
end
app.playback("silence/1")
app.channspy(channel.PEERCHAN:get())
app.hangup()
end
2 | No.2 Revision редактировать |
если правильно понял задачу... не тестировал...
-- extensions.lua
technology="SIP"
extensions={}
dialincontext="dialin" -- имя контекста входящих звонков
dialoutcontext="dialout" -- имя контекста исходящих звонков
spygocontext="spygo"
spyspoolcontext="spyspool"
spyspoolexten="start"
spystartcontext="spystart"
spystartexten="start"
env=getfenv()
asterisk_exten_table="extensions"
operatorlist = {"0001","0002","0003","0004","0005"} -- устройства операторов которых нужно обзванивать для прослушивания
callorder = "random" -- может быть - random или seq (в случайном или по порядку)
CALLSPOOL_TMPFILE = "/tmp/%s.call"
CALLSPOOL_WORKINGDIR = "/var/spool/asterisk/outgoing"
MEDIA_STARTLISTENING_NOTIFICATION = "now-listening" -- медиа файл который будет проигрываться оператору перед включением в канал
callfile= [[
Channel: Local/%s@%s
Context: %s
Extension: %s
Priority: 1
Set: PEERCHAN=%s
Set: TOANNOUNCE=%s
]]
function macrooption(peerannounce)
return ("M(%s,%s,%s)"):format(spygocontext,channel.CHANNEL:get(),peerannounce)
end
t=env[asterisk_exten_table]
t[dialoutcontext] = {} -- контекст для исходящих вызовов
t[dialincontext]["_X."] = function(c,e)
app.dial( ("%s/%s/%s"):format(technology, outgoingpeer, e), null, macrooption(channel.CHANNEL("peername"):get()))
app.hangup()
end
t[dialincontext] = {} -- контекст для входящих вызовов
t[dialincontext]["_X."] = function(c,e)
app.dial(("%s/%s"):format(technology, e),null,macrooption(e))
app.hangup()
end
t[("macro-%s"):format(spygocontext)] = {} -- макрос создающий .call файл
t[("macro-%s"):format(spygocontext)]['s'] = function(c,e)
tmpfilename=CALLSPOOL_TMPFILE:format(channel.UNIQUEID:get())
local file = assert(io.open(tmpfilename, "w"))
assert(file:write(callfile:format(spyspoolexten,spyspoolexten,spystartcontext,spystartexten,channel.ARG1:get(),channel.ARG1:get())))
assert(file:close())
assert(os.rename(tmpfilename, CALLSPOOL_WORKINGDIR))
end
t[spyspoolcontext] = {} -- контекст с циклом обзвона операторов
t[spyspoolcontext][spyspoolexten] = function(c,e)
ol_len = #operatorlist
for i = 1, ol_len do
({random = function()
nextoperator = math.random(#operators)
operator = operators[nextoperator]
table.remove(operators,nextoperator)
end,
seq = function()
operator = operators[i]
end
})[callorder]()
app.dial(("%s/%s"):format(technology,operator))
end
end
t[spystartcontext] = {} -- контекст осуществляющий включение в канал
t[spystartcontext][spystartexten] = function(c,e)
local peerchan=channel.PEERCHAN:get()
app.wait(1)
app.answer()
app.playback("silence/1")
app.playback(MEDIA_STARTLISTENING_NOTIFICATION)
if (channel.TOANNOUNCE:get()):match('%d') then -- если в имени пира цифры то проговариваем ему
app.playback("silence/1")
app.saydigits(channel.TOANNOUNCE:get())
end
app.playback("silence/1")
app.channspy(channel.PEERCHAN:get())
app.hangup()
endp.playback("silence/1")
app.playback(MEDIA_STARTLISTENING_NOTIFICATION)
if (channel.TOANNOUNCE:get()):match('%d') then -- если в имени пира цифры то проговариваем ему
app.playback("silence/1")
app.saydigits(channel.TOANNOUNCE:get())
end
app.playback("silence/1")
app.channspy(channel.PEERCHAN:get())
app.hangup()
end
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.