[macro-huntgroup] ; ARG1 -- PBX ; ARG2 -- huntgroup ; exten => s,1,Verbose(1|Entering huntgroup ${ARG2} for PBX ${ARG1}) 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} - ${STRATEGY} - ${MUSIC} - ${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,NoOp(1|${IF($[${HASH(HUNT_${X}|rrm_mark)} = 1]?SETTING RRM_START - ${SET(RRM_START=${X})}:RRM_START VALUE - ${RRM_START})}) exten => members,n,Set(${IF($[${HASH(HUNT_${X}|rrm_mark)} = 1]?RRM_START=${X})}) exten => members,n,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,Set(${IF($["${RRM_START}" = ""]?RRM_START=1)}) exten => members,n,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)}) exten => rrmemory,n,Wait(6) exten => rrmemory,n,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)