Example of our queue handling: exten => 123,1,Answer exten => 123,n,SetCIDName(test: ${CALLERIDNAME}) exten => 123,n,NoOp(exten=${EXTEN}) exten => 123,n,SetMusicOnHold(default) exten => 123,n,Queue(123|t) ; go to queue 123 exten => 123,n,Macro(vm,6000) ; no members in the queue or the caller sat to long so sending them to voicemail. exten => 123*,1,Macro(agent-add,123,) exten => 123**,1,Macro(agent-del,123) ; Adds a dynamic agent/member to a Queue ; Prompts for call-back number - in not entered, uses CIDNum [macro-agent-add] exten => s,1,Wait(1) exten => s,2,NoOp exten => s,3,Read(CALLBACKNUM,agent-user) ; get callback number from user exten => s,4,GotoIf($[foo${CALLBACKNUM} = foo]?5:7)) ; if user just pressed # or timed out, use cidnum exten => s,5,SetVar(CALLBACKNUM=${CALLERIDNUM}) exten => s,6,GotoIf($[foo${CALLBACKNUM} = foo]?2)) ; if still no number, start over exten => s,7,GotoIf($[foo${ARG2} = foo]?9:8)) ; arg2 is queue password exten => s,8,Authenticate(${ARG2}) exten => s,9,AddQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal) ; using chan_local allows us to have agents over trunks exten => s,10,Wait(1) exten => s,11,Playback(agent-loginok) exten => s,12,Hangup() ; Removes a dynamic agent/member from a Queue ; Prompts for call-back number - in not entered, uses CIDNum [macro-agent-del] exten => s,1,Wait(1) exten => s,2,NoOp exten => s,3,Read(CALLBACKNUM,agent-user) ; get callback number from user exten => s,4,GotoIf($[foo${CALLBACKNUM} = foo]?5:7)) ; if user just pressed # or timed out, use cidnum exten => s,5,SetVar(CALLBACKNUM=${CALLERIDNUM}) exten => s,6,GotoIf($[foo${CALLBACKNUM} = foo]?2)) ; if still no number, start over exten => s,7,RemoveQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal) exten => s,8,Wait(1) exten => s,9,Playback(agent-loggedoff) exten => s,10,Hangup()