[macro-huntgroup] ; ARG1 -- PBX ; ARG2 -- huntgroup ; exten => s,1,Verbose(1|Entering huntgroup ${ARG2} for PBX ${ARG1}) exten => s,n,Answer() exten => s,n,Verbose(1|Getting initial values: strategy, music, timeout for PBX ${ARG1} in huntgroup ${ARG2}) exten => s,n,Set(ARRAY(Q_ID,STRATEGY,MUSIC,TIMEOUT)=${HUNT_INITIAL(${ARG1},${ARG2})}) exten => s,n,Verbose(1|Returned: Q_ID: ${Q_ID} - STRATEGY: ${STRATEGY} - MUSIC: ${MUSIC} - TIMEOUT: ${TIMEOUT}) exten => s,n,Goto(members,1) exten => s,n,Hangup() exten => members,1,Verbose(1|Gathering members) exten => members,n,Set(COUNT=${HUNT_MEMBERS_COUNT(${Q_ID})}) exten => members,n,GotoIf($[${COUNT} = 0]?h,end) exten => members,n,Set(X=1) ; Start at 1 so we don't have an infinite loop exten => members,n,While($[${X} <= ${COUNT}]) exten => members,n,Set(OFFSET=$[${X} - 1]) ; We want to start assigning at record 1, but SQL wants record 0 exten => members,n,Set(HASH(HUNT_${X})=${HUNT_MEMBERS(${Q_ID}|${OFFSET})}) exten => members,n,Verbose(1|HASH: ${HASH(HUNT_${X}|tech)} - ${HASH(HUNT_${X}|member_id)}) ; Only No Operation if the HASH(HUNT_${X}|rrm_mark) returns NULL exten => members,n,Verbose(1|Value of hash: ${HASH(HUNT_${X}|rrm_mark)}) exten => members,n,GotoIf($["${HASH(HUNT_${X}|rrm_mark)}" = "1"]?setvar:next) exten => members,n(setvar),Set(RRM_START=${X}) exten => members,n(next),Verbose(1|RRM_START: ${RRM_START} - HASH rrm_mark: ${HASH(HUNT_${X}|rrm_mark)}) exten => members,n,Set(X=$[${X} + 1]) exten => members,n,EndWhile(End of loop) exten => members,n,GotoIf($["${RRM_START}" = ""]?:goto_strategy) exten => members,n,Set(RRM_START=1) exten => members,n(goto_strategy),Goto(${STRATEGY},1) exten => rrmemory,1,Verbose(1|Entering round-robin memory strategy) ; If we are less than or equal to COUNT (last position), return one less than start postion, else, return start (one) exten => rrmemory,n,Verbose(1|RRM_START: ${RRM_START}) exten => rrmemory,n,Set(RRM_END=${IF($[${RRM_START} <= ${COUNT} & ${RRM_START} != 1]?$[${RRM_START} - 1]:${COUNT})}) exten => rrmemory,n,Verbose(1|RRM_START: ${RRM_START}) exten => rrmemory,n,Set(POS=${RRM_START}) exten => rrmemory,n(start),Verbose(1|Calling ${HASH(HUNT_${POS}|tech)} - ${HASH(HUNT_${POS}|member_id)}) ; What kind of tech are we calling? GRP, SIP, IAX, or PEER (peer will use either SIP or IAX based on chanisavail) exten => rrmemory,n,GotoIf($["${HASH(HUNT_${POS}|tech)}" = "SIP"]?sip) exten => rrmemory,n,GotoIf($["${HASH(HUNT_${POS}|tech)}" = "IAX"]?iax) exten => rrmemory,n,GotoIf($["${HASH(HUNT_${POS}|tech)}" = "PEER"]?peer) exten => rrmemory,n,GotoIf($["${HASH(HUNT_${POS}|tech)}" = "GRP"]?grp:h,1) ; no where to go... lets die! exten => rrmemory,n(sip),Verbose(1|Calling SIP member...) ; OK, lets get the information of who we're really calling exten => rrmemory,n,Set(HASH(MEMBER)=${ROUTE_MEMBER(${HASH(HUNT_${POS}|member_id)})}) exten => rrmemory,n,Set(MEMBER=SIP/${HASH(MEMBER|user_name)}#${HASH(MEMBER|pbx)}) exten => rrmemory,n,Macro(callerid,IN,EXT,${CUT(MEMBER,/,2)}) exten => rrmemory,n,Macro(callerid,OUT,FWD) exten => rrmemory,n,GotoIf($["${HASH(MEMBER|sip_enabled)}"]?check_local:done_calling) exten => rrmemory,n(check_local),Verbose(1|OK... Calling ${MEMBER}) exten => rrmemory,n,ChanIsAvail(${MEMBER}) exten => rrmemory,n,GotoIf($["${AVAILSTATUS}" != "0"]?try_remote:call) exten => rrmemory,n(try_remote),Set(MEMBER=${DUNDILOOKUP(${CUT(MEMBER,/,2)}|clients|b)}) exten => rrmemory,n,GotoIf($["${MEMBER}" != ""]?call:done_calling) exten => rrmemory,n(call),Dial(${MEMBER},${HASH(MEMBER|ring_cycle)}) exten => rrmemory,n,Goto(done_calling) exten => rrmemory,n(iax),Verbose(1|Calling IAX member...) ; OK, lets get the information of who we're really calling exten => rrmemory,n,Set(HASH(MEMBER)=${ROUTE_MEMBER(${HASH(HUNT_${POS}|member_id)})}) exten => rrmemory,n,Goto(done_calling) exten => rrmemory,n(peer),Verbose(1|Calling PEER member...) ; OK, lets get the information of who we're really calling exten => rrmemory,n,Set(HASH(MEMBER)=${ROUTE_MEMBER(${HASH(HUNT_${POS}|member_id)})}) exten => rrmemory,n,Goto(done_calling) exten => rrmemory,n(grp),Verbose(1|Calling GRP member(s)...) ; When calling a group of phones, we need to get the group first... checking to see ; who is available locally, and also remotely. Once we determine that, we'll build ; up our string that will call the members of the group in one fell swoop! exten => rrmemory,n,Set(GROUP_COUNT=${HUNT_GROUP_MEMBERS_COUNT(${HASH(HUNT_${POS}|member_id)})}) exten => rrmemory,n,GotoIf($["${GROUP_COUNT}" = "0"]?done_calling) exten => rrmemory,n,Set(GROUP_X=1) exten => rrmemory,n,While($[${GROUP_X} <= ${GROUP_COUNT}]) exten => rrmemory,n,Set(GROUP_OFFSET=$[${GROUP_X} - 1]) ; OK, time to get the member ID that we're going to look up exten => rrmemory,n,Set(HASH(GROUP_MEMBER)=${HUNT_GROUP_MEMBERS(${HASH(HUNT_${POS}|member_id)},${GROUP_OFFSET})}) ; Now lets get the actual member information exten => rrmemory,n,Set(HASH(MEMBER)=${ROUTE_MEMBER(${HASH(GROUP_MEMBER|member_id)})}) exten => rrmemory,n,GotoIf($["${HASH(MEMBER|user_name)}" = ""]?increment) exten => rrmemory,n,Set(HOLDER=${HASH(GROUP_MEMBER|member_tech)}/${HASH(MEMBER|user_name)}#${HASH(MEMBER|pbx)}) exten => rrmemory,n,ChanIsAvail(${HOLDER}) exten => rrmemory,n,Verbose(1|AVAILSTATUS: ${AVAILSTATUS}) exten => rrmemory,n,GotoIf($["${AVAILSTATUS}" != "0"]?lookup_remote:set_local) exten => rrmemory,n(lookup_remote),Set(HOLDER=${DUNDILOOKUP(${CUT(HOLDER,/,2)}|clients|b)}) exten => rrmemory,n,GotoIf($["${HOLDER}" = ""]?increment) exten => rrmemory,n(set_local),Set(DIALING_MEMBER=${IF($["${DIALING_MEMBER}" = ""]?${HOLDER}:${DIALING_MEMBER}&${HOLDER})}) exten => rrmemory,n(increment),Set(GROUP_X=$[${GROUP_X} + 1]) exten => rrmemory,n,EndWhile() exten => rrmemory,n,GotoIf($["${DIALING_MEMBER}" = ""]?done_calling) exten => rrmemory,n,Dial(${DIALING_MEMBER},${GROUP_RING_CYCLE(${HASH(HUNT_${POS}|member_id)})}) exten => rrmemory,n,Goto(done_calling) exten => rrmemory,n(done_calling),GotoIf($[${POS} = ${RRM_END}]?h,1) ; If we're on our last position, set the next start position back to the start of the list exten => rrmemory,n,Set(POS=${IF($[${POS} = ${COUNT}]?1:$[${POS} + 1])}) exten => rrmemory,n,Goto(start) exten => h,1,Verbose(1|Cleanup!) exten => h,n,Set(HUNT_RRM_CLEAR(${Q_ID})="") ; set fields NULL exten => h,n,Set(HUNT_MEMBERS(${Q_ID})=${IF($[${EXISTS(${POS})} & ${POS} > 1 & ${POS} != ${COUNT}]?$[${POS} - 1]:0)}) ; set member for memory exten => h,n(end),Verbose(1|All done -- goodbye) exten => h,n,Hangup()