<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */

/**
 * Chat plugin.
 * Shows ranked records and their relations on the current map.
 * Created by Xymph
 *
 * Dependencies: none
 */

if (!INHIBIT_RECCMDS) {
	Aseco::addChatCommand('firstrec', 'Shows first ranked record on current map');
	Aseco::addChatCommand('lastrec', 'Shows last ranked record on current map');
	Aseco::addChatCommand('nextrec', 'Shows next better ranked record to beat');
	Aseco::addChatCommand('diffrec', 'Shows your difference to first ranked record');
	Aseco::addChatCommand('recrange', 'Shows difference first to last ranked record');
}

function chat_firstrec($aseco, $command) {

	$login = $command['author']->login;

	// check for relay server
	if ($aseco->server->isrelay) {
		$message = formatText($aseco->getChatMessage('NOTONRELAY'));
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
		return;
	}

	if ($aseco->server->records->count() > 0) {
		// get the first ranked record
		$record = $aseco->server->records->getRecord(0);

		// show chat message
		$message = formatText($aseco->getChatMessage('FIRST_RECORD'))
		         . formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
		                                             1,
		                                             stripColors($record->player->nickname),
		                                             ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
		                                              $record->score : formatTime($record->score)));

		$message = substr($message, 0, strlen($message)-2);  // strip trailing ", "
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
	} else {
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No records found!'), $login);
	}
}  // chat_firstrec

function chat_lastrec($aseco, $command) {

	$login = $command['author']->login;

	// check for relay server
	if ($aseco->server->isrelay) {
		$message = formatText($aseco->getChatMessage('NOTONRELAY'));
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
		return;
	}

	if ($total = $aseco->server->records->count()) {
		// get the last ranked record
		$record = $aseco->server->records->getRecord($total-1);

		// show chat message
		$message = formatText($aseco->getChatMessage('LAST_RECORD'))
		         . formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
		                                             $total,
		                                             stripColors($record->player->nickname),
		                                             ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
		                                              $record->score : formatTime($record->score)));

		$message = substr($message, 0, strlen($message)-2);  // strip trailing ", "
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
	} else {
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No records found!'), $login);
	}
}  // chat_lastrec

function chat_nextrec($aseco, $command) {

	$login = $command['author']->login;

	// check for relay server
	if ($aseco->server->isrelay) {
		$message = formatText($aseco->getChatMessage('NOTONRELAY'));
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
		return;
	}

	if ($total = $aseco->server->records->count()) {
		$found = false;
		// find ranked record
		for ($i = 0; $i < $total; $i++) {
			$rec = $aseco->server->records->getRecord($i);
			if ($rec->player->login == $login) {
				$rank = $i;
				$found = true;
				break;
			}
		}

		if ($found) {
			// get current and next better ranked records
			$nextrank = ($rank > 0 ? $rank-1 : 0);
			$record = $aseco->server->records->getRecord($rank);
			$next = $aseco->server->records->getRecord($nextrank);

			// compute difference to next record
			if ($aseco->server->gameinfo->mode != Gameinfo::STNT) {
				$diff = $record->score - $next->score;
				$sec = floor($diff/1000);
				$ths = $diff - ($sec * 1000);
			} else {  // Stunts mode
				$diff = $next->score - $record->score;
			}

			// show chat message
			$message1 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
			                                              $rank+1,
			                                              stripColors($record->player->nickname),
			                                              ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
			                                               $record->score : formatTime($record->score)));
			$message1 = substr($message1, 0, strlen($message1)-2);  // strip trailing ", "
			$message2 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
			                                              $nextrank+1,
			                                              stripColors($next->player->nickname),
			                                              ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
			                                               $record->score : formatTime($next->score)));
			$message2 = substr($message2, 0, strlen($message2)-2);  // strip trailing ", "
			$message = formatText($aseco->getChatMessage('DIFF_RECORD'),
			                      $message1, $message2,
			                      ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
			                       $diff : sprintf("%d.%03d", $sec, $ths)));

			$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
		} else {
			// look for unranked time instead
			$order = ($aseco->server->gameinfo->mode == Gameinfo::STNT ? 'DESC' : 'ASC');
			$query = 'SELECT score FROM rs_times
			          WHERE PlayerId=' . $command['author']->id . ' AND
			                MapId=' . $aseco->server->map->id . '
			          ORDER BY Score ' . $order . ' LIMIT 1';
			$result = mysql_query($query);
			if (mysql_num_rows($result) > 0) {
				$unranked = mysql_fetch_object($result);
				$found = true;
			}
			mysql_free_result($result);

			if ($found) {
				// get the last ranked record
				$last = $aseco->server->records->getRecord($total-1);

				// compute difference to next record
				if ($aseco->server->gameinfo->mode != Gameinfo::STNT) {
					$diff = $unranked->Score - $last->score;
					$sec = floor($diff/1000);
					$ths = $diff - ($sec * 1000);
				} else {  // Stunts mode
					$diff = $last->score - $unranked->Score;
				}

				// show chat message
				$message1 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
				                                              'PB',
				                                              stripColors($command['author']->nickname),
				                                              ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
				                                               $unranked->Score : formatTime($unranked->Score)));
				$message1 = substr($message1, 0, strlen($message1)-2);  // strip trailing ", "
				$message2 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
				                                              $total,
				                                              stripColors($last->player->nickname),
				                                              ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
				                                               $last->score : formatTime($last->score)));
				$message2 = substr($message2, 0, strlen($message2)-2);  // strip trailing ", "
				$message = formatText($aseco->getChatMessage('DIFF_RECORD'),
				                      $message1, $message2,
				                      ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
				                       $diff : sprintf("%d.%03d", $sec, $ths)));

				$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
			} else {
				$message = '{#server}> {#error}You don\'t have a record on this map yet... use {#highlite}$i/lastrec';
				$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
			}
		}
	} else {
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No records found!'), $login);
	}
}  // chat_nextrec

