[func] ;I have the func
exten => s,1,Answer
exten => s,n,Background(func_instruct) ;for away vm, 2 for busy vm, 3 to page
exten => s,n,Set(TIMEOUT(response)=15)
exten => s,n,Set(TIMEOUT(digit)=3)
exten => _[123],1,Set(DB(FLAGS/${CALLERIDNUM})=${EXTEN}) ;set db vals and hangup so some channels get dialtone ASAP
[macro-internal_extension]
; Based on Standard extension macro
; ${ARG1} - Voicemail box
; ${ARG2} - Device extension(s) to ring
; Usage
; in main context do exten => 1000,1,Macro(insternal_extension,1000,SIP/SnomDesk)
; I use variables defined in the globals section so it becomes
exten => s,1,Gotoif($[${DB(FLAGS/${CALLERID(num)})}=1]?s-NOANSWER,1) ; if flag set call VM
exten => s,n,Gotoif($[${DB(FLAGS/${CALLERID(num)})}=2]?s-BUSY,1) ; do same but lie and say busy
exten => s,n,Gotoif($[${DB(FLAGS/${CALLERID(num)})}=3]?s-PAGE,1) ; page the guy, or just dial the interface as per usual
exten => s,n(dial),Dial(${ARG2},20,t,T) ; Ring the interface, 20 seconds maximum
exten => s,n,Goto(s-${DIALSTATUS},1) ; Jump based on status
exten => s-BUSY,1,Set(DB(FLAGS/${CALLERID(num)})=0)
exten => s-BUSY,n,Voicemail(b${ARG1}) ; If busy, send to voicemail w/ busy announce
exten => s-BUSY,n,Hangup
exten => s-NOANSWER,1,Set(DB(FLAGS/${CALLERID(num)})=0)
exten => s-NOANSWER,n,Voicemail(u${ARG1}) ; If unavailable, send to voicemail w/ unavail
exten => s-NOANSWER,n,Hangup
exten => s-PAGE,1,Set(DB(FLAGS/${CALLERID(num)})=0)
exten => s-PAGE,n,SIPAddHeader(Call-Info:<sip:domain>\;answer-after=0) ;substitute YOUR hardware's SDP page value
exten => s-PAGE,n,goto(s,dial)
exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer