![]() |
![]() |
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:

