All pastes #756809 Raw Edit

Unnamed

public php v1 · immutable
#756809 ·published 2007-10-31 19:22 UTC
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();	}}