і - відповідаємо
$ AGI- gt; answer ();% AGI;
# ініціалізувавши змінні
$ status= raquo ;;
$ result= raquo ;;
$ to= raquo ;;
# Змушуємо Asterisk виконати команду GET DATA
# Формат команди: GET DATA lt; file to be streamed gt; [timeout] [max digits]
# де lt; file to be streamed gt;- Шлях до медіафайлів, який треба відтворити абоненту
# [timeout] - тайм-аут очікування введення цифри
# [max digits] - максимальна кількість цифр
# Чекаємо введення однієї цифри
print GET DATA $ ARGV [0] $ ARGV [1] 1 n raquo ;;
# Повертаний результат:
# невдале завершення: 200 result=- 1
# тайм-аут з введеними цифрами: 200 result= lt; digits gt; (timeout)
# тайм-аут без введених чисел: 200 result=(timeout)
# вдале завершення: 200 result= lt; digits gt;
# Отримуємо і розбираємо результат
$ result= lt; STDIN gt ;;
$ tt=$ result;
($ status, $ res_str, $ to)=split//, $ result;
($ fake, $ result)=split /=/, $ res_str;
$ to=~ s/^ s + | s + $//g;
$ result=~ s/^ s + | s + $//g;
# Якщо команда завершилася вдало, але цифр не введено - була просто натиснута #
# повертаємо ознака необхідності повторити набір ПІН-коду і виходимо
if (($ result eq ) amp; amp; ($ to eq )) {
$ AGI- gt; set_variable ($ ARGV [4], 2); (0);
}
# Нічого не набрали протягом тайм-ауту - повертаємо соотвтетствующій ознака і виходимо
if ($ result eq ) {
$ AGI- gt; set_variable ($ ARGV [4], 1);
exit (0);
}
# Була натиснута * - повертаємо ознака необхідності повторити набір ПІН-коду і виходимо
if ($ result eq * ) {
$ AGI- gt; set_variable ($ ARGV [4], 2);
exit (0);
}
# Отримано символи відмінні від цифр - (A, B, C, D) -
# повертаємо ознака помилкового ПІН-коду і виходимо
if ($ result=~/^ D + $ /) {
$ AGI- gt; set_variable ($ ARGV [4], 3);
exit (0);
}
# Файл вітання відтворений, перша цифра отримана. Подолжаем збір далі
$ count=1; (1) {
# Очікуємо черговий символ із заданим тайм-аутом
$ digit=$ AGI- gt; wait_for_digit ($ ARGV [1]);
# Стався тайм-аут, повертаємо ознака помилкового ПІН-коду і виходимо
if ($ digit == 0) {
$ AGI- gt; set_variable ($ ARGV [4], 3); (0);
}
$ count ++;
# Аналізуємо отримане
# Нам був повернутий код символу. Отримуємо сам символ функцією chr ()
$ digit=chr ($ digit);
# Натиснуто * або # - повертаємо ознака необхідності повторити набір ПІН-коду і виходимо
if (($ digit eq * ) || ($ digit eq # )) {
$ AGI- gt; set_variable ($ ARGV [4], 2); (0);
}
# Отримано символи відмінні від цифр - (A, B, C, D) -
# повертаємо ознака помилкового ПІН-коду і виходимо
if ($ result=~/^ D + $ /) {
$ AGI- gt; set_variable ($ ARGV [4], 3);
exit (0);
}
# Додаємо чергову цифру в ПІН-код
$ result= $ result . $ digit raquo ;;
# Якщо зібрано 8 цифр - перевіряємо ПІН-код на приналежність до технічних
# якщо вірно - завершуємо цикл збору цифр
if (($ count == 8) amp; amp; (substr ($ result, 0,1) eq 0 )) {last; }
# Якщо зібрано к-ть цифр, задане $ ARGV [2], завершуємо цикл збору цифр ($ count == $ ARGV [2]) {last; }
}
# Встановлюємо в $ ARGV [3] зібраний ПІН-код
$ AGI- gt; set_variable ($ ARGV [3...