Asterisk+Lua - IVR і деякі інші моменти

І знову здрастуйте! IVR — сьогодні це навіть не фішка, а якийсь стандарт роботи підприємства. У деяких випадках багато, як клієнти, так і конкуренти вважають, що якщо цього самого IVR немає, то «там» низька якість надаваних послуг. Цією штукою нині нікого не здивуєш. Проте, ми ж говоримо про реалізацію IVR мовою lua під Астериском. І якщо ви переходите від звичайного плану набору до Lua, то тут можна дещо пояснити.


Припустимо, що потрібні файли для меню у вас вже є, і вони лежать в потрібній папці. Можливо, що на старому конфіги вони навіть використовувалися. Тоді, при описі голосового меню на Lua робимо (я робив так:

Описуємо десь на початку файлу табличку з файлами. Все зручніше в одному місці при необхідності міняти:

mhold = {
m_hello = "custom/message_01"; -- Привітання
m_menu = "custom/message_02"; -- опис меню
m_thx = "custom/message_05"; -- Дякую за вибір нашої компанії...
good_day = "custom/wav_gd_2"; -- типу "Гарного вам дня"...
comerc = "custom/com_1"; -- Натисніть 1
live = "custom/live_2"; -- ну і т. д. інші варіанти вибору і натискань.
other = "custom/other_3";
}


Таким чином ви описали в табличці поля із зазначенням застосовуваних файлів. У моєму випадку — файли з привітанням, якісь подячні слова і вибірка меню. Так само був резервний (на всякий випадок) варіант, при якому кожне меню було розбито на свій файл…

Далі, у першій статті я в описі вхідних дзвінків, функції foo() вказав виклик ivr(). Так от, фактично в моєму прикладі це працювало так:
Подія — Вхідний дзвінок. Виклик foo(). Перевірка деяких умов -> програвання привітання -> виклик ivr(). Саме привітання я програвав до виклику ivr().

function ivr(d)
app.noop("Включено голосове меню.")
app.noop("DID: "..d)
app.background(mhold.m_menu,"","","menu")
app.waitexten(3)
return
end


Не така вже й потужна функція. app.background тут є виклик з ядра астериска голосового меню. Але при цьому потрібно так само зробити опис події menu в экстеншинах:

menu = {
["1"] = function(c,e)
app.noop("Calling from menu by 1")
app.playback(mhold.m_thx)
CallSKS() -- на обробник виклику СКС
end;
["2"] = function(c,e)
app.noop("Calling from menu by 2")
app.playback(mhold.m_thx)
app.goto("local_ext","4690",1) - тут і далі я викликаю абонентів відразу групами.
end;
["3"] = function(c,e)
app.noop("Calling from menu by 3")
app.playback(mhold.m_thx)
app.goto("local_ext","4579",1)
end;
["4"] = function(c,e)
app.noop("Calling from menu by 4")
app.playback(mhold.m_thx)
CallSKS() -- теж варіант звернення в клієнтську службу.
end;
};


При цьому в описі вхідних дзвінків from_trunk потрібно додати обробку таймауту, інакше якщо клієнт не зробив вибір протягом потрібного часу, клієнт почує короткі гудки, а в консолі астера ви побачите помилку виконання коду.

from_trunk = {
t = function()
app.playback(mhold.m_thx)
app.goto("local_ext","7090",1)
end;
-- далі інша частина опису подій...


Про IVR здається все. Тепер ще один момент: обмеження часу дзвінка. Та, на жаль, мені і таке доводилося робити. Були окремі кадри в компанії, які любили по межгороду просто десятками хвилин, а за місяць — годинами базікати з друзями, подругами, братами і т. д. Звичайно, таких карали гривнею, але позиція керівництва була такою, що на роботі треба працювати. Попросили обмежити базік у часі. В наступному прикладі показано, як можна зробити це глобально, з вибіркою напрямку (хоча можливо не найкращий варіант).

-- десь всередині функції trunk_test
if string.len(num) > 7 and not string.find(string.sub(num,1,4),"8383",1) then
app.noop("Діє обмеження на тривалість дзвінка 10 хвилин!!!")
app.dial(string.format("%s%s,60,tTL(600000:480000:60000)",trunk.startel,num))
else
app.noop("Дзвінок по місту.")
app.dial(string.format("%s%s,60,tT",trunk.startel,num))
end


В даному випадку я зробив вибірку за кількістю символів в набраний номер. Якщо кількість символів перевищує кількість символів нашого міста, виключаючи код нашого міста, тоді це дзвінок по межгороду. Стільникові місцеві обробляються окремо, тому під це правило не потрапляють (в минулій статті про DEF-коди). А ось стільникові передмістя — потрапили. В моєму прикладі діє обмеження на 10хвилин. за 7 або 8?) хвилин абонент чує легкий beep. У цій функції можна додати обробку тільки конкретних «лиходіїв». Можна цих лиходіїв
занести в таблицю і за нею вже дивитися, а можна в базу mysql дані від туди витягувати, кому як зручно…

Всі. Всім до побачення!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.