Теперь скорректируем это так, чтобы, если Джон занят (в другом звонке), абонент перенаправлялся на голосовую почту, где слышал бы сообщение о занятости. Для этого воспользуемся переменной ${DIALSTATUS}, в которой содержится одно из значений статуса (список всех возможных значений можно получить в консоли Asterisk с помощью команды core show application dial):
exten => 101,1,Dial(${JOHN},10)
exten => 101,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) exten => 101,n(unavail),Voicemail(101@default,u) exten => 101,n,Hangup
Теперь абоненты будут получать сообщение голосовой почты Джона (с соответствующим приветствием), если Джон занят или недоступен. Однако осталась небольшая проблема - Джон не имеет возможности извлекать свои сообщения. Исправим это.
Организация доступа к голосовой почте
Пользователи могут извлекать свои сообщения голосовой почты, менять опции и записывать приветствия голосовой почты с помощью приложения VoiceMailMain. В своей типовой форме приложение VoiceMailMain вызывается без аргументов. Добавим в контекст [internal] диалплана добавочный номер 700, чтобы внутренние пользователи могли выполнять звонки для доступа к своим сообщениям голосовой почты: exten => 700,1,VoiceMailMain
Создание телефонного справочника для набора номера по имени
Осталась последняя заслуживающая внимания функция системы голосовой почты Asterisk - телефонный справочник для набора номера по имени. Создается он с помощью приложения Directory. Это приложение, используя имена, заданные в описаниях почтовых ящиков в файле voicemail.conf, предоставляет абоненту телефонный справочник абонентов АТС для набора номеров по имени.
Directory принимает три аргумента: контекст голосовой почты, из которого считываются имена, контекст диалплана, в котором вызывается пользователь (необязательный), и строку опций (также необязательный). По умолчанию Directory ведет поиск пользователя по фамилии. Если передается опция f, поиск осуществляется по имени. Добавим два справочника для набора номера по имени в контекст [incoming] нашего образца диалплана, чтобы абоненты могли выполнять поиск или по имени, или по фамилии:
exten => 8,1,Directory(default,incoming,f) exten => 9,1,Directory(default,incoming)
Если абоненты нажмут кнопку 8, они получат справочник, составленный по именам. Если они наберут 9, то получат справочник, составленный по фамилиям.
Макрос
Макросы[76] - очень полезная структура, разработанная во избежание повторов в диалплане. Также они облегчают задачу по внесению изменений в диалплан. Чтобы проиллюстрировать это, снова вернемся к нашему примеру диалплана. Если вы помните, при внесении изменений для голосовой почты мы остановились на следующем варианте добавочного номера для Джона: exten => 101,1,Dial(${J0HN},10)
exten => 101,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) exten => 101,n(unavail),Voicemail(101@default,u) exten => 101,n,Hangup
exten => 101,n(busy),VoiceMail(101@default,b) exten => 101,n,Hangup
Допустим, системой Asterisk пользуются сто абонентов. Для задания добавочных номеров пришлось бы многократно копировать и вставлять фрагменты кода. Теперь предположим, что возникла необходимость немного скорректировать работу добавочных номеров. Для этого пришлось бы вносить массу изменений, и почти наверняка при этом будут допущены ошибки.
Вместо этого можно определить макрос, содержащий список необходимых шагов, и затем сделать так, чтобы все добавочные номера использовали его. В этом случае корректировать придется только макрос, и это обеспечит изменение всех элементов диалплана, ссылающихся на него.
Те, кто хорошо знаком с программированием, заметят, что макросы подобны подпрограммам, которые есть во многих современных языках программирования. Если вы не знакомы с программированием, не волнуйтесь, мы подробно и последовательно ознакомим вас с созданием макроса.
Лучший способ оценить макрос - увидеть его в деле, так что прямо сейчас и приступим.
Описание макроса
Давайте возьмем логику диалплана, которая использовалась выше для настройки голосовой почты Джона, и превратим ее в макрос. Затем с помощью этого макроса обеспечим Джону и Джейн (и их коллегам) аналогичные функциональные возможности.
Описание макроса очень похоже на контексты. (По сути, можно даже утверждать, что это действительно небольшие контексты с ограниченной функциональностью.) Для описания макроса используется служебное слово macro-, за которым следует имя макроса, и вся эта конструкция заключается в квадратные скобки: [macro-voicemail]