Я сейчас настраиваю интерактивные абонентские группы для звездочки, и, поскольку я уже знаю некоторые LUA, я подумал, что будет легче пойти по этому пути.
У меня есть начальное расширение, подобное этому:
["h"] = function(c,e)
app.verbose("Hung Up")
end;
["s"] = function(c, e)
local d = 0
while d == 0 do
say:hello()
app.read("read_result", nil, 1)
d = channel["read_result"].value;
if d == 1 then
say:goodbye()
elseif d == 2 then
call:forward('front desk')
end
d = 0
end
say:goodbye()
end;
Как видите, я хочу повторять инструкции say:hello()
всякий раз, когда пользователь дает неверный ответ.Однако, если пользователь вешает трубку, пока app.read
ожидает его ответа, звездочка заканчивается бесконечным циклом, поскольку d
всегда будет nil
.
. Я БУДУ проверять d==nil
, чтобы обнаружить отключение, но nil
также появляется, когда пользователь просто нажимает знак #
фунта во время app.read
.
До сих пор я использовал циклы for
вместо while
для ограничениямаксимальное количество итераций, но я бы лучше узнал, как обнаружить отключенный канал.Хотя я не могу найти какую-либо документацию по этому вопросу.
Я также пытался установить расширение h
, но программа не пойдет на него, когда пользователь повесит трубку.
ЗвездочкаПодробный вывод:
[...]
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1") │ test.lua:3: in main chunk
-- Accepting a maximum of 1 digit. │ [C]: ?
-- User disconnected │root@cirro asterisk lua test.lua
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1") │Global B
-- Accepting a maximum of 1 digit. │LocalB-B->a
-- User disconnected │LocalB-A
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1") │LocalB-A
-- Accepting a maximum of 1 digit. │LocalB-A
-- User disconnected │root@cirro asterisk cp ~/test.call /var/spool/asterisk/outgoing
-- Executing [s@test-call:1] read("PJSIP/2300-00000004", "read_result,,1")
[...]
Спасибо за любую помощь, которую вы можете предложить.