raspisms/controllers/discussions.php

237 lines
6.5 KiB
PHP
Executable File

<?php
/**
* Page des discussions
*/
class discussions extends Controller
{
/**
* Cette fonction est appelée avant toute les autres :
* Elle vérifie que l'utilisateur est bien connecté
* @return void;
*/
public function before()
{
internalTools::verifyConnect();
}
/**
* Cette fonction retourne toutes les discussions, sous forme d'un tableau permettant l'administration de ces contacts
*/
public function byDefault()
{
//Creation de l'object de base de données
global $db;
//Recupération des nombres des 4 panneaux d'accueil
$discussions = $db->getDiscussions();
foreach ($discussions as $key => $discussion)
{
if (!$contacts = $db->getFromTableWhere('contacts', ['number' => $discussion['number']]))
{
continue;
}
$discussions[$key]['contact'] = $contacts[0]['name'];
}
$this->render('discussions/default', array(
'discussions' => $discussions,
));
}
/**
* Cette fonction permet d'afficher la discussion avec un numero
* @param string $number : La numéro de téléphone avec lequel on discute
*/
public function show ($number)
{
global $db;
$contact = '';
if ($contacts = $db->getFromTableWhere('contacts', ['number' => $number]))
{
$contact = $contacts[0]['name'];
}
$this->render('discussions/show', array(
'number' => $number,
'contact' => $contact,
));
}
/**
* Cette fonction récupère l'ensemble des messages pour un numéro, recçus, envoyés, en cours
* @param string $number : Le numéro cible
* @param string $transactionId : Le numéro unique de la transaction ajax (sert à vérifier si la requete doit être prise en compte)
*/
function getmessages($number, $transactionId)
{
global $db;
$now = new DateTime();
$now = $now->format('Y-m-d H:i:s');
$sendeds = $db->getFromTableWhere('sendeds', ['target' => $number], 'at');
$receiveds = $db->getFromTableWhere('receiveds', ['send_by' => $number], 'at');
$scheduleds = $db->getScheduledsBeforeDateForNumber($now, $number);
$messages = [];
foreach ($sendeds as $sended)
{
$messages[] = array(
'date' => htmlspecialchars($sended['at']),
'text' => htmlspecialchars($sended['content']),
'type' => 'sended',
'status' => ($sended['delivered'] ? 'delivered' : ($sended['failed'] ? 'failed' : '')),
);
}
foreach ($receiveds as $received)
{
$messages[] = array(
'date' => htmlspecialchars($received['at']),
'text' => htmlspecialchars($received['content']),
'type' => 'received',
);
}
foreach ($scheduleds as $scheduled)
{
$messages[] = array(
'date' => htmlspecialchars($scheduled['at']),
'text' => htmlspecialchars($scheduled['content']),
'type' => 'inprogress',
);
}
//On va trier le tableau des messages
usort($messages, function($a, $b) {
return strtotime($a["date"]) - strtotime($b["date"]);
});
//On récupère uniquement les 25 derniers messages sur l'ensemble
$messages = array_slice($messages, -25);
echo json_encode(['transactionId' => $transactionId, 'messages' => $messages]);
return true;
}
/**
* Cette fonction permet d'envoyer facilement un sms à un numéro donné
* @param string $csrf : Le jeton csrf
* @param string $_POST['content'] : Le contenu du SMS
* @param string $_POST['numbers'] : Un tableau avec le numero des gens auxquel envoyer le sms
* @return json : Le statut de l'envoi
*/
function send ($csrf)
{
global $db;
$return = ['success' => true, 'message' => ''];
//On vérifie que le jeton csrf est bon
if (!internalTools::verifyCSRF($csrf))
{
$return['success'] = false;
$return['message'] = 'Jeton CSRF invalide';
echo json_encode($return);
return false;
}
$now = new DateTime();
$now = $now->format('Y-m-d H:i:s');
$_POST['date'] = $now;
$scheduleds = new scheduleds();
if (!$scheduleds->create('', true, true))
{
$return['success'] = false;
$return['message'] = 'Impossible de créer le SMS';
echo json_encode($return);
return false;
}
$return['id'] = $_SESSION['discussion_wait_progress'][count($_SESSION['discussion_wait_progress']) - 1];
echo json_encode($return);
return true;
}
/**
* Cette fonction retourne les id des sms qui sont envoyés
* @return json : Tableau des ids des sms qui sont envoyés
*/
function checksendeds ()
{
global $db;
$_SESSION['discussion_wait_progress'] = isset($_SESSION['discussion_wait_progress']) ? $_SESSION['discussion_wait_progress'] : [];
$scheduleds = $db->getScheduledsIn($_SESSION['discussion_wait_progress']);
//On va chercher à chaque fois si on a trouvé le sms. Si ce n'est pas le cas c'est qu'il a été envoyé
$sendeds = [];
foreach ($_SESSION['discussion_wait_progress'] as $key => $id)
{
$found = false;
foreach ($scheduleds as $scheduled)
{
if ($id == $scheduled['id'])
{
$found = true;
}
}
if (!$found)
{
unset($_SESSION['discussion_wait_progress'][$key]);
$sendeds[] = $id;
}
}
echo json_encode($sendeds);
return true;
}
/**
* Cette fonction retourne les messages reçus pour un numéro après la date $_SESSION['discussion_last_checkreceiveds']
* @param string $number : Le numéro de téléphone pour lequel on veux les messages
* @return json : Un tableau avec les messages
*/
function checkreceiveds ($number)
{
global $db;
$now = new DateTime();
$now = $now->format('Y-m-d H:i');
$_SESSION['discussion_last_checkreceiveds'] = isset($_SESSION['discussion_last_checkreceiveds']) ? $_SESSION['discussion_last_checkreceiveds'] : $now;
$receiveds = $db->getReceivedsSinceForNumberOrderByDate($_SESSION['discussion_last_checkreceiveds'], $number);
//On va gérer le cas des messages en double en stockant ceux déjà reçus et en eliminant les autres
$_SESSION['discussion_already_receiveds'] = isset($_SESSION['discussion_already_receiveds']) ? $_SESSION['discussion_already_receiveds'] : [];
foreach ($receiveds as $key => $received)
{
//Sms jamais recu
if (array_search($received['id'], $_SESSION['discussion_already_receiveds']) === false)
{
$_SESSION['discussion_already_receiveds'][] = $received['id'];
continue;
}
//Sms déjà reçu => on le supprime des resultats
unset($receiveds[$key]);
}
//On met à jour la date de dernière verif
$_SESSION['discussion_last_checkreceiveds'] = $now;
echo json_encode($receiveds);
}
}