id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	confirmation	distro	engine	distro_ver	engine_version	svn_rev
1949	Improved on agent-add and agent-del plus loggin with queue_log()	ljackson		I would like to have this reviewed and critiqued.\r\n\r\n== Queue Log Function ==\r\n\r\nQueueLog(queuename,uniqueid,agent,event,params):\r\n\r\nAllows you to write your own events into the queue log:\r\n\r\n QueueLog(101,${UNIQUEID},${AGENT},WENTONBREAK,600)\r\n\r\n[http://bugs.digium.com/view.php?id=7368 http://bugs.digium.com/view.php?id=7368]\r\n\r\n== Dynamic Members Extension ==\r\n\r\nAdd the following line to enable the agent-manage macro for a queue into your extensions configuration file.\r\n\r\n exten => 1234*,1,Macro(agent-manage,1234,)\r\n\r\n== Dynamic Members Macros ==\r\n\r\nAdd the appropriate macro for your needs and version of asterisk into your macros configuration file.\r\n\r\n=== Dynamically Manage Agents/Members and log Time-In-Queue (Asterisk 1.4) ===\r\n\r\nAdds or removes a dynamic member to the queue and logs the time in queue in seconds to /var/log/asterisk/queue_log.\r\n\r\n{{{\r\n; Adds or removes a dynamic agent/member for a queue and logs Time-In-Queue\r\n; arg1 = queue number, arg2 = number\r\n[macro-agent-manage]\r\nexten => s,1,Wait(1)\r\nexten => s,2,Macro(user-callerid)\r\nexten => s,3,Set(CALLBACKNUM=${CALLERID(number)})\r\nexten => s,4,GotoIf($["${CALLBACKNUM}" = ""]?116))      ; if no number, jump to fail.\r\nexten => s,5,AddQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n||j)       ; using chan_local allows us to have agents over trunks\r\nexten => s,6,QueueLog(${UNIQUEID},${ARG1},${CALLBACKNUM},AGENTLOGIN,0)\r\nexten => s,7,Set(DB(agentlogin/q_${ARG1}_a_${CALLBACKNUM})=${EPOCH})\r\nexten => s,8,UserEvent(Agentlogin|Agent: ${CALLBACKNUM})\r\nexten => s,9,Wait(1)\r\nexten => s,10,Playback(agent-loginok)\r\nexten => s,11,Hangup()\r\nexten => s,106,RemoveQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n)\r\nexten => s,107,UserEvent(RefreshQueue)\r\nexten => s,108,Set(ORGEPOCH=${DB(agentlogin/q_${ARG1}_a_${CALLBACKNUM})})\r\nexten => s,109,Set(LGNT=$[${EPOCH} - ${ORGEPOCH}])\r\nexten => s,110,GotoIf($["${LGNT}" = "0"]?116:111)\r\nexten => s,111,QueueLog(${UNIQUEID},${ARG1},${CALLBACKNUM},AGENTLOGOFF,${LGNT})\r\nexten => s,112,DBdel(agentlogin/q_${ARG1}_a_${CALLBACKNUM})\r\nexten => s,113,Wait(1)\r\nexten => s,114,Playback(agent-loggedoff)\r\nexten => s,115,Hangup()\r\nexten => s,116,Playback(sorry-cant-let-you-do-that) ; Catch error and give simple notification.\r\nexten => s,117,Hangup()\r\n}}}\r\n\r\n=== Dynamically Manage Agents/Members and log Time-In-Queue (Asterisk 1.2) ===\r\n\r\nAdds or removes a dynamic member to the queue and logs the time in queue in seconds to /var/log/asterisk/queue_log.\r\n\r\n{{{\r\n; Adds or removes a dynamic agent/member for a queue and logs Time-In-Queue\r\n; arg1 = queue number, arg2 = number\r\n[macro-agent-manage]\r\nexten => s,1,Wait(1)\r\nexten => s,2,Macro(user-callerid)\r\nexten => s,3,Set(CALLBACKNUM=${CALLERID(number)})\r\nexten => s,4,GotoIf($["${CALLBACKNUM}" = ""]?116))      ; if no number, jump to fail.\r\nexten => s,5,AddQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n)       ; using chan_local allows us to have agents over trunks\r\nexten => s,6,QueueLog(${UNIQUEID},${ARG1},${CALLBACKNUM},AGENTLOGIN,0)\r\nexten => s,7,Set(DB(agentlogin/q_${ARG1}_a_${CALLBACKNUM})=${EPOCH})\r\nexten => s,8,UserEvent(Agentlogin|Agent: ${CALLBACKNUM})\r\nexten => s,9,Wait(1)\r\nexten => s,10,Playback(agent-loginok)\r\nexten => s,11,Hangup()\r\nexten => s,106,RemoveQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n)\r\nexten => s,107,UserEvent(RefreshQueue)\r\nexten => s,108,Set(ORGEPOCH=${DB(agentlogin/q_${ARG1}_a_${CALLBACKNUM})})\r\nexten => s,109,Set(LGNT=$[${EPOCH} - ${ORGEPOCH}])\r\nexten => s,110,GotoIf($["${LGNT}" = "0"]?116:111)\r\nexten => s,111,QueueLog(${UNIQUEID},${ARG1},${CALLBACKNUM},AGENTLOGOFF,${LGNT})\r\nexten => s,112,DBdel(agentlogin/q_${ARG1}_a_${CALLBACKNUM})\r\nexten => s,113,Wait(1)\r\nexten => s,114,Playback(agent-loggedoff)\r\nexten => s,115,Hangup()\r\nexten => s,116,Playback(sorry-cant-let-you-do-that) ; Catch error and give simple notification.\r\nexten => s,117,Hangup()\r\n}}}\r\n\r\n=== Dynamically Manage Agents/Members (Asterisk 1.4) ===\r\n\r\nAdds or removes a dynamic member to the queue.\r\n\r\n{{{\r\n; Adds or removes a dynamic agent/member for a queue\r\n; arg1 = queue number, arg2 = number\r\n[macro-agent-manage]\r\nexten => s,1,Wait(1)\r\nexten => s,2,Macro(user-callerid)\r\nexten => s,3,Set(CALLBACKNUM=${CALLERID(number)})\r\nexten => s,4,GotoIf($["${CALLBACKNUM}" = ""]?116))      ; if no number, jump to fail.\r\nexten => s,5,AddQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n||j)       ; using chan_local allows us to have agents over trunks\r\nexten => s,6,UserEvent(Agentlogin|Agent: ${CALLBACKNUM})\r\nexten => s,7,Wait(1)\r\nexten => s,8,Playback(agent-loginok)\r\nexten => s,9,Hangup()\r\nexten => s,106,RemoveQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n)\r\nexten => s,107,UserEvent(RefreshQueue)\r\nexten => s,108,Wait(1)\r\nexten => s,109,Playback(agent-loggedoff)\r\nexten => s,110,Hangup()\r\nexten => s,111,Playback(sorry-cant-let-you-do-that) ; Catch error and give simple notification.\r\nexten => s,112,Hangup()\r\n}}}\r\n\r\n=== Dynamically Manage Agents/Members (Asterisk 1.2) ===\r\n\r\nAdds or removes a dynamic member to the queue.\r\n\r\n{{{\r\n; Adds or removes a dynamic agent/member for a queue\r\n; arg1 = queue number, arg2 = number\r\n[macro-agent-manage]\r\nexten => s,1,Wait(1)\r\nexten => s,2,Macro(user-callerid)\r\nexten => s,3,Set(CALLBACKNUM=${CALLERID(number)})\r\nexten => s,4,GotoIf($["${CALLBACKNUM}" = ""]?116))      ; if no number, jump to fail.\r\nexten => s,5,AddQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n)       ; using chan_local allows us to have agents over trunks\r\nexten => s,6,UserEvent(Agentlogin|Agent: ${CALLBACKNUM})\r\nexten => s,7,Wait(1)\r\nexten => s,8,Playback(agent-loginok)\r\nexten => s,9,Hangup()\r\nexten => s,106,RemoveQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n)\r\nexten => s,107,UserEvent(RefreshQueue)\r\nexten => s,108,Wait(1)\r\nexten => s,109,Playback(agent-loggedoff)\r\nexten => s,110,Hangup()\r\nexten => s,111,Playback(sorry-cant-let-you-do-that) ; Catch error and give simple notification.\r\nexten => s,112,Hangup()\r\n}}}\r\n\r\n=== FreePBX ===\r\n\r\nThe above macros are based on macros from the FreePBX front-end to Asterisk. If you choose to implement any of the above macros and are using FreePBX I recommend doing some additional cleanup.\r\n\r\n* Remove all references to agent-add and agent-del in extensions_additional.conf as agent-manage will now facilitate this.\r\n exten => 1234*,1,Macro(agent-add,1234,)\r\n exten => 1234**,1,Macro(agent-del,1234,1234)\r\n\r\n* Remove agent-add and agent-del from extension.conf as agent-manage will now facilitate this.\r\n [macro-agent-add]\r\n [macro-agent-del]\r\n 	Feature Requests	new	minor	Undetermined	Queues	2.2.1		agent-add, agent-del				All			
