Imagine que você possuiu um fila para atendimento telefônico do suporte de seus clientes e os membros desta fila variam em função de turnos. Todos os membros possuem também contas no seu servidor XMPP (Openfire, talvez) e ficam constantemente conectados neste para comunicarem-se entre si.
Não seria interessante se a cada chamada recebida na fila, todos os membros desta recebessem uma notificação via XMPP, informando inclusive o nome do cliente que está ligando?
Pois bem, isso pode ser feito e funciona muito bem.
E como faz?
Bom, existem algumas premissas que precisam ser atendidas:
- É preciso ter um servidor Asterisk 11 ou superior funcional
- É preciso ter um servidor XMPP funcional
- É preciso que seu Asterisk já está devidamente configurado para “falar” com o seu servidor XMPP
- É preciso ter uma forma de identificar qual o JID de cada ramal (isso pode ficar no DB, na tabela sip)
- É preciso ter uma forma de identificar o cliente em função de seu número telefônico
Atendidos os requisitos, é hora de ajustar seu plano de discagem.
No arquivo /etc/asterisk/extensions.conf, antes da ligação ser enviada para a fila do suporte, inclua as seguintes linhas no contexto:
; o agi a seguir, não é tema deste post, mas ele deve identificar o nome do cliente baseado no callerid e colocá-lo na variável CUSTOMER same => n,agi(getclient.agi) ; a variável QUEUE_XMPP pode ser setada no contexto [globals] same => n,Set(QUEUE_XMPP="helpdesk") same => n,Set(MSGXMPP="Suporte: Cliente ${CUSTOMER}") same => n,macro(XMPPSuporte,${MSGXMPP},${QUEUE_XMPP})
O XMPPSuporte é uma macro que deve existir no arquivo /etc/asterisk/extensions.ael. Eis o código:
context macro-XMPPSuporte { s => { &XMPPSuporte(${ARG1},${ARG2}); }; }; macro XMPPSuporte(MSGXMPP,QUEUE_XMPP) { x=0; num_members=${QUEUE_MEMBER(${QUEUE_XMPP},count)}; if (${num_members} > 0) { Set(queue_members=${QUEUE_MEMBER_LIST(${QUEUE_XMPP})}); NoOP(${num_members} membros na fila ${QUEUE_XMPP} - ${queue_members}); while (${x} < ${num_members}) { x = ${x} + 1; if (${num_members} = 1) { Set(member=${queue_members}); } else { Set(member=${CUT(queue_members,\,,${x})}); } Set(ramal=${CUT(member,"/",2)}); agi(get_exten_jid.agi); // Este agi busca o jid associado ao ramal, exemplo aqui (para DB Postgresql) Set(jid=${XMPPJID}); Set(user=${CUT(jid,"@",1)}); NoOP(Enviado mensagem para o ramal ${ramal} - jabber id ${jid}); &SendJabberUra(${user},${MSGXMPP}); } } }; context macro-SendJabberUra { s => { &SendJabberUra(${ARG1},${ARG2}); }; }; macro SendJabberUra(DST, MSG) { NoOp (Enviado mensagem para ${DST}); // A variável XMPPDOMAIN pode ser setada também no contexto [globals] XMPPDOMAIN="seudominiojabber.com"; // Não esqueça de setar a variável RESOURCE_XMPP no contexto [globals] de acordo com sua configuração JabberSend(${RESOURCE_XMPP},${DST}@${XMPPDOMAIN},${MSG}); };
É isso aí, basta adaptar o código a seu cenário e fazer uso do recurso.
Até.
Leia também: