7b046770febb0b10c4ddd3e12753b0ef8da4af16
[project/luci.git] / contrib / package / asterisk-xip / files / uci / voicemenu
1 #!/bin/sh
2
3 # IVR - Interactive Voice Response Menus.
4
5 ast_add_module voicemenu
6 init_voicemenu() {
7         ast_enable_type voicemenu
8         ast_enable_type voiceoption
9 }
10 check_append_voicemenu() {
11         local context="${1}"
12         eval "local isadded=\"\${dialplan_add_voicemenu_${context}-0}\""
13         if [ "$isadded" != "1" ] ; then
14                 eval "dialplan_add_voicemenu_${context}=1"
15                 append voicemenu_contexts "$context"
16                 return 0
17         else
18                 return 1
19         fi
20 }
21 voicemenu_list="greeting timeoutlen timeoutsmax invalidmax includelocal localmenu"
22
23 handle_voicemenu() {
24         opt_voicemenu_context="$1"
25         check_append_voicemenu "${opt_voicemenu_context}"
26
27         option_cb() {
28                 case "$1" in
29                         greeting|timeoutlen|timeoutsmax|invalidmax|includelocal|localmenu)
30                                 eval "opt_voicemenu_${opt_voicemenu_context}_$1=\"\$2\"" ;;
31                         _*) ;;
32                         *) logerror "Invalid Voicemenu option: $1" ;;
33                 esac
34         }
35 }
36
37 voiceoption_list="digit menu dial goto"
38
39 check_add_voiceoption() {
40         [ -z "${last_vo_voicemenu}" ] && return 0
41
42         if [ -z "${last_vo_dial}" ] ; then
43                 append opt_voicemenu_${last_vo_voicemenu}_action "exten => ${last_vo_digit},1,Goto(${last_vo_goto},s,1)" "${N}"
44         else
45                 append opt_voicemenu_${last_vo_voicemenu}_action "exten => ${last_vo_digit},1,Dial(${last_vo_dial})" "${N}"
46         fi
47
48         append opt_voicemenu_${last_vo_voicemenu}_menu "${last_vo_menu}" "&"
49
50         for i in ${voiceoption_list} ; do
51                 eval "unset last_vo_$i"
52         done
53
54 }
55
56 handle_voiceoption() {
57         opt_voicemenu_context="$1"
58         check_add voiceoption
59
60         option_cb() {
61                 case "$1" in
62                         voicemenu|digit|menu|dial|goto)
63                                 eval "last_vo_$1=\"\$2\"" ;;
64                         _*) ;;
65                         *) logerror "Invalid Voiceoption option in ${opt_voicemenu_context}: $1" ;;
66                 esac
67         }
68 }
69
70 createdialplan_voicemenu(){
71         logdebug 0 "Creating Voicemenu dialplans"
72         [ -z "${voicemenu_contexts}" ]  && return 0
73
74         for curvm in ${voicemenu_contexts} ; do
75                 check_add_context "${curvm}"
76                 for i in ${voicemenu_list} menu action ; do
77                         eval "vmc_${i}=\"\${opt_voicemenu_${curvm}_${i}}\""
78                 done
79
80                 [ -z "${vmc_timeoutlen}" ] && vmc_timeoutlen=5
81                 [ -z "${vmc_timeoutsmax}" ] && vmc_timeoutsmax=3
82                 [ -z "${vmc_invalidmax}" ] && vmc_invalidmax=0
83
84                 # Construct a voicemenu - with as small as possible code.
85                 local nn=1
86                 if [ ! -z "${vmc_greeting}" ] ; then
87                         append_dialplan_context $curvm "exten => s,${nn},Background(${vmc_greeting})"
88                         nn=n
89                 fi
90
91                 local againtimeout="(againtimeout)"
92                 if [ ${vmc_invalidmax} -gt 0 ] ; then
93                         append_dialplan_context $curvm "exten => s,${nn},Set(NUMINVALID=${vmc_invalidmax})"
94                         nn=n
95                 fi
96
97                 if [ ${vmc_timeoutsmax} -gt 0 ] ; then
98                         local labagaininvalid="(againinvalid)"
99                         if [ ${vmc_invalidmax} -le 0 ] ; then
100                                 labagaininvalid=""
101                         fi
102                         append_dialplan_context $curvm "exten => s,${nn}${labagaininvalid},Set(NUMTIMEOUTS=${vmc_timeoutsmax})"
103                         nn=n
104                 else
105                         if [ ${vmc_invalidmax} -gt 0 ] ; then
106                                 againtimeout="(againinvalid)"
107                         else
108                                 againtimeout=
109                         fi
110                 fi
111                 if [ ! -z "${vmc_localmenu}" ] ; then
112                         append_dialplan_context $curvm "exten => s,${nn}${againtimeout},Background(${vmc_localmenu})"
113                         nn=n
114                         againtimeout=
115                 fi
116                 if [ ! -z "${vmc_menu}" ] ; then
117                         append_dialplan_context $curvm "exten => s,${nn}${againtimeout},Background(${vmc_menu})"
118                         againtimeout=
119                         nn=n
120                 fi
121                 append_dialplan_context $curvm "exten => s,${nn}${againtimeout},WaitExten(${vmc_timeoutlen})
122 exten => s,n,Goto(t,1)
123 exten => s,n(goodbye),Playback(vm-goodbye)
124 exten => s,n,Hangup()"
125                 if [ ${vmc_timeoutsmax} -gt 0 ] ; then
126                         append_dialplan_context $curvm "exten => t,1,Set(NUMTIMEOUTS=\$[\${NUMTIMEOUTS} - 1])
127 exten => t,n,Gotoif(\$[\${NUMTIMEOUTS} >= 0]?s,againtimeout:s,goodbye)"
128                 else
129                         append_dialplan_context $curvm "exten => t,1,Goto(s,goodbye)"
130                 fi
131                 append_dialplan_context ${curvm} "${vmc_action}"
132                 [ -z "${vmc_includelocal}" ] || append_dialplan_context ${curvm} "include => ${vmc_includelocal}"
133                 if [ ${vmc_invalidmax} -gt 0 ] ; then
134                         append_dialplan_context $curvm "exten => i,1,Set(NUMINVALID=\$[\${NUMINVALID} - 1])
135 exten => i,n,Background(invalid)
136 exten => i,n,Gotoif(\$[\${NUMINVALID} >= 0]?s,againinvalid:s,goodbye)"
137                 else
138                         append_dialplan_context $curvm "exten => i,1,Background(invalid)${N}exten => i,n,Goto(s,goodbye)"
139                 fi
140         done
141
142 }
143
144
145 # vim: ts=2 sw=2 noet foldmethod=indent