Macro um Bestätigung abzufragen

inschenjoer

Neuer User
Mitglied seit
9 Jan 2006
Beiträge
61
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich habe mir folgendes Macro gebaut:

[macro-Confirm]

#
# Drücke 5 zum bestätigen ... und warte 10 Sekunden
#
exten => s,1,Background(custom/press)
exten => s,n,Background(digits/5)
exten => s,n,Background(custom/to-confirm)
exten => s,n,Read(RESULT||1|s||10)
exten => s,n,GotoIf($["${RESULT}" = "5"]?:s|lbl_fail)
exten => s,n,Set(GLOBAL(CONFIRMRESULT)=OK)
exten => s,n,MacroExit
exten => s,n(lbl_fail),Set(GLOBAL(CONFIRMRESULT)=FAILURE)
exten => s,n,MacroExit

Es liest eine Eingabe vom Benutzer ein. Wenn es eine "5" ist, wurde die Bestätigung erhalten, andernfalls eben nicht.

Im Prinzipp funktioniert es auch. Allerdings nur wenn ich warte bis die drei Background-Funktionen durchgelaufen sind. Drücke ich vorher eine "5" kommt immer:

-- Invalid extension '5' in context 'mainmenu' on SIP/21-081d8920

Ich kann mir das nicht erklären. Das ist ja gerade der Unterschied zu Playback. Woran kann das liegen?

Viele Grüße
Sebastian
 
Background ist nicht für Einsatz innerhalb eines Macros gedacht, Du kannst stattdessen Read() verwenden:

If you use Background() inside a macro, the context utilized for the extension is the one where the macro is called, not the context in which the macro is running macro-xxxxx . So if you want to use background with an extension inside your macro, you can use the context parameter, and make it match the one of the macro you are in. Tested successfully on Asterisk 1.4.17.
 
Vielleicht nur ein Tippfehler, weil case-sensitive:

macro-Confirm ändern in macro-confirm

oder

exten => s,n,Background(custom/to-confirm) ändern in

exten => s,n,Background(custom/to-Confirm)

Ich aber von Macros überhaupt nichts weiter weiß! :-(
 
Wenn du in einem macro den "Background" befehl benutzt wird die Extension in dem aufrufenden Context angewählt. Entweder berücksichtigst du das oder du machst aus dem Macro eine Sub.

Zur verdeutlichung: Dashier würde als macro funktionieren:
Code:
[aufruf]
exten => s,1,Macro(macro-Confirm)
exten => s,n(weiter),....

; Wird aufgerufen wenn eine ziffer ausser der "5" im während "Background()" gedrückt wird
exten => i,1,Set(GLOBAL(CONFIRMRESULT)=FAILURE)
exten => i,n,Goto(s,weiter)

; "5" wurde beim "Background()" gedrückt
exten => 5,1,Set(GLOBAL(CONFIRMRESULT)=OK)
exten => 5,n,Goto(s,weiter)



[macro-Confirm]
# Drücke 5 zum bestätigen ... und warte 10 Sekunden
exten => s,1,Background(custom/press)
exten => s,n,Background(digits/5)
exten => s,n,Background(custom/to-confirm)
exten => s,n,Read(RESULT||1|s||10)
exten => s,n,GotoIf($["${RESULT}" = "5"]?:s|lbl_fail)
exten => s,n,Set(GLOBAL(CONFIRMRESULT)=OK)
exten => s,n,MacroExit
exten => s,n(lbl_fail),Set(GLOBAL(CONFIRMRESULT)=FAILURE)
exten => s,n,MacroExit

Im falle einer sub kannst du den aufrufenden context extension-frei halten. Das würde dann so in der Art aussehen:
Code:
[aufruf]
exten => s,1,Gosub(sub-Confirm,s,1)
exten => s,n,....

[sub-Confirm]
exten => s,1,Background(custom/press&digits/5&custom/to-confirm)  ; Lese Text vor und warte auf Eingabe
exten => s,n,WaitExten(10)    ; Warte 10 sek auf eine Eingabe
exten => s,n,Goto(i,1)   ; Auch 10sek nach dem Aufruf wurde nichts gedrückt, also FAIL

; nichts oder keine "5" wurde gedrückt
exten => i,1,Set(GLOBAL(CONFIRMRESULT)=FAILURE)
exten => i,n,Return()

; "5" wurde beim "Background()" gedrückt
exten => 5,1,Set(GLOBAL(CONFIRMRESULT)=OK)
exten => 5,n,Return()

Code ist nicht getestet, ich garantiere also nicht für die fehlerfreie Funktion bei copy&paste
 

Neueste Beiträge

Statistik des Forums

Themen
244,858
Beiträge
2,219,642
Mitglieder
371,571
Neuestes Mitglied
FritzFunk
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.