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();
}
}