Browse Source

migrate monitora agente

websocket
lucascardo12 3 years ago
parent
commit
921f89df2d
  1. 211
      scripts/service/monitora_agente_wpp.php
  2. 29
      scripts/service/request.php
  3. 8
      scripts/service/teste.php
  4. 196
      service/MonitoraAgente.php
  5. 32
      websocket/Servidorsocket.php
  6. 2
      websocket/WsInterface.php

211
scripts/service/monitora_agente_wpp.php

@ -1,211 +0,0 @@
#!/usr/bin/php -q
<?php
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/../../includes/config.php';
error_reporting(E_ERROR);
ini_set('display_errors', 0);
use app\Controllers\AgentController;
use app\Controllers\BilheteController;
use app\Controllers\MessageController;
use app\Controllers\ClassificacaoController;
use app\Controllers\SupervisorQueueController;
use app\Core\Connect;
use app\Core\CoreMedia;
use app\Providers\Positus;
use app\Core\Media;
use app\Core\WhatsApp;
use app\Models\Message;
use app\Models\NotificaMedia;
use app\Providers\ApiTelegram;
$agente = new AgentController();
$bilhete = new BilheteController();
$message = new MessageController();
$media = new CoreMedia();
$media2 = new Media();
$notificaMedia = new NotificaMedia();
$mensages = new Message();
$classificacao = new ClassificacaoController();
$supervisor = new SupervisorQueueController();
/*
* Para rodar como um processo normal é preciso passar "N" como primeiro parametro.
*/
$notDaemon = isset($argv[1]) && (strtoupper($argv[1]) === 'N');
/*
* Inicializa o daemom quando N não for informado.
*/
GetDaemon($notDaemon);
declare(ticks=1);
$statusSignal = 0;
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");
$timeout_agent_alert = (CONF_WHATSAPP_TIMEOUT_AGENT_AVISO / 60);
$timeout_agent_desconexao = (CONF_WHATSAPP_TIMEOUT_AGENT_DESCONEXAO / 60);
$timeout_agent_classificacao = (CONF_WHATSAPP_TIMEOUT_AGENT_CLASSIFICACAO / 60);
$mensagem = [
"ALERTA_INATIVIDADE" => "Você será desconectado em " . ($timeout_agent_desconexao - $timeout_agent_alert) . " minutos, para permanecer em atendimento clique em '/presente'",
"ALERTA_DESCONECTADO" => "Você foi desconectado por inatividade!",
"ALERTA_CLIENTE" => "Olá, como podemos lhe ajudar!",
"TIMEOUT_CLIENT_INATIVIDADE" => "O tempo da conversa foi expirado, por favor volte novamente a fila para um novo atendimento!",
"TALK_FINISHED" => "O atendimento foi finalizado!",
"TALK_ALERT_FINISH" => "Por favor, volte a comunicação com nosso atendimento em 1 minuto ou atendimento será encerrado!"
];
while (true) {
try {
$agentesLista = $agente->inactiveAgents();
foreach ($agentesLista as $item) {
$positus = retornaApiMedia($item['SALA1']);
$freetime = $item['FREETIME'] / 60;
if (($freetime >= $timeout_agent_alert) && ($freetime < $timeout_agent_desconexao) && !$item['SALA2'] && $item['STATUS'] == CONF_AGENT_STATUS_LIVRE) {
$agente->timeFinishAgente($item['MATRICULA'], $item['RAMAL'], ($timeout_agent_desconexao - $timeout_agent_alert));
$positus->enviarMsgIterativaBotao($item['RAMAL'], $mensagem['ALERTA_INATIVIDADE'], [
[
"type" => "reply",
"reply" => [
"id" => "unique-postback-id-1",
"title" => utf8_encode("/presente")
]
]
]);
} else if ($freetime >= $timeout_agent_desconexao && $item['STATUS'] == CONF_AGENT_STATUS_LIVRE) {
$agente->logoff($item['RAMAL']);
$positus->enviarMsg($item['RAMAL'], utf8_encode($mensagem['ALERTA_DESCONECTADO']));
} else {
$agente->refreshAgent($item['RAMAL'], $item['SALA2']);
}
if ($item['STATUS'] == CONF_AGENT_STATUS_LIVRE) {
$chamadaSemClassificacao = $classificacao->agentClassificacaoPending($item['MATRICULA'], $item['FILA']);
if ($chamadaSemClassificacao) { //BLOQUEAR ATENDIMENTO SEM CLASSIFICACAO
if ($item['FREETIME'] % $timeout_agent_classificacao == 0) {
$classificacaoList = $classificacao->agentClassificacaoList($item['FILA']);
$retorno = $notificaMedia->verificaNotifica(
$chamadaSemClassificacao,
$item['RAMAL'],
utf8_encode(CONF_NAME_REPONSE . " : " . $classificacaoList)
);
if ($retorno->quant == 0) {
$notificaMedia->addNotifica(
$chamadaSemClassificacao,
$item['RAMAL'],
utf8_encode(CONF_NAME_REPONSE . " : " . $classificacaoList)
);
$positus->enviarMsg(
$item['RAMAL'],
utf8_encode(CONF_NAME_REPONSE . " : " . $classificacaoList)
);
}
}
continue;
}
$atendimento = $bilhete->bilheteForaHorario(CONF_EVENT_WHATSAPP_ESPERA, $item['FILA'], null, $item['SALA1']);
if ($atendimento) {
/**
* VALIDA O ATENDIMENTO
*/
$response = $media->validaAtendimento($positus, $atendimento[0]->fila, null, $atendimento[0]->src, $item['SALA1']);
$bilhete->atenderBilheteForaHorario($atendimento[0]->uniqueid, $atendimento[0]->src, $atendimento[0]->fila, $item['MATRICULA'], $response['DATA']['uniqueid']);
$atendimento = $bilhete->bilheteForaHorario(CONF_EVENT_WHATSAPP_ESPERA, $item['FILA'], null, $item['SALA1']);
foreach ($atendimento as $cliente) {
$mensagemFila = 'Você está na posição ' . $media2->getClientQueueData($cliente->src, $atendimento)['QUEUE_POSITION'] . '. Aguarde ser atendido!';
$positus->enviarMsg($cliente->src, utf8_encode($mensagemFila));
}
}
}
if ($item['STATUS'] == CONF_AGENT_STATUS_OCUPADO) {
if ($message->timeoutTalk($item['UNIQUEID'], $item['RAMAL']) == 'FINISH' && $agente->closeService($item['ORIGEM_DESTINO'], CONF_EVENT_WHATSAPP_TIMEOUT_CLIENTE, $item['SALA1'])) {
$positus->enviarMsg($item['ORIGEM_DESTINO'], utf8_encode($mensagem['TIMEOUT_CLIENT_INATIVIDADE']));
$positus->enviarMsg($item['ORIGEM_DESTINO'], utf8_encode($mensagem['TALK_FINISHED']));
$positus->enviarMsg($item['RAMAL'], utf8_encode($mensagem['TALK_FINISHED']));
}
if ($message->timeoutTalk($item['UNIQUEID'], $item['RAMAL']) == 'ALERT') {
$msg = $mensages->findLastMessage($item['UNIQUEID']);
$retorno = $notificaMedia->verificaNotifica(
$item['UNIQUEID'],
$item['ORIGEM_DESTINO'],
utf8_encode($mensagem['TALK_ALERT_FINISH']) . $msg->id
);
if ($retorno->quant == 0) {
$notificaMedia->addNotifica(
$item['UNIQUEID'],
$item['ORIGEM_DESTINO'],
utf8_encode($mensagem['TALK_ALERT_FINISH']) . $msg->id
);
$positus->enviarMsg(
$item['ORIGEM_DESTINO'],
utf8_encode($mensagem['TALK_ALERT_FINISH'])
);
}
}
}
$supervisor->calcTimeAwait();
}
sleep(3);
ignore_user_abort(true);
/*
* Verifica se o processo deve ser encerrado
*/
if (sig_status()) {
break;
}
} catch (Exception $ex) {
sleep(3);
Connect::setInstance(null);
logger('testeOff')->info($th->getMessage(), debug_backtrace());
}
}
function retornaApiMedia($media = '')
{
switch ($media) {
case CONF_TELEGRAM_CHANNEL:
return new ApiTelegram();
case CONF_WHATSAPP_CHANNEL:
return new Positus();;
default:
break;
}
}
function GetDaemon($notDaemon)
{
/*
* Se o script não for chamado com daemon sai sem executar nada.
*/
if ($notDaemon) {
return 0;
}
$pid = pcntl_fork();
if ($pid) {
exit(0); //success
}
}
function sig_handler($signo)
{
global $statusSignal;
$statusSignal = 1;
}
function sig_status()
{
global $statusSignal;
pcntl_signal_dispatch();
return $statusSignal;
}

