;; Standard Macros For Stirling and BTEL VOX/Net VoIP Networks; Version: 1.0.0 10/14/2004. Requires: Asterisk 1.0.1 (later versions may work);; If this example is useful to you, estimate how much time it has saved you,; then send a donation via Paypal to eric@fnords.org;; Copyright (c) 2004 Eric Wieling <eric@fnords.org>; This example is licensed under the GPL. http://www.gnu.org/licenses/gpl.txt;; Contact eric@fnords.org if you want a non-GPL license. ;[macro-std-exten];; This macro is controlled by the following variables set before the macrois called. The variables can be set using SetVar, DBGet, AGI, web basedCGI script, manager interface, government mind control rays, etc. Howthey are set is up to you.; MOH_CLASS - Music on Hold Class. Set the music on hold class to thisvalue. If empty, don't change the current MOH class.; DND - Do Not Disturb. If this variable is not empty, then send calldirectly to unavailable voicemail. Example: SetVar(DND=1) orSetVar(DND=blah) or SetVar(DND=); DND_MESSAGE - When DND is set, play this audio file before going tounavailable voicemail. Example: SetVar(DND_MESSAGE=/tmp/happy-message) orSetVar(DND_MESSAGE=); CFU_DEST - Call Forward Unconditional. If set, unconditionally dialthis destination. If empty, don't Call Forward Unconditionaly. Example:SetVar(CFU_DEST=IAX2/bob@fnords/1234) or SetVar(CFU_DEST=); CFU_TIMEOUT - When dialing CFU_DEST, how many seconds to wait beforegiving up and going to unavailable voicemail. If empty, never timeout. Do not set this variable to "0". Example: SetVar(CFU_TIMEOUT=20); CFU_MESSAGE - When dialing CFU_DEST, play this audio file to the callerfirst. If empty, don't play anything. Example:SetVar(CFU_MESSAGE=/tmp/happy-message) or SetVar(CFU_MESSAGE=); CFU_FLAGS - When dialing CFU_DEST, use this variable as the optons on tothe Dial command. If empty, use the default Dial flags. Example:SetVar(CFU_FLAGS=mH) or SetVar(CFU_FLAGS=); CFU_LIMIT - When dialing CFU_DEST, this is the maximum number ofsimultaneous calls to allow at the same time. If empty, default to 1 callat a time. Do not set this variable to "0". Example: SetVar(CFU_LIMIT=2)or SetVar(CFU_LIMIT=); DIAL_DEST - If DND and CFU_DEST are not set, dial this destination. Ifempty go to unavailable voicemail. If all the destinations are busy dialCFBL_DEST. Example: SetVar(CFU_DEST=IAX2/bob@fnords/1234) orSetVar(CFU_DEST=SIP/1234&Zap/4); DIAL_TIMEOUT - How many seconds to wait before giving up and tryingCall Forward No Answer. If empty, never timeout. Do not set thisvariable to "0". Example: SetVar(DIAL_TIMEOUT=20); DIAL_FLAGS - Use this variable as the optons on to the Dial command. Ifempty, use the default Dial flags. Example: SetVar(DIAL_FLAGS=mH) orSetVar(DIAL_FLAGS=); DIAL_LIMIT - This is the maximum number of simultaneous calls to allowat the same time. If empty, default to unlimited calls. Do not set thisvariable to "0". Example: SetVar(DIAL_LIMIT=2) or SetVar(DIAL_LIMIT=); CFNA_DEST - Call Forward No Answer. If DIAL_TIMEOUT expires whendialing DIAL_DEST (call was not answered) then dial this destination. Ifempty, don't Call Forward No Answer and go directly to unavailablevoicemail. If all destinations are busy go directly to unavailablevoicemail. Example: SetVar(CFNA_DEST=IAX2/bob@fnords/1234) orSetVar(CFU_DEST=SIP/1234&Zap/4) or SetVar(CFNA_DEST=); CFNA_TIMEOUT - When dialing CFNA_DEST, how many seconds to wait beforegiving up and going to unavailable voicemail. If empty, never timeout. Do not set this variable to "0". Example: SetVar(CFNA_TIMEOUT=20); CFNA_MESSAGE - Before dialing CFNA_DEST, play this audio file to thecaller first. If empty, don't play anything. Example:SetVar(CFNA_MESSAGE=/tmp/happy-message) or SetVar(CFNA_MESSAGE=); CFNA_FLAGS - When dialing CFNA_DEST, use this variable as the optons onto the Dial command. If empty, use the default Dial flags. Example:SetVar(CFNA_FLAGS=mH) or SetVar(CFNA_FLAGS=); CFNA_LIMIT - When dialing CFNA_DEST, this is the maximum number ofsimultaneous calls to allow at the same time. If empty, default tounlimited calls. Do not set this variable to "0". Example:SetVar(CFNA_LIMIT=2) or SetVar(CFNA_LIMIT=); CFBL_DEST - Call Forward Busy Line. If destination is busy when dialingDIAL_DEST then dial this destination. If empty, don't Call Forward BusyLine and go directly to busy voicemail. Example:SetVar(CFBL_DEST=IAX2/bob@fnords/1234) or SetVar(CFBL_DEST=SIP/1234&Zap/4)or SetVar(CFBL_DEST=); CFBL_TIMEOUT - When dialing CFBL_DEST, how many seconds to wait beforegiving up and going to busy voicemail. If empty, never timeout. Do notset this variable to "0". Example: SetVar(CFBL_TIMEOUT=20); CFBL_MESSAGE - Before dialing CFBL_DEST, play this audio file to thecaller first. If empty, don't play anything. Example:SetVar(CFBL_MESSAGE=/tmp/happy-message) or SetVar(CFBL_MESSAGE=); CFBL_FLAGS - When dialing CFBL_DEST, use this variable as the optons onto the Dial command. If empty, use the default Dial flags. Example:SetVar(CFBL_FLAGS=mH) or SetVar(CFBL_FLAGS=); CFBL_LIMIT - When dialing CFBL_DEST, this is the maximum number ofsimultaneous calls to allow at the same time. If empty, default tounlimited calls. Do not set this variable to "0". Example:SetVar(CFBL_LIMIT=2) or SetVar(CFBL_LIMIT=); OPERATOR_DEST - Operator Destination. When a caller presses "0" duringthe voicemail greeting, dial this destination. If all destinations arebusy go back to VoicemailMain. If empty tell the caller "Invalid Option"when they press "0" during the voicemail greeting and go back toVoicemailMain. Exmaple: SetVar(CFBL_DEST=IAX2/bob@fnords/1234) orSetVar(CFBL_DEST=SIP/1234&Zap/4) or SetVar(CFBL_DEST=); OPERATOR_TIMEOUT - When dialing OPERATOR_DEST, how many seconds to waitbefore giving up and going back to VoicemailMain. Example:SetVar(CFBL_TIMEOUT=20); OPERATOR_MESSAGE - Before dialing OPERATOR_DEST, play this audio file tothe caller first. If empty, don't play anything. Example:SetVar(OPERATOR_MESSAGE=/tmp/happy-message) or SetVar(OPERATOR_MESSAGE=); OPERATOR_FLAGS - When dialing OPERATOR_DEST, use this variable as theoptons on to the Dial command. If empty, use the default Dial flags.Example: SetVar(OPERATOR_FLAGS=mH) or SetVar(OPERATOR_FLAGS=); OPERATOR_LIMIT - When dialing OPERATOR_DEST, this is the maximum numberof simultaneous calls allowed at the same time. If empty, default tounlimited calls. Do not set this variable to "0". Example:SetVar(OPERATOR_LIMIT=2) or SetVar(OPERATOR_LIMIT=);exten => s,1,GotoIf($[${LEN(${DIAL_DEST})} = 0]?s-NOANSWER,10:2)exten => s,2,GotoIf($[${LEN(${DND})} = 0]?s-DND,1:3)exten => s,3,GotoIf($[${LEN(${MOH_CLASS})} = 0]?5:4)exten => s,4,SetMusicOnHold(${MOH_CLASS})exten => s,5,GotoIf($[${LEN(${CFU_DEST})} = 0]?s-NOANSWER,10:3)exten => s,6,SetVar(SAVED_EXTEN=${MACRO_EXTEN})exten => s,4,SetVar(SAVED_CONTEXT=${MACRO_CONTEXT})exten => s,5,Macro(callerid-fixup)exten => s,6,Macro(set-ring)exten => s,7,GotoIf($[${LEN(${MOH_CLASS})} = 0]?2:3)exten => s,8,SetMusicOnHold(${MOH_CLASS})exten => s,9,GotoIf($[${LEN(${DIAL_LIMIT})} = 0]?7:8)exten => s,10,SetVar(DIAL_LIMIT=1)exten => s,11,SetGroup(${SAVED_EXTEN}-DIAL_LIMIT)exten => s,12,CheckGroup(${DIAL_LIMIT})exten => s,13,Macro(build-dest,${DIAL_DEST})exten => s,14,Dial(${DESTINATION},${DIAL_TIMEOUT},${DIAL_FLAGS})exten => s,15,Goto(s-${DIALSTATUS},1)exten => s,112,Goto(s-BUSY,1)exten => s-NOANSWER,1,GotoIf($[${LEN(${CFNA_DEST})} = 0]?10:2)exten => s-NOANSWER,2,GotoIf($[${LEN(${CFNA_LIMIT})} = 0]?3:4)exten => s-NOANSWER,3,SetVar(CFNA_LIMIT=1)exten => s-NOANSWER,4,SetGroup(${SAVED_EXTEN}-CFNA_LIMIT)exten => s-NOANSWER,5,CheckGroup(${CFNA_LIMIT})exten => s-NOANSWER,6,GotoIf($[${LEN(${CFNA_MESSAGE})} = 0]?8:7)exten => s-NOANSWER,7,Playback(${CFNA_MESSAGE})exten => s-NOANSWER,8,Macro(build-dest,${CFNA_DEST})exten => s-NOANSWER,9,Dial(${DESTINATION},${CFNA_TIMEOUT},${CFNA_FLAGS})exten => s-NOANSWER,10,Voicemail(u${SAVED_EXTEN})exten => s-NOANSWER,11,Hangupexten => s-NOANSWER,106,Goto(s-NOANSWER,10)exten => s-BUSY,1,GotoIf($[${LEN(${CFBL_DEST})} = 0]?10:2)exten => s-BUSY,2,GotoIf($[${LEN(${CFBL_LIMIT})} = 0]?3:4)exten => s-BUSY,3,SetVar(CFBL_LIMIT=1)exten => s-BUSY,4,SetGroup(${SAVED_EXTEN}-CFBL_LIMIT)exten => s-BUSY,5,CheckGroup(${CFBL_LIMIT})exten => s-BUSY,6,GotoIf($[${LEN(${CFBL_MESSAGE})} = 0]?8:7)exten => s-BUSY,7,Playback(${CFBL_MESSAGE})exten => s-BUSY,8,Macro(build-dest,${CFBL_DEST})exten => s-BUSY,9,Dial(${DESTINATION},${CFBL_TIMEOUT},${CFBL_FLAGS})exten => s-BUSY,10,Voicemail(b${SAVED_EXTEN})exten => s-BUSY,11,Hangupexten => s-BUSY,106,Goto(s-BUSY,10)exten => s-CHANUNAVAIL,1,Goto(s-NOANSWER,1)exten => s-CONGESTION,1,Goto(s-NOANSWER,1)exten => s-CANCEL,1,Goto(s-NOANSWER,1)exten => s-ANSWERED,1,Hangup()exten => a,1,VoicemailMain()exten => o,1,GotoIf($[${LEN(${OPERATOR_DEST})} = 0]?extensions,0,1:2)exten => o,2,GotoIf($[${LEN(${OPERATOR_DEST})} = 0]?11:3)exten => o,3,GotoIf($[${LEN(${OPERATOR_LIMIT})} = 0]?4:5)exten => o,4,SetVar(OPERATOR_LIMIT=1)exten => o,5,SetGroup(${SAVED_EXTEN}-OPERATOR_LIMIT)exten => o,6,CheckGroup(${OPERATOR_LIMIT})exten => o,7,GotoIf($[${LEN(${OPERATOR_MESSAGE})} = 0]?9:8)exten => o,8,Playback(${OPERATOR_MESSAGE})exten => o,9,Macro(build-dest,${OPERATOR_DEST})exten => o,10,Dial(${DESTINATION},${OPERATOR_TIMEOUT},${OPERATOR_FLAGS})exten => o,11,Voicemail(b${SAVED_EXTEN})exten => o,12,Hangupexten => o,107,Goto(o,11)[macro-build-dest]exten => s,1,Cut(DEST1=ARG1,&,1)exten => s,2,Cut(DEST2=ARG1,&,2)exten => s,3,Cut(DEST3=ARG1,&,3)exten => s,4,Cut(DEST4=ARG1,&,4)exten => s,5,GotoIf($[${DEST1:0:3} = Zap]?s,6:s,8)exten => s,6,SetVar(DESTINATION=${DEST1}${CADENCE})exten => s,7,Goto(s,9)exten => s,8,SetVar(DESTINATION=${DEST1})exten => s,9,GotoIf($[${LEN(${DEST2})} = 0]?s,24:s,10)exten => s,10,GotoIf($[${DEST2:0:3} = Zap]?s,11:s,13)exten => s,11,SetVar(DESTINATION=${DESTINATION}&${DEST2}${CADENCE})exten => s,12,Goto(s,14)exten => s,13,SetVar(DESTINATION=${DESTINATION}&${DEST2})exten => s,14,GotoIf($[${LEN(${DEST3})} = 0]?s,24:s,15)exten => s,15,GotoIf($[${DEST3:0:3} = Zap]?s,16:s,18)exten => s,16,SetVar(DESTINATION=${DESTINATION}&${DEST3}${CADENCE})exten => s,17,Goto(s,14)exten => s,18,SetVar(DESTINATION=${DESTINATION}&${DEST3})exten => s,19,GotoIf($[${LEN(${DEST4})} = 0]?s,24:s,20)exten => s,20,GotoIf($[${DEST4:0:3} = Zap]?s,21:s,23)exten => s,21,SetVar(DESTINATION=${DESTINATION}&${DEST4}${CADENCE})exten => s,22,Goto(s,24)exten => s,23,SetVar(DESTINATION=${DESTINATION}&${DEST4})exten => s,24,NoOp[macro-set-ring]exten => s,1,NoOp(CALLERIDNUM=${CALLERIDNUM})exten => s,2,GotoIf($[${LEN(${CALLERIDNUM})} = 4]?s,5:s,3)exten => s,3,SetVar(CADENCE=r2)exten => s,4,SetVar(ALERT_INFO=<Bellcore-dr2>)exten => s,5,NoOp[macro-callerid-fixup];; This macro assumes the following:; Extensions without a DID number have their CallerID number set to their 4 digit extension; Extensions with a DID number have their CallerID number set to their 10 digit DID; The last 4 digits of a DID number is the same as the extension number;exten => s,1,NoOp(Original Caller*ID: ${CALLERIDNUM})exten => s,2,GotoIf($["${MACRO_CONTEXT}" = "incoming"]?exit,1:s,3)exten => s,3,GotoIf($["${SAVED_CONTEXT}" = "incoming"]?exit,1:s,4)exten => s,4,GotoIf($[${LEN(${SAVED_EXTEN})} = 0]?s,5:s,6)exten => s,5,SetVar(SAVED_EXTEN=${MACRO_EXTEN})exten => s,6,GotoIf($[${LEN(${CALLERIDNUM})} = 0]?skip,1:s,7)exten => s,7,GotoIf($[${LEN(${CALLERIDNUM})} = 4]?ext2,1:s,8)exten => s,8,GotoIf($[${LEN(${CALLERIDNUM})} != 4]?did2,1:exit,1)exten => ext2,1,GotoIf($[${LEN(${SAVED_EXTEN})} != 4]?ext2pstn,1:ext2,2)exten => ext2,2,GotoIf($[${LEN(${SAVED_EXTEN})} = 4]?exit,1:exit,1)exten => did2,1,GotoIf($[${LEN(${SAVED_EXTEN})} = 4]??did2ext,1:did2,2)exten => did2,2,GotoIf($[${LEN(${SAVED_EXTEN})} != 4]?exit,1:exit,1)exten => ext2pstn,1,NoOp(Caller*ID ${CALLERIDNUM} changed to ${ARG1})exten => ext2pstn,2,SetCIDNum(${ARG1})exten => did2ext,1,NoOp(Caller*ID ${CALLERIDNUM} changed to ${CALLERIDNUM:6})exten => did2ext,2,SetCIDNum(${CALLERIDNUM:6})exten => exit,1,NoOp(Caller*ID ${CALLERIDNUM} not changed)[macro-dial-result];; Handle Disconnect Cause Codes;exten => s,1,NoOp(HANGUPCAUSE is ${HANGUPCAUSE} and DIALSTATUS is ${DIALSTATUS})exten => s,2,AbsoluteTimeout(120)exten => s,3,GotoIf($[${HANGUPCAUSE} = 0]?s,5)exten => s,4,Goto(cause-${HANGUPCAUSE},1)exten => s,5,GotoIf($[${DIALSTATUS} = NOANSWER]?cause-16,1)exten => s,6,GotoIf($[${DIALSTATUS} = BUSY]?cause-17,1)exten => s,7,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?cause-16,1)exten => s,8,GotoIf($[${DIALSTATUS} = ANSWER]?cause-16,1)exten => s,9,Goto(cause-0,1)exten => cause-0,1,NoOp(AST_CAUSE_NOTDEFINED)exten => cause-0,2,GotoIf($["${SAVED_EXTEN}" != ""]?cause-0,4)exten => cause-0,3,SetVar(SAVED_EXTEN=${MACRO_EXTEN})exten => cause-0,4,GotoIf($["${SAVED_ARG1}" != ""]?cause-0,6)exten => cause-0,5,SetVar(SAVED_ARG1=${ARG1})exten => cause-0,6,GotoIf($["${ARG1}" = ""]?cause-0,11)exten => cause-0,7,System(/bin/echo "AST_CAUSE_NOTDEFINED received when dialing ${SAVED_EXTEN} trying again using ${SAVED_ARG1}." | /bin/mail -s "${SITE} PBX ERROR" pbxadmin-pager@stirlingprop.com)exten => cause-0,8,SetVar(ARG1=)exten => cause-0,9,Dial(${SAVED_ARG1})exten => cause-0,10,Macro(dial-result)exten => cause-0,11,System(/bin/echo "AST_CAUSE_NOTDEFINED received when dialing ${SAVED_ARG1} giving up." | /bin/mail -s "${SITE} PBX ERROR" pbxadmin-pager@stirlingprop.com)exten => cause-0,12,Zapateller(answer)exten => cause-0,13,Playback(an-error-has-occured)exten => cause-0,14,Playback(pls-try-call-later)exten => cause-0,15,Wait(3)exten => cause-0,16,Zapateller(answer)exten => cause-0,17,Playback(an-error-has-occured)exten => cause-0,18,Playback(pls-try-call-later)exten => cause-0,19,Wait(3)exten => cause-0,20,Congestionexten => cause-1,1,NoOp(AST_CAUSE_UNALLOCATED)exten => cause-1,2,Macro(number-disconnected,${MACRO_EXTEN})exten => cause-16,1,NoOp(AST_CAUSE_NORMAL_CLEARING)exten => cause-16,2,Hangupexten => cause-17,1,NoOp(AST_CAUSE_USER_BUSY)exten => cause-17,2,Busy[macro-say-digits];; ARG1=number to say;; Should handle 1-6 digits, 7 digits, 8 digits, 10 digits, 11 digits, 12 digits;;exten => s,1,GotoIf($[${LEN(${ARG1})} != 10]?s,3)exten => s,2,SayDigits(${ARG1:0:3})exten => s,3,GotoIf($[${LEN(${ARG1})} != 10]?s,6)exten => s,4,Wait(.25)exten => s,5,SayDigits(${ARG1:3:3})exten => s,6,GotoIf($[${LEN(${ARG1})} != 10]?s,10)exten => s,7,Wait(.25)exten => s,8,SayDigits(${ARG1:6})exten => s,9,Goto(s,12)exten => s,10,Wait(.25)exten => s,11,SayDigits(${ARG1})exten => s,12,NoOp[macro-number-changed];; ARG1=new number;exten => s,1,Zapateller(answer)exten => s,2,Playback(the-number-u-dialed)exten => s,3,Wait(.25)exten => s,4,Macro(say-digits,${MACRO_EXTEN})exten => s,5,Wait(.25)exten => s,6,Playback(has-been-changed-to)exten => s,7,Wait(.25)exten => s,8,Macro(say-digits,${ARG1})exten => s,9,Wait(.25)exten => s,10,Playback(pls-wait-connect-call)exten => s,11,Goto(extensions,${ARG1},1)[macro-number-disconnected];; ARG1=number dialed;exten => s,1,Zapateller(answer)exten => s,2,Wait(.25)exten => s,3,Playback(the-number-u-dialed)exten => s,4,Wait(.25)exten => s,5,Macro(say-digits,${ARG1})exten => s,6,Wait(.25)exten => s,7,Playback(has-been-disconnected)exten => s,8,Playback(or)exten => s,9,Playback(no-longer-in-service)exten => s,10,Wait(.25)exten => s,11,Playback(no-info-about-number)exten => s,12,Wait(3)exten => s,13,Zapateller(answer)exten => s,14,Wait(.25)exten => s,15,Playback(the-number-u-dialed)exten => s,16,Wait(.25)exten => s,17,Macro(say-digits,${ARG1})exten => s,18,Wait(.25)exten => s,19,Playback(has-been-disconnected)exten => s,20,Playback(or)exten => s,21,Playback(no-longer-in-service)exten => s,22,Wait(.25)exten => s,23,Playback(no-info-about-number)exten => s,24,Wait(3)exten => s,25,Congestion