Michael Stahl
2005-May-16 15:13 UTC
[Asterisk-Users] Dial plan - does not stop after first match
My dial plan seems to work great - in that when I call extensions 1234 it connects to 1234. Strangely, after the call terminates (the other side hangs up first), Asterisk continues in the same context and then matches to extensions _. which causes an invalid extension error! Why does asterisk not leave the context (called internalmenu) after the remote hangup? Instead, it continues to the InternalInvalid context (included later in the InternalMenu context). I'm confused! Here is a snippet of the relevant context and macro. Thanks, Mike ;**************************************************************** ; Macros ;**************************************************************** [macro-stdexten] ; ; Standard extension macro: ; ${ARG1} - Extension (we could have used ${MACRO_EXTEN} here as well ; ${ARG2} - Device(s) to ring ; exten => s,1,Playback(transfer,skip) ; "Please hold while..." but skip if channel is not up ;exten => s,2,SendText('Calling extension '${ARG1}) ; Tell the user what extension being called exten => s,2,SetVar(LastStatus=CallDone) ; Ensure script knows that a Dial was completed exten => s,3,Dial(${ARG2},${RINGTIME},r) ; Ring the interface, 20 seconds maximum exten => s,4,NoOp(${DIALSTATUS}) ; Show status after hangup exten => s,5,Goto(s-${DIALSTATUS},1) ; Jump based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER) exten => s-NOANSWER,1,Voicemail(u${ARG1}) ; If unavailable, send to voicemail w/ unavail announce exten => s-BUSY,1,Voicemail(b${ARG1}) ; If busy, send to voicemail w/ busy announce exten => s-ANSWER,1,NoOp ; If call answered, then do nothing after hangup exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer exten => a,1,VoicemailMain(${ARG1}) ; If they press *, send the user into VoicemailMain ;**************************************************************** ; Extensions available to all callers ;**************************************************************** [default] ; Local extensions begin with 2XXX exten => ${EXT_MIKE},1,Macro(stdexten,${EXTEN},${CON_MIKE}) ; Mike Stahl extension exten => ${EXT_SPA1},1,Macro(stdexten,${EXTEN},${CON_SPA1}) ; SPA line 1 extension exten => ${EXT_SPA2},1,Macro(stdexten,${EXTEN},${CON_SPA2}) ; SPA line 2 extension exten => ${EXT_DIANA},1,Macro(fakeexten,${EXTEN},${CON_DIANA}) ; Diana Stahl extension exten => ${EXT_KLAUS},1,Macro(stdexten,${EXTEN},${CON_KLAUS}) ; Klaus Stahl extension exten => ${EXT_BOB},1,Macro(fakeexten,${EXTEN},${CON_BOB}) ; Bob Stahl extension exten => ${EXT_BILL},1,Macro(fakeexten,${EXTEN},${CON_BILL}) ; Bill Stahl extension ; Direct into voicemail system exten => ${EXT_VOICEMAIL},1,VoicemailMain exten => ${EXT_VOICEMAIL},2,Hangup ; Dial by name exten => 1,1,Directory(default) ; Send user to the directory ;**************************************************************** ; Menu available to internal callers - full access ;**************************************************************** [menuinternal] include => fwd ; Allow outbound access on FWD using 8 prefix include => trunkfullaccess ; Allow full access to external line(s) include => default ; Allow access to all extensions ; Administration menu exten => ${EXT_ADMIN},1,Goto(menuadmin,s,1) ; After a message left, offer instruction what to do. ; This menu is never reached INITIALLY if a specific extension is entered exten => s,1,GotoIf($["${LastStatus}" != "CallDone"] & $["${LastStatus}" != ""]?4) exten => s,2,SetVar(LastStatus=Try1) exten => s,3,Goto(11) exten => s,4,GotoIf($["${LastStatus}" != "Try1"]?10) exten => s,5,SetVar(LastStatus=UserIdle) exten => s,6,Goto(11) exten => s,7,GotoIf($["${LastStatus}" != "InvalidExtension"]?13) exten => s,8,SetVar(LastStatus=UserInvalid) exten => s,9,Goto(11) exten => s,10,SetVar(LastStatus=Error) exten => s,11,Background(ocg/enterextension) ; PLAY enter the extension you wish to dial ; "*" Repeat the previous menu exten => *,1,Goto(s,1) ; "#" hangup exten => #,1,Goto(internalendcall,s,1) ; End the call ; If any other extension then say invalid (used only for initial connection to allow connection ; instead of 403 error) include => internalinvalid ; If they take too long, check if completed something useful (LastStatus) go back to menu, else timeout exten => t,1,GotoIf($["${LastStatus}" = "UserIdle"] | $["${LastStatus}" = "UserInvalid"] | $["${LastStatus}" = "Error"]?internalendcall,s,1) exten => t,2,Wait(RepeatMenuWaitTime) ; Wait for seconds before playing menu after last command/event exten => t,3,Goto(s,1) ; Go back to the main menu and repeat prompt ; If they enter an invalid extension. Should only get here from _.,1 exten => i,1,SetVar(LastStatus=InvalidExtension) exten => i,2,Background(pbx-invalid) ; "That's not valid, try again" exten => i,3,Wait(1) exten => i,4,Goto(s,1) ; timeout overall exten => T,1,Goto(internalendcall,s,1) [internalinvalid] ; This must be in a macro to ensure proper order of execution exten => _.,1,GotoIf($["${LastStatus}" = "CallDone"]?internalmenu,t,2) ; For some reason drop here after call done exten => _.,2,goto(menuinternal,i,1) ; Why do we go here after last extensinon called hangup / noanswer [internalendcall] ; End the call to the internal user exten => s,1,Playback(vm-goodbye) exten => s,2,hangup -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.digium.com/pipermail/asterisk-users/attachments/20050516/df27f8bb/attachment.htm
Jean-Yves Avenard
2005-May-16 16:19 UTC
[Asterisk-Users] Dial plan - does not stop after first match
Hello On 17/05/2005, at 8:13 AM, Michael Stahl wrote:> My dial plan seems to work great - in that when I call extensions > 1234 it connects to 1234. Strangely, after the call terminates > (the other side hangs up first), Asterisk continues in the same > context and then matches to extensions _. which causes an invalid > extension error! > > Why does asterisk not leave the context (called internalmenu) after > the remote hangup? Instead, it continues to the InternalInvalid > context (included later in the InternalMenu context). I'm confused! > > Here is a snippet of the relevant context and macro. Thanks, > Mike >But that's exactly what your dialplan ask asterisk to do: keep doing stuff after the call has hanged up. If you do not want to continue after Dial, then make sure there a Hangup and nothing else after that.> > ;**************************************************************** > ; Macros > ;**************************************************************** > > [macro-stdexten] > ; > ; Standard extension macro: > ; ${ARG1} - Extension (we could have used ${MACRO_EXTEN} here as > well > ; ${ARG2} - Device(s) to ring > ; > exten => s,1,Playback(transfer,skip) ; "Please hold while..." but > skip if channel is not up > ;exten => s,2,SendText('Calling extension '${ARG1}) ; Tell the user > what extension being called > exten => s,2,SetVar(LastStatus=CallDone) ; Ensure script knows that > a Dial was completed > exten => s,3,Dial(${ARG2},${RINGTIME},r) ; Ring the interface, 20 > seconds maximum > exten => s,4,NoOp(${DIALSTATUS}) ; Show status after hangup > exten => s,5,Goto(s-${DIALSTATUS},1) ; Jump based on status > (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER) >Here , you tell asterisk to Goto s-. after the Dial operation...> > exten => s-NOANSWER,1,Voicemail(u${ARG1}) ; If unavailable, send to > voicemail w/ unavail announce > > exten => s-BUSY,1,Voicemail(b${ARG1}) ; If busy, send to voicemail > w/ busy announce > > exten => s-ANSWER,1,NoOp ; If call answered, then do nothing > after hangup > > exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer > > exten => a,1,VoicemailMain(${ARG1}) ; If they press *, send the > user into VoicemailMain > >--- Jean-Yves Avenard Hydrix Pty Ltd - Embedding the net www.hydrix.com | fax +61 3 95722686 | office +61 3 8573 5299 | direct +61 3 8573 5200 -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.digium.com/pipermail/asterisk-users/attachments/20050516/d119ddb9/attachment.htm