29
scripts/service/request.php

@ -1,29 +0,0 @@
#!/usr/bin/php -q
<?php
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/../../includes/config.php';
error_reporting(E_ERROR);
ini_set('display_errors', 0);
use app\Controllers\AgentController;
use app\Controllers\BilheteController;
use app\Controllers\MessageController;
use app\Controllers\ClassificacaoController;
use app\Controllers\SupervisorQueueController;
use app\Providers\Positus;
use app\Core\Media;
$agente = new AgentController();
$bilhete = new BilheteController();
$message = new MessageController();
$positus = new Positus();
$media = new Media();
$classificacao = new ClassificacaoController();
$supervisor = new SupervisorQueueController();
$info = $agente->findRamal('556581282842');
print_r($info);

8
scripts/service/teste.php

@ -1,8 +0,0 @@
<?php
$google_url = 'https://translate.google.com.br/translate_tts?ie=UTF-8&q=%se&tl=pt-BR&total=1&idx=0&textlen=5&tk=489936&client=t&prev=input&ttsspeed=0.50';
$text = urlencode('Ola tamba');
$url = sprintf($google_url, $text);
copy($url, 'meu_arquivo.mp3');

196
service/MonitoraAgente.php

@ -0,0 +1,196 @@
<?php
namespace service;
error_reporting(E_ERROR);
ini_set('display_errors', 0);
use app\Controllers\AgentController;
use app\Controllers\BilheteController;
use app\Controllers\MessageController;
use app\Controllers\ClassificacaoController;
use app\Controllers\SupervisorQueueController;
use app\Core\Connect;
use app\Core\CoreMedia;
use app\Providers\Positus;
use app\Core\Media;
use app\Models\Message;
use app\Models\NotificaMedia;
use app\Providers\ApiTelegram;
use Exception;
use Ratchet\ConnectionInterface;
class MonitoraAgente
{
public $agente;
public $bilhete;
public MessageController $message;
public $media;
public $media2;
public $notificaMedia;
public $mensages;
public $classificacao;
public $supervisor;
public $timeout_agent_alert;
public $timeout_agent_desconexao;
public $timeout_agent_classificacao;
public $mensagem;
function __construct()
{
$this->agente = new AgentController();
$this->bilhete = new BilheteController();
$this->message = new MessageController();
$this->media = new CoreMedia();
$this->media2 = new Media();
$this->notificaMedia = new NotificaMedia();
$this->mensages = new Message();
$this->classificacao = new ClassificacaoController();
$this->supervisor = new SupervisorQueueController();
$this->timeout_agent_alert = (CONF_WHATSAPP_TIMEOUT_AGENT_AVISO / 60);
$this->timeout_agent_desconexao = (CONF_WHATSAPP_TIMEOUT_AGENT_DESCONEXAO / 60);
$this->timeout_agent_classificacao = (CONF_WHATSAPP_TIMEOUT_AGENT_CLASSIFICACAO / 60);
$this->mensagem = [
"ALERTA_INATIVIDADE" => "Você será desconectado em " . ($this->timeout_agent_desconexao - $this->timeout_agent_alert) .
" minutos, para permanecer em atendimento clique em '/presente'",
"ALERTA_DESCONECTADO" => "Você foi desconectado por inatividade!",
"ALERTA_CLIENTE" => "Olá, como podemos lhe ajudar!",
"TIMEOUT_CLIENT_INATIVIDADE" => "O tempo da conversa foi expirado, por favor volte novamente a fila para um novo atendimento!",
"TALK_FINISHED" => "O atendimento foi finalizado!",
"TALK_ALERT_FINISH" => "Por favor, volte a comunicação com nosso atendimento em 1 minuto ou atendimento será encerrado!"
];
}
function monitora(ConnectionInterface $conn)
{
try {
$agentesLista = $this->agente->inactiveAgents();
foreach ($agentesLista as $item) {
$positus = $this->retornaApiMedia($item['SALA1']);
//verifica os timeout do agente
$this->timeoutAgente($item, $conn);
if ($item['STATUS'] == CONF_AGENT_STATUS_LIVRE) {
$chamadaSemClassificacao = $this->classificacao->agentClassificacaoPending($item['MATRICULA'], $item['FILA']);
if ($chamadaSemClassificacao) { //BLOQUEAR ATENDIMENTO SEM CLASSIFICACAO
if ($item['FREETIME'] % $this->timeout_agent_classificacao == 0) {
$classificacaoList = $this->classificacao->agentClassificacaoList($item['FILA']);
// $retorno = $this->notificaMedia->verificaNotifica(
// $chamadaSemClassificacao,
// $item['RAMAL'],
// utf8_encode(CONF_NAME_REPONSE . " : " . $classificacaoList)
// );
// if ($retorno->quant == 0) {
// $this->notificaMedia->addNotifica(
// $chamadaSemClassificacao,
// $item['RAMAL'],
// utf8_encode(CONF_NAME_REPONSE . " : " . $classificacaoList)
// );
$conn->send($this->enviaActions(CONF_NAME_REPONSE . " : " . $classificacaoList, 'classificacao'));
// $positus->enviarMsg(
// $item['RAMAL'],
// utf8_encode(CONF_NAME_REPONSE . " : " . $classificacaoList)
// );
// }
}
continue;
}
$atendimento = $this->bilhete->bilheteForaHorario(CONF_EVENT_WHATSAPP_ESPERA, $item['FILA'], null, $item['SALA1']);
if ($atendimento) {
/**
* VALIDA O ATENDIMENTO
*/
$response = $this->media->validaAtendimento($positus, $atendimento[0]->fila, null, $atendimento[0]->src, $item['SALA1']);
$this->bilhete->atenderBilheteForaHorario($atendimento[0]->uniqueid, $atendimento[0]->src, $atendimento[0]->fila, $item['MATRICULA'], $response['DATA']['uniqueid']);
$atendimento = $this->bilhete->bilheteForaHorario(CONF_EVENT_WHATSAPP_ESPERA, $item['FILA'], null, $item['SALA1']);
foreach ($atendimento as $cliente) {
$mensagemFila = 'Você está na posição ' . $this->media2->getClientQueueData($cliente->src, $atendimento)['QUEUE_POSITION'] . '. Aguarde ser atendido!';
$positus->enviarMsg($cliente->src, utf8_encode($mensagemFila));
}
}
}
if ($item['STATUS'] == CONF_AGENT_STATUS_OCUPADO) {
if ($this->message->timeoutTalk($item['UNIQUEID'], $item['RAMAL']) == 'FINISH' && $this->agente->closeService($item['ORIGEM_DESTINO'], CONF_EVENT_WHATSAPP_TIMEOUT_CLIENTE, $item['SALA1'])) {
$positus->enviarMsg($item['ORIGEM_DESTINO'], utf8_encode($this->mensagem['TIMEOUT_CLIENT_INATIVIDADE']));
$positus->enviarMsg($item['ORIGEM_DESTINO'], utf8_encode($this->mensagem['TALK_FINISHED']));
$positus->enviarMsg($item['RAMAL'], utf8_encode($this->mensagem['TALK_FINISHED']));
}
if ($this->message->timeoutTalk($item['UNIQUEID'], $item['RAMAL']) == 'ALERT') {
$msg = $this->mensages->findLastMessage($item['UNIQUEID']);
$retorno = $this->notificaMedia->verificaNotifica(
$item['UNIQUEID'],
$item['ORIGEM_DESTINO'],
utf8_encode($this->mensagem['TALK_ALERT_FINISH']) . $msg->id
);
if ($retorno->quant == 0) {
$this->notificaMedia->addNotifica(
$item['UNIQUEID'],
$item['ORIGEM_DESTINO'],
utf8_encode($this->mensagem['TALK_ALERT_FINISH']) . $msg->id
);
$positus->enviarMsg(
$item['ORIGEM_DESTINO'],
utf8_encode($this->mensagem['TALK_ALERT_FINISH'])
);
}
}
}
$this->supervisor->calcTimeAwait();
}
} catch (Exception $ex) {
Connect::setInstance(null);
logger('monitora')->info($ex->getMessage(), debug_backtrace());
}
}
function retornaApiMedia($media = '')
{
switch ($media) {
case CONF_TELEGRAM_CHANNEL:
return new ApiTelegram();
case CONF_WHATSAPP_CHANNEL:
return new Positus();;
default:
break;
}
}
function timeoutAgente($item, $conn)
{
$freetime = $item['FREETIME'] / 60;
if (($freetime >= $this->timeout_agent_alert) && ($freetime < $this->timeout_agent_desconexao) && !$item['SALA2'] && $item['STATUS'] == CONF_AGENT_STATUS_LIVRE) {
$this->agente->timeFinishAgente($item['MATRICULA'], $item['RAMAL'], ($this->timeout_agent_desconexao - $this->timeout_agent_alert));
$conn->send($this->enviaActions($this->mensagem['ALERTA_INATIVIDADE'], 'ALERTA_INATIVIDADE'));
} else if ($freetime >= $this->timeout_agent_desconexao && $item['STATUS'] == CONF_AGENT_STATUS_LIVRE) {
$this->agente->logoff($item['RAMAL']);
$conn->send($this->enviaActions($this->mensagem['ALERTA_DESCONECTADO'], 'ALERTA_DESCONECTADO'));
} else {
$this->agente->refreshAgent($item['RAMAL'], $item['SALA2']);
}
}
function enviaActions($msg, $tipo)
{
try {
$mensagem = [];
$mensagem["event"] = [
"type" => 'actions',
"contact" => [
"name" => 'Sistema',
"number" => '0'
],
"mensagem" => [
"type" => $tipo,
"content" => utf8_encode($msg)
],
];
return json_encode($mensagem);
} catch (\Throwable $th) {
logger('monitora')->info($th->getMessage(), debug_backtrace());
}
}
}

