rendered paste body<?php/***************************************************************************** * This file is part of the Fallen Galaxy project. * * You are not allowed to redistribute and / or to modify it. * * * * Copyright (c) 2005, 2006 fallengalaxy.com * * * * Authors * * Jérémie Gottero (jeremiegottero@gmail.com) * * Bastien Moyet (bastien.moyet@gmail.com) * *****************************************************************************/define('ROOT', '../../');require_once(ROOT . 'include/common.php');require_once(ROOT . 'function/common.php');require_once(ROOT . 'function/messages.php');// Ferme la session pour ne pas bloquer les autres pages$login = $_SESSION['login'];$idPlayer = $_SESSION['id'];session_write_close();// Pas de limite de temps d'éxécutionset_time_limit(0);$db = initDB();// Récupère l'alliance du joueur$player = getPlayerData($db);$idAlly = $player['id_ally'];// Déconnexion du chatfunction shutdownChat($db, $login) { // Insère le message de déconnexion dans la base de données $db = initDB(); $query = sprintf( 'INSERT INTO ' . TABLE_PREFIX . 'chat (message, author, date) ' . 'VALUES (\'/d\', \'' . $login . '\', ' . time() . ')'); $db->execQuery($query); $db->disconnect(); exit;}// Intercepte les coupures de socketignore_user_abort(false);register_shutdown_function('shutdownChat', $db, $login);// Envoyer les no-cache headersheader('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 auteurfunction format($message) { global $login, $db, $idAlly; if ($message['target'] != 0 && $message['target'] != $idAlly) return ''; $date = '<span class="date">[' . date('H:i', $message['date']) . ']</span> '; $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\')', '<img src="images/misc/blank.gif" class="smiley s0"/>', '<img src="images/misc/blank.gif" class="smiley s1"/>', '<img src="images/misc/blank.gif" class="smiley s2"/>', '<img src="images/misc/blank.gif" class="smiley s3"/>', '<img src="images/misc/blank.gif" class="smiley s4"/>', '<img src="images/misc/blank.gif" class="smiley s5"/>', '<img src="images/misc/blank.gif" class="smiley s6"/>', '<img src="images/misc/blank.gif" class="smiley s7"/>', '<img src="images/misc/blank.gif" class="smiley s8"/>', '<img src="images/misc/blank.gif" class="smiley s9"/>'), $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 '<div class="msg action">' . $date . $author . ' ' . substr($content, 4) . '</div>'; } 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('<div class="msg error">Echec de la commande /who.</div>');; // Affiche la liste des joueurs $msg = ''; $i = 0; while ($player = $db->fetchAssoc($result)) $msg .= ($i++ == 0 ? '' : ', ') . $player['author']; return '<div class="msg info">' . $date . 'Liste des joueurs connectés :<br/>' . $date . $msg . '</div>'; } 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 '<div class="msg whisper">' . $date . $author . ' vous murmure : ' . $target[2] . '</div>'; } } else if (strncmp($content, '/help', 5) == 0 && $author == $login) { // Aide (/help) return '<div class="msg info">' . $date . 'Liste des commandes :<br/>' . $date . '/help /me /who /whisper (ou /w)</div>'; } else if (strncmp($content, '/d', 2) == 0) { // Déconnexion d'un joueur (/disconnect) return '<div class="msg info">' . $date . $author . ' a quitté le chat</div>'; } else if (strncmp($content, '/c', 2) == 0 && $author != $login) { // Connexion d'un joueur (/connect) return '<div class="msg info">' . $date . $author . ' a rejoint le chat</div>'; } } else { // Message normal return '<div class="msg' . ($author == $login ? ' self' : '') . ($message['target'] != 0 ? ' whisper' : '') . '">' . $date . '<span class="author">' . $author . ' :</span> ' . '<span class="content">' . $content . '</span>' . '</div>'; } return '';}// Affiche un message en signalant a la fenetre de chat l'arrivée d'un nouveau// messagefunction printMessage($message) { echo '<script language="javascript">' . 'var node = parent.document.createElement(\'div\');' . 'node.innerHTML = \'' . addslashes($message) . '\';' . 'parent.document.getElementById(\'chat-content\').appendChild(node.firstChild);' . 'parent.Chat.getInstance().scrollDown();' . '</script>' . "\r\n" . '<div>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div><br/>' . "\r\n";}?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html> <head> <title>Fallen Galaxy - Chat</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script language="JavaScript"> function add_opt(textval, valueval) { document.getElementById('pseudos').options.add(new Option(textval, valueval)); } function remove_opt(valueval) { for (i = 0; i < document.getElementById('pseudos').length;i++) { if (document.getElementById('pseudos').options[i].value == valueval) document.getElementById('pseudos').options[i]=null;} } function scroll() { window.scrollBy(0, 1000); } </script> </head> <body id="chat-body" class="chatFrame" onDOMMouseScroll="return false;" onmousewheel="return false;"> <script language="JavaScript"> function observe(element, name, observer) { if (element.addEventListener) { element.addEventListener(name, observer, false); } else if (element.attachEvent) { element.attachEvent('on' + name, observer); } } function stop(event) { if (event.preventDefault) { event.preventDefault(); event.stopPropagation(); } else { event.returnValue = false; event.cancelBubble = true; } } observe(document.getElementById('chat-body'), 'mousewheel', stop); observe(document.getElementById('chat-body'), 'DOMMouseScroll', stop); </script><?phpprintMessage('<div class="msg info">' . '<b>Bienvenue sur le chat de Fallen Galaxy !</b><br/>' . 'Veuillez rester poli et courtois envers les autres joueurs, la bonne humeur est obligatoire sur le chat :-)<br/>' . 'Tapez /help pour afficher la liste des commmandes.</div>');// 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('<div class="msg error">Erreur lors de la récupération de l\'historique.</div>');// Affiche l'historique$history = '';while ($message = $db->fetchAssoc($result)) $history = format($message) . $history;printMessage('<div class="history">' . $history . '</div>');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('<div class="msg error">Erreur lors de connexion au chat.</div>');// 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 messageswhile (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('<div class="msg error">Erreur lors de la récupération des messages.</div>'); $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 '<!-- this is just a keepalive -->'; ob_flush(); flush(); $keepAlive = 0; } } else { ob_flush(); flush(); }}