execQuery($query); $db->disconnect(); exit; } // Intercepte les coupures de socket ignore_user_abort(false); register_shutdown_function('shutdownChat', $db, $login); // Envoyer les no-cache headers header('Expires: Thu, 21 Jul 1977 07:30:00 GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache'); // Formatage un message en fonction de son contenu et de son auteur function format($message) { global $login, $db, $idAlly; if ($message['target'] != 0 && $message['target'] != $idAlly) return ''; $date = '[' . date('H:i', $message['date']) . '] '; $author = $message['author']; $content = stripslashes(htmlspecialchars($message['message'], ENT_NOQUOTES, 'UTF-8')); // Smilies // FIXME Utiliser ROOT au lieu de ../../ $content = preg_replace( array('#(https?|ftp|news){1}://([\w\-]+\.([\w\-]+\.)*[\w]+(:[0-9]+)?(/[^"\s\(\)<\[]*)?)#ie', '#(www|ftp)\.(([\w\-]+\.)*[\w]+(:[0-9]+)?(/[^"\s\(\)<\[]*)?)#ie', '#:-?\)#', '#:-?\(#', '#8-?\)#', '#:-?[pP]#', '#:-?[oO]#', '# :-?/#', '#:-?[dD]#', '#;-?\)#', '#:-?[sS]#', '#:-?\|#'), array('handleUrlTag(\'$1://$2\')', 'handleUrlTag(\'$1.$2\', \'$1.$2\')', '', '', '', '', '', '', '', '', '', ''), $content); // Teste s'il s'agit d'une commande if (strncmp($content, '/', 1) == 0) { if (strncmp($content, '/me', 3) == 0) { // Message d'action (/me) return '
' . $date . $author . ' ' . substr($content, 4) . '
'; } else if (strncmp($content, '/who', 4) == 0 && $author == $login) { // Liste des joueurs connectés (/who) $query = 'SELECT DISTINCT c1.author AS author ' . 'FROM ' . TABLE_PREFIX . 'chat c1 ' . 'WHERE c1.message LIKE \'/c\' ' . 'AND (c1.id > (' . // Connexion au chat plus récente que la connexion ? 'SELECT MAX(c2.id) ' . 'FROM ' . TABLE_PREFIX . 'chat c2 ' . 'WHERE c2.author = c1.author ' . 'AND c2.message LIKE \'/d\') ' . 'OR NOT EXISTS (' . // 1e connexion au chat ? 'SELECT id ' . 'FROM ' . TABLE_PREFIX . 'chat c3 ' . 'WHERE c3.author = c1.author ' . 'AND c3.message LIKE \'/d\'))'; $result = $db->execQuery($query) or exit('
Echec de la commande /who.
');; // Affiche la liste des joueurs $msg = ''; $i = 0; while ($player = $db->fetchAssoc($result)) $msg .= ($i++ == 0 ? '' : ', ') . $player['author']; return '
' . $date . 'Liste des joueurs connectés :
' . $date . $msg . '
'; } else if (strncmp($content, '/whisper', 8) == 0 || strncmp($content, '/w', 2) == 0) { // Message privé (/whisper) $target = explode(' ', $content, 3); // Teste si le pseudo est entre quotes if (strncmp($target[1], '"', 1) == 0 && substr_count($target[1] . $target[2], '"') >= 2) $target = explode('"', $target[1] . ' ' . $target[2], 3); // Teste si c'est le joueur qui est concerné par le whisper if (strtolower($target[1]) == strtolower($login)) { $target[2] = trim($target[2]); return '
' . $date . $author . ' vous murmure : ' . $target[2] . '
'; } } else if (strncmp($content, '/help', 5) == 0 && $author == $login) { // Aide (/help) return '
' . $date . 'Liste des commandes :
' . $date . '/help /me /who /whisper (ou /w)
'; } else if (strncmp($content, '/d', 2) == 0) { // Déconnexion d'un joueur (/disconnect) return '
' . $date . $author . ' a quitté le chat
'; } else if (strncmp($content, '/c', 2) == 0 && $author != $login) { // Connexion d'un joueur (/connect) return '
' . $date . $author . ' a rejoint le chat
'; } } else { // Message normal return '
' . $date . '' . $author . ' : ' . '' . $content . '' . '
'; } return ''; } // Affiche un message en signalant a la fenetre de chat l'arrivée d'un nouveau // message function printMessage($message) { echo '' . "\r\n" . '
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

' . "\r\n"; } ?> Fallen Galaxy - Chat ' . 'Bienvenue sur le chat de Fallen Galaxy !
' . 'Veuillez rester poli et courtois envers les autres joueurs, la bonne humeur est obligatoire sur le chat :-)
' . 'Tapez /help pour afficher la liste des commmandes.'); // Récupère les 10 derniers messages envoyés sur le chat, en filtrant les commandes $query = 'SELECT * ' . 'FROM ' . TABLE_PREFIX . 'chat ' . 'WHERE message NOT LIKE \'/%\' ' . 'AND (target = 0 ' . 'OR target = ' . $idAlly . ') ' . 'ORDER BY id DESC ' . 'LIMIT 0, 10'; $result = $db->execQuery($query) or exit('
Erreur lors de la récupération de l\'historique.
'); // Affiche l'historique $history = ''; while ($message = $db->fetchAssoc($result)) $history = format($message) . $history; printMessage('
' . $history . '
'); printMessage(format(array('author' => $login, 'target' => 0, 'message' => '/who', 'date' => START_TIME))); ob_flush(); flush(); // Indique la connexion aux autres joueurs $query = sprintf( 'INSERT INTO ' . TABLE_PREFIX . 'chat (message, author, date) ' . 'VALUES (\'/c\', \'' . $_SESSION['login'] . '\', ' . time() . ')'); $db->execQuery($query) or exit('
Erreur lors de connexion au chat.
'); // Récupère l'identifiant du dernier message $id = $db->getInsertId(); $keepAlive = 0; // Boucle qui tourne en continue et qui lit toutes les secondes les nouveaux messages while (true) { sleep(2); // Récupère les messages postés depuis la dernière mise à jour $query = 'SELECT * ' . 'FROM ' . TABLE_PREFIX . 'chat ' . 'WHERE id > ' . $id . ' ' . 'ORDER BY id'; $result = $db->execQuery($query) or exit('
Erreur lors de la récupération des messages.
'); $date = time(); $count = 0; // Affiche les messages while ($message = $db->fetchAssoc($result)) { $id = $message['id']; $message = format($message); if (strlen($message) > 0) printMessage($message); $count++; } if ($count == 0) { $keepAlive++; // Envoie un message de keep alive s'il n'y a pas eu de messages depuis 10 secondes if ($keepAlive == 5) { echo ''; ob_flush(); flush(); $keepAlive = 0; } } else { ob_flush(); flush(); } }