32
websocket/Servidorsocket.php

@ -5,6 +5,7 @@ namespace websocket;
use app\Providers\Positus;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use service\MonitoraAgente;
use SplObjectStorage;
class Servidorsocket implements MessageComponentInterface
@ -25,34 +26,45 @@ class Servidorsocket implements MessageComponentInterface
public function onOpen(ConnectionInterface $conn)
{
// Store the new connection to send messages to later
foreach ($this->clients as $key => $value) {
$conn->send(mb_convert_encoding('{"type": "Contato", "id": ' . $value->resourceId . ', "nome": "outros" }', "UTF-8"));
}
$conn->send(mb_convert_encoding('{"type": "Client", "id": ' . $conn->resourceId . ', "nome": "vc" }', "UTF-8"));
$headers = $conn->httpRequest->getHeaders();
$conn->send($conn->resourceId);
$this->clients->attach($conn);
$this->connection[$conn->resourceId] = null;
$this->shell[$conn->resourceId] = null;
$this->conectado[$conn->resourceId] = null;
$this->idConexion[$conn->resourceId] = null;
$this->clientes[$conn->resourceId] = $conn;
try {
array_push($this->clientes, [
"ramal" => $headers['ramal'][0],
"conection" => $conn
]);
} catch (\Throwable $th) {
//throw $th;
}
}
public function onMessage(ConnectionInterface $from, $msg)
{
$mensagem = json_decode($msg);
if ($mensagem->msg) {
$this->provider->enviarMsg($mensagem->para, $mensagem->msg);
}
} else {
try {
foreach ($this->clients as $key => $cliente) {
$cliente->send($msg);
foreach ($this->clientes as $key => $value) {
if ($mensagem->event->type == 'mensagem') {
# code...
}
if ($value['ramal'] == 8081) {
$monitora = new MonitoraAgente();
$monitora->monitora($value['conection']);
}
$value['conection']->send($msg);
}
} catch (\Throwable $th) {
$from->send(mb_convert_encoding('deu erro boy', "UTF-8"));
}
}
}
public function onClose(ConnectionInterface $conn)

2
websocket/WsInterface.php

@ -15,6 +15,7 @@ class WsInterface
function enviaMsg($msg)
{
if ($msg) {
if ($this->client->isConnected()) {
$this->client->text($msg);
$this->client->close();
@ -27,3 +28,4 @@ class WsInterface
}
}
}
}
Loading…
Cancel
Save