N|Solid

# Recebendo eventos do Websocket do Q-Manager

É possível receber eventos que são disponibilizado pelo Q-Manager por meio de websocket, assim é possível desenvolver dashboard específicos para cada ambiente de trabalho.

# Conexão

Para receber eventos por socket é necessário se conectar ao socket server informando o IP do servidor e a porta 5000. Exemplo: 192.168.10.252:5000

# Funcionamento

O socket client pode tanto enviar como receber eventos.

Quando se deseja enviar um evento é necessário efetuar uma função chamada de emit. Exemplo: socket.emit('connect'). Neste caso o socket client solicitou ao server a conexão com o socket por meio do connect.

Quando se deseja fica observando o evento é necessário efetuar a função on. Exemplo: socket.on('reconnect'). Neste caso quando o socket server enviar o evento reconnect os clients receberão caso esteja "ouvindo" este evento.

# Eventos

# connect

Evento inicial para se conectar com o socket server.


# reconnect

Evento gerado pelo server quando se perde a primeira conexão e há a opção de reconexão automática.


# connect_error

Quando há algum erro na conexão do socket server e client.


# queuestatus

Evento inicial das filas de atendimento

Response:

{"Suporte":{
  "params":[{
    "name":"Suporte",
    "strategy":"leastrecent",
    "abandoned":248,
    "answered":1012,
    "calls":0
   }],
   "members":[{
     "name":"Uriel Rodrigues",
     "agent":"1019",
     "endpoint":"SIP/2019",
     "calls":"7",
     "status":"1",
     "paused":"0",
     "membertype":"dynamic",
     "priority":"0",
     "id":"2019"}
]}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

name: Nome da Fila.

strategy: Estratégia de distribuição da fila.

abandoned: Número de chamadas abandonadas desde que o asterisk começou a rodar.

answered: Número de chamadas atendidas desde que o asterisk começou a rodar.

calls: Quantidade de chamadas aguardando no momento.

members: Membros da fila que pode ser estáticos(ramais fixos) ou dinâmicos(operadores).

name: Nome do operador.

agent: Código do operador.

endpoint: Ramal do operador.

calls: Chamadas atendidas pelo operador.

status: Status do operador no momento. Veja os códigos de status no fim deste documento.

paused: Caso esteja 1 o operador está em pausa no momento. O valor 0 significa que o mesmo está disponível.

membertype: Tipo de membro.

priority: Prioridade de atendimento na fila.

id: Ramal do operador sem a tecnologia.


# peerstatus

Verifica quando algum ramal perde autenticação. É chamado também quando o ramal consegue autenticação.

{
    "event":"PeerStatus",
    "privilege":"system,all",
    "channeltype":"SIP",
    "peer":"SIP/8013",
    "peerstatus":"Registered",
    "address":"192.168.8.110:5060"
}
1
2
3
4
5
6
7
8

event: Nome do evento.

privilege: Privilégio do ramal.

channeltype: Tecnologia do ramal

peer: Código do Ramal

peerstatus: Situação do ramal. Poderá ser Registered(Registrado), Unregistered(Não registrado), Unknown(Desconhecido) ou Unreachable(Inacessível)

address: IP do ramal.


# queueevent

Eventos relacionados a fila:

  • enterqueue - Ligação entrou na fila.
  • queueanswer - Ligação atendida pela fila.
  • queueabandon - Ligação saiu da fila por abando.
  • queuetimeout - Ligação saiu da fila por passa o tempo limite.
  • queuehangup - Ligação finalizada na fila.

Response Enterqueue:

{
 "collection":"queue",
 "eventtype":"call",
 "uniqueid":"1519668420.16268",
 "callid":"201802261807018026",
 "queue":"Suporte",
 "from":"8026",
 "calldate":"2018-02-26T15:07:01.317Z",
 "event":"enterqueue",
 "context":"default",
 "exten":"8001",
 "callflow":[]
}
1
2
3
4
5
6
7
8
9
10
11
12
13

Response Queueanswer(Mesmos dados do evento enterqueue)

{
 "answerdate":"2018-02-26T15:07:12.243Z",
 "operator":{
  "endpoint":"SIP/2019",
  "eventdate":"2018-02-26T15:07:12.243Z",
  "name":"Uriel Rodrigues",
  "agent":"1019",
  "ringtime":"10"
 },
 "validate":true
}
1
2
3
4
5
6
7
8
9
10
11

uniqueid: Código único da chamada

callid: Código da chamada.

queue: Nome da fila

from: Número de origem

calldate: Data da ligação.

event: Nome do evento.

context: Contexto do asterisk.

exten: Extensão da chamada

callflow: Fluxo da chamada.

answerdate: Data do atendimento por um operador.

operator: Dados do operador como nome, ramal, código e tempo de ring.


# state-ringing

Quando a ligação está chamando no operador.

Response:

{"uniqueid":"1519670854.16292",
 "linkedid":"1519670852.16291",
 "agent":"1030",
 "name":"Tiago Zimmermann",
 "endpoint":"SIP/8026",
 "queues":{
  "Developer":{
   "pause":"0",
   "state":"off",
   "penalty":"0"
  },
 },
"state":"ringing",
"event":{
 "type":"call",
 "content":{"type":"incoming"}
}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

type: Tipo de chamada. Poderá ser incoming(chamada de entrada) ou outgoing(chamada de saída).


# state-answer

Quando a ligação é atendida pelo operador.

Response:

{"uniqueid":"1519671062.16294",
 "linkedid":"1519671061.16293",
 "agent":"1030",
 "name":"Tiago Zimmermann",
 "endpoint":"SIP/8026",
 "queues":{"Developer":{"pause":"0","state":"off","penalty":"0"}},
 "state":"answer",
 "event":{"type":"call","content":{"type":"incoming"}},"from":"2026"}
1
2
3
4
5
6
7
8

# state-hangup

Quando a ligação é finalizada. IMPORTANTE: Mesmo response do evento state-answer.


# agentlogin

Quado o operador efetua login.

Response:

{"eventtype":"feature",
"action":"login","collection":"agents",
"queue":{"Developer":{"pause":"0","state":"off","penalty":"0"}},
"operator":{"name":"Tiago Zimmermann","agent":"1030",
"endpoint":"SIP/8026",
"eventdate":"2018-02-26T16:00:33.903Z"}}
1
2
3
4
5
6

action: Ação efetuada.


# agentlogoffqueue

Quando o operador é retirado da fila.

Response:


{"eventtype":"feature",
"action":"logoffqueue","collection":"agents",
"queue":{"Developer":{}},
"operator":{"name":"Tiago Zimmermann","agent":"1030",
 "endpoint":"SIP/8026","eventdate":"2018-02-26T16:01:20.915Z"}
}
1
2
3
4
5
6
7

# agentlogoff

Quando o operador é deslogado.

Response:


{"eventtype":"feature",
"action":"logoff","collection":"agents",
"queue":{"Developer":{"action":"logoff"},
"status":{"action":"logoff"},
"pause":{"action":"logoff"}},
"operator":{"name":"Tiago Zimmermann","agent":"1030",
"endpoint":"","eventdate":"2018-02-26T16:04:48.335Z"}
}
1
2
3
4
5
6
7
8
9

# agentpause

Quando o operador efetua pausa.

Response:


{"eventtype":"feature",
"action":"pause","collection":"agents",
"queue":{"Developer":{},
"pause":{}},
"operator":{"name":"Tiago Zimmermann","agent":"1030",
"endpoint":"SIP/8026",
"eventdate":"2018-02-26T16:02:26.689Z",
"pause_desc":"Cafe"}
}
1
2
3
4
5
6
7
8
9
10

pause_desc: Nome da pausa.


# agentunpause

Quando o operador sai da pausa.

Response:

{"eventtype":"feature",
"action":"unpause","collection":"agents",
"queue":{"Developer":{},"pause":{}},
"operator":{"name":"Tiago Zimmermann",
"agent":"1030","endpoint":"SIP/8026",
"eventdate":"2018-02-26T16:03:40.585Z"}
}
1
2
3
4
5
6
7

# Códigos de status

Código Operador
1 Operador livre
2 ou 3 Operador ocupado
6 Operador ringando
Demais códigos Operador não autenticado

# Exemplo de socket client



 













console.log("Websocket client");
var io = require('socket.io-client');
var socket = io.connect('http://IP_DO_SERVIDOR:5000', {reconnect: true});

// ouvindo o evento de conexão com o socket server
socket.on('connect', function(data) {
  console.log("Connected with socket itc");
  // emite o evento de consulta de status das filas
  socket.emit('queuestatus');
});

// ouvindo o evento de status da fila chamado na parte anterior
socket.on('queuestatus', function(data) {
  console.log('Resultado do evento queuestatus-> ' + JSON.stringify(data));
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15