function chat_diffrec($aseco, $command) {

	$login = $command['author']->login;

	// check for relay server
	if ($aseco->server->isrelay) {
		$message = formatText($aseco->getChatMessage('NOTONRELAY'));
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
		return;
	}

	if ($total = $aseco->server->records->count()) {
		$found = false;
		// find ranked record
		for ($i = 0; $i < $total; $i++) {
			$rec = $aseco->server->records->getRecord($i);
			if ($rec->player->login == $login) {
				$rank = $i;
				$found = true;
				break;
			}
		}

		if ($found) {
			// get current and first ranked records
			$record = $aseco->server->records->getRecord($rank);
			$first = $aseco->server->records->getRecord(0);

			// compute difference to first record
			if ($aseco->server->gameinfo->mode != Gameinfo::STNT) {
				$diff = $record->score - $first->score;
				$sec = floor($diff/1000);
				$ths = $diff - ($sec * 1000);
			} else {  // Stunts mode
				$diff = $first->score - $record->score;
			}

			// show chat message
			$message1 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
			                                              $rank+1,
			                                              stripColors($record->player->nickname),
			                                              ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
			                                               $record->score : formatTime($record->score)));
			$message1 = substr($message1, 0, strlen($message1)-2);  // strip trailing ", "
			$message2 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
			                                              1,
			                                              stripColors($first->player->nickname),
			                                              ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
			                                               $first->score : formatTime($first->score)));
			$message2 = substr($message2, 0, strlen($message2)-2);  // strip trailing ", "
			$message = formatText($aseco->getChatMessage('DIFF_RECORD'),
			                      $message1, $message2,
			                      ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
			                       $diff : sprintf("%d.%03d", $sec, $ths)));

			$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
		} else {
			$message = '{#server}> {#error}You don\'t have a record on this map yet... use {#highlite}$i/lastrec';
			$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
		}
	} else {
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No records found!'), $login);
	}
}  // chat_diffrec

function chat_recrange($aseco, $command) {

	$login = $command['author']->login;

	// check for relay server
	if ($aseco->server->isrelay) {
		$message = formatText($aseco->getChatMessage('NOTONRELAY'));
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
		return;
	}

	if ($total = $aseco->server->records->count()) {
		// get the first & last ranked records
		$first = $aseco->server->records->getRecord(0);
		$last = $aseco->server->records->getRecord($total-1);

		// compute difference between records
		if ($aseco->server->gameinfo->mode != Gameinfo::STNT) {
			$diff = $last->score - $first->score;
			$sec = floor($diff/1000);
			$ths = $diff - ($sec * 1000);
		} else {  // Stunts mode
			$diff = $first->score - $last->score;
		}

		// show chat message
		$message1 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
		                                              1,
		                                              stripColors($first->player->nickname),
		                                              ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
		                                               $first->score : formatTime($first->score)));
		$message1 = substr($message1, 0, strlen($message1)-2);  // strip trailing ", "
		$message2 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
		                                              $total,
		                                              stripColors($last->player->nickname),
		                                              ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
		                                               $last->score : formatTime($last->score)));
		$message2 = substr($message2, 0, strlen($message2)-2);  // strip trailing ", "
		$message = formatText($aseco->getChatMessage('DIFF_RECORD'),
		                      $message1, $message2,
		                      ($aseco->server->gameinfo->mode == Gameinfo::STNT ?
		                       $diff : sprintf("%d.%03d", $sec, $ths)));

		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
	} else {
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No records found!'), $login);
	}
}  // chat_recrange
?>
