425 lines
16 KiB
PHP
425 lines
16 KiB
PHP
<?php
|
|
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
|
|
|
|
/**
|
|
* Chat plugin.
|
|
* Displays server/XAseco info & plugins/nations lists.
|
|
* Created by Xymph
|
|
*
|
|
* Dependencies: none
|
|
*/
|
|
|
|
Aseco::addChatCommand('server', 'Displays info about this server');
|
|
Aseco::addChatCommand('xaseco', 'Displays info about this XASECO');
|
|
Aseco::addChatCommand('plugins', 'Displays list of active plugins');
|
|
Aseco::addChatCommand('nations', 'Displays top 10 most visiting nations');
|
|
|
|
function chat_server($aseco, $command) {
|
|
global $maxrecs, $admin_contact, $feature_votes; // from rasp.settings.php
|
|
|
|
$player = $command['author'];
|
|
$login = $player->login;
|
|
|
|
// collect players/nations stats
|
|
$query = 'SELECT COUNT(Id), COUNT(DISTINCT Nation), SUM(TimePlayed) FROM players';
|
|
$res = mysql_query($query);
|
|
if (mysql_num_rows($res) > 0) {
|
|
$row = mysql_fetch_row($res);
|
|
$players = $row[0];
|
|
$nations = $row[1];
|
|
$totaltime = $row[2];
|
|
mysql_free_result($res);
|
|
$playdays = floor($totaltime / (24 * 3600));
|
|
$playtime = $totaltime - ($playdays * 24 * 3600);
|
|
} else {
|
|
mysql_free_result($res);
|
|
trigger_error('No players/nations stats found!', E_USER_ERROR);
|
|
}
|
|
|
|
// get server uptime
|
|
$aseco->client->query('GetNetworkStats');
|
|
$network = $aseco->client->getResponse();
|
|
$aseco->server->uptime = $network['Uptime'];
|
|
$updays = floor($aseco->server->uptime / (24 * 3600));
|
|
$uptime = $aseco->server->uptime - ($updays * 24 * 3600);
|
|
|
|
// showing info for TMN
|
|
if ($aseco->server->getGame() == 'TMN') {
|
|
|
|
$stats = 'Welcome to: ' . $aseco->server->name . '$z' . LF . LF;
|
|
$stats .= '$gServer Date : {#black}' . date('M d, Y') . LF;
|
|
$stats .= '$gServer Time : {#black}' . date('H:i:s T') . LF;
|
|
$stats .= '$gUptime : {#black}' . $updays . ' day' . ($updays == 1 ? ' ' : 's ') . formatTimeH($uptime * 1000, false) . LF;
|
|
$stats .= '$gTrack Count : {#black}' . $aseco->server->gameinfo->numchall . LF;
|
|
$stats .= '$gGame Mode : {#black}' . $aseco->server->gameinfo->getMode() . LF;
|
|
switch ($aseco->server->gameinfo->mode) {
|
|
case 0:
|
|
$stats .= '$gPoints Limit : {#black}' . $aseco->server->gameinfo->rndslimit . LF;
|
|
break;
|
|
case 1:
|
|
$stats .= '$gTime Limit : {#black}' . formatTime($aseco->server->gameinfo->timelimit) . LF;
|
|
break;
|
|
case 2:
|
|
$stats .= '$gPoints Limit : {#black}' . $aseco->server->gameinfo->teamlimit . LF;
|
|
break;
|
|
case 3:
|
|
$stats .= '$gTime Limit : {#black}' . formatTime($aseco->server->gameinfo->lapslimit) . LF;
|
|
break;
|
|
}
|
|
$stats .= '$gMax Players : {#black}' . $aseco->server->maxplay . LF;
|
|
$stats .= '$gMax Specs : {#black}' . $aseco->server->maxspec . LF;
|
|
$stats .= '$gRecs/Track : {#black}' . $maxrecs . LF;
|
|
if ($feature_votes) {
|
|
$stats .= '$gVoting info : {#black}/helpvote' . LF;
|
|
} else {
|
|
$stats .= '$gVote Timeout : {#black}' . formatTime($aseco->server->votetime) . LF;
|
|
$stats .= '$gVote Ratio : {#black}' . round($aseco->server->voterate, 2) . LF;
|
|
}
|
|
if ($admin_contact) {
|
|
$stats .= '$gAdmin Contact: {#black}' . $admin_contact . LF;
|
|
}
|
|
$stats .= LF . '$gVisited by $f80' . $players . ' $gPlayers from $f40' . $nations . ' $gNations' . LF;
|
|
$stats .= 'who together played: {#black}' . $playdays . ' day' . ($playdays == 1 ? ' ' : 's ') . formatTimeH($playtime * 1000, false) . ' $g!';
|
|
|
|
// display popup message
|
|
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $aseco->formatColors($stats), 'OK', '', 0);
|
|
|
|
// showing info for TMF
|
|
} elseif ($aseco->server->getGame() == 'TMF') {
|
|
|
|
// get more server settings in one go
|
|
$comment = $aseco->client->addCall('GetServerComment', array());
|
|
$coppers = $aseco->client->addCall('GetServerCoppers', array());
|
|
$cuprpc = $aseco->client->addCall('GetCupRoundsPerChallenge', array());
|
|
if (!$aseco->client->multiquery()) {
|
|
trigger_error('[' . $aseco->client->getErrorCode() . '] GetServer (multi) - ' . $aseco->client->getErrorMessage(), E_USER_WARNING);
|
|
} else {
|
|
$response = $aseco->client->getResponse();
|
|
$comment = $response[$comment][0];
|
|
$coppers = $response[$coppers][0];
|
|
$cuprpc = $response[$cuprpc][0]['CurrentValue'];
|
|
}
|
|
|
|
$header = 'Welcome to: ' . $aseco->server->name;
|
|
$stats = array();
|
|
$stats[] = array('Server Date', '{#black}' . date('M d, Y'));
|
|
$stats[] = array('Server Time', '{#black}' . date('H:i:s T'));
|
|
$stats[] = array('Zone', '{#black}' . $aseco->server->zone);
|
|
$field = 'Comment';
|
|
|
|
// break up long line into chunks with continuation strings
|
|
$multicmt = explode(LF, wordwrap($comment, 35, LF . '...'));
|
|
foreach ($multicmt as $line) {
|
|
$stats[] = array($field, '{#black}' . $line);
|
|
$field = '';
|
|
}
|
|
|
|
$stats[] = array('Uptime', '{#black}' . $updays . ' day' . ($updays == 1 ? ' ' : 's ') . formatTimeH($uptime * 1000, false));
|
|
if ($aseco->server->isrelay)
|
|
$stats[] = array('Relays', '{#black}' . $aseco->server->relaymaster['Login'] .
|
|
' / ' . $aseco->server->relaymaster['NickName']);
|
|
else
|
|
$stats[] = array('Track Count', '{#black}' . $aseco->server->gameinfo->numchall);
|
|
$stats[] = array('Game Mode', '{#black}' . $aseco->server->gameinfo->getMode());
|
|
switch ($aseco->server->gameinfo->mode) {
|
|
case 0:
|
|
$stats[] = array('Points Limit', '{#black}' . $aseco->server->gameinfo->rndslimit);
|
|
break;
|
|
case 1:
|
|
$stats[] = array('Time Limit', '{#black}' . formatTime($aseco->server->gameinfo->timelimit));
|
|
break;
|
|
case 2:
|
|
$stats[] = array('Points Limit', '{#black}' . $aseco->server->gameinfo->teamlimit);
|
|
break;
|
|
case 3:
|
|
$stats[] = array('Time Limit', '{#black}' . formatTime($aseco->server->gameinfo->lapslimit));
|
|
break;
|
|
case 4:
|
|
$stats[] = array('Time Limit', '{#black}' . formatTime(5 * 60 * 1000)); // always 5 minutes?
|
|
break;
|
|
case 5:
|
|
$stats[] = array('Points Limit', '{#black}' . $aseco->server->gameinfo->cuplimit . '$g R/C: {#black}' . $cuprpc);
|
|
break;
|
|
}
|
|
$stats[] = array('Max Players', '{#black}' . $aseco->server->maxplay);
|
|
$stats[] = array('Max Specs', '{#black}' . $aseco->server->maxspec);
|
|
$stats[] = array('Recs/Track', '{#black}' . $maxrecs);
|
|
if ($feature_votes) {
|
|
$stats[] = array('Voting info', '{#black}/helpvote');
|
|
} else {
|
|
$stats[] = array('Vote Timeout', '{#black}' . formatTime($aseco->server->votetime));
|
|
$stats[] = array('Vote Ratio', '{#black}' . round($aseco->server->voterate, 2));
|
|
}
|
|
// check for TMUF server
|
|
if ($aseco->server->rights) {
|
|
$stats[] = array('Rights', '{#black}United' .
|
|
($aseco->allowAbility($player, 'server_coppers') ?
|
|
' $gCoppers: {#black}' . $coppers : ''));
|
|
} else { // TMNF
|
|
$stats[] = array('Rights', '{#black}Nations');
|
|
}
|
|
$stats[] = array('Ladder Limits', '{#black}' . $aseco->server->laddermin .
|
|
'$g - {#black}' . $aseco->server->laddermax);
|
|
if ($admin_contact) {
|
|
$stats[] = array('Admin Contact', '{#black}' . $admin_contact);
|
|
}
|
|
$stats[] = array();
|
|
$stats[] = array('Visited by $f80' . $players . ' $gPlayers from $f40' . $nations . ' $gNations');
|
|
$stats[] = array('who together played: {#black}' . $playdays . ' day' . ($playdays == 1 ? ' ' : 's ') . formatTimeH($playtime * 1000, false) . ' $g!');
|
|
|
|
// display ManiaLink message
|
|
display_manialink($login, $header, array('Icons64x64_1', 'DisplaySettings', 0.01), $stats, array(1.0, 0.3, 0.7), 'OK');
|
|
|
|
} else { // TMS/TMO
|
|
$stats = '{#server}>> Server Stats' . LF;
|
|
$stats .= 'Showing info of ' . $aseco->server->name . LF;
|
|
// no info actually shown
|
|
|
|
// show chat message
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($stats), $login);
|
|
}
|
|
} // chat_server
|
|
|
|
function chat_xaseco($aseco, $command) {
|
|
global $admin_contact; // from rasp.settings.php
|
|
|
|
$player = $command['author'];
|
|
$login = $player->login;
|
|
|
|
$uptime = time() - $aseco->uptime;
|
|
$updays = floor($uptime / (24 * 3600));
|
|
$uptime = $uptime - ($updays * 24 * 3600);
|
|
|
|
// showing info for TMN
|
|
if ($aseco->server->getGame() == 'TMN') {
|
|
|
|
$info = 'XASECO info: ' . $aseco->server->name . '$z' . LF . LF;
|
|
$info .= '$gVersion : {#black}' . XASECO_VERSION . LF;
|
|
$info .= '$gUptime : {#black}' . $updays . ' day' . ($updays == 1 ? ' ' : 's ') . formatTimeH($uptime * 1000, false) . LF;
|
|
$info .= '$gWebsites : {#black}' . XASECO_ORG . LF;
|
|
$info .= '$g {#black}' . XASECO_TMN . LF;
|
|
$info .= '$g {#black}' . XASECO_TMF . LF;
|
|
$info .= '$g {#black}' . XASECO_TM2 . LF;
|
|
$info .= '$gCredits : {#black}Main author: Xymph (since v0.8)' . LF;
|
|
$info .= '$g {#black}Original authors: $nFlo, Assembler Maniac, Jfreu & others$m' . LF;
|
|
if (isset($aseco->masteradmin_list['TMLOGIN'])) {
|
|
// count non-LAN logins
|
|
$count = 0;
|
|
foreach ($aseco->masteradmin_list['TMLOGIN'] as $lgn) {
|
|
if ($lgn != '' && !isLANLogin($lgn)) {
|
|
$count++;
|
|
}
|
|
}
|
|
if ($count > 0) {
|
|
$field = 'Masteradmin';
|
|
if ($count > 1)
|
|
$field .= 's';
|
|
else
|
|
$field .= ' ';
|
|
$field .= ' : ';
|
|
foreach ($aseco->masteradmin_list['TMLOGIN'] as $lgn) {
|
|
// skip any LAN logins
|
|
if ($lgn != '' && !isLANLogin($lgn)) {
|
|
$info .= '$g' . $field . '{#black}' . $aseco->getPlayerNick($lgn) . '$z' . LF;
|
|
$field = ' ';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ($admin_contact) {
|
|
$info .= '$gAdmin Contact: {#black}' . $admin_contact . LF;
|
|
}
|
|
|
|
// display popup message
|
|
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $aseco->formatColors($info), 'OK', '', 0);
|
|
|
|
// showing info for TMF
|
|
} elseif ($aseco->server->getGame() == 'TMF') {
|
|
|
|
// prepare Welcome message
|
|
$welcome = formatText($aseco->getChatMessage('WELCOME'),
|
|
stripColors($player->nickname),
|
|
$aseco->server->name, XASECO_VERSION);
|
|
|
|
$header = 'XASECO info: ' . $aseco->server->name;
|
|
$info = array();
|
|
$info[] = array('Version', '{#black}' . XASECO_VERSION);
|
|
$field = 'Welcome';
|
|
$welcome = preg_split('/{br}/', $aseco->formatColors($welcome));
|
|
foreach ($welcome as $line) {
|
|
$info[] = array($field, '{#black}' . $line);
|
|
$field = '';
|
|
}
|
|
|
|
$info[] = array('Uptime', '{#black}' . $updays . ' day' . ($updays == 1 ? ' ' : 's ') . formatTimeH($uptime * 1000, false));
|
|
$info[] = array('Websites', '{#black}$l[' . XASECO_ORG . ']' . XASECO_ORG . '$l');
|
|
$info[] = array('', '{#black}$l[' . XASECO_TMN . ']' . XASECO_TMN . '$l');
|
|
$info[] = array('', '{#black}$l[' . XASECO_TMF . ']' . XASECO_TMF . '$l');
|
|
$info[] = array('', '{#black}$l[' . XASECO_TM2 . ']' . XASECO_TM2 . '$l');
|
|
$info[] = array('Credits', '{#black}Main author: Xymph (since v0.8)');
|
|
$info[] = array('', '{#black}Original authors: Flo, Assembler Maniac, Jfreu & others');
|
|
if (isset($aseco->masteradmin_list['TMLOGIN'])) {
|
|
// count non-LAN logins
|
|
$count = 0;
|
|
foreach ($aseco->masteradmin_list['TMLOGIN'] as $lgn) {
|
|
if ($lgn != '' && !isLANLogin($lgn)) {
|
|
$count++;
|
|
}
|
|
}
|
|
if ($count > 0) {
|
|
$field = 'Masteradmin';
|
|
if ($count > 1)
|
|
$field .= 's';
|
|
foreach ($aseco->masteradmin_list['TMLOGIN'] as $lgn) {
|
|
// skip any LAN logins
|
|
if ($lgn != '' && !isLANLogin($lgn)) {
|
|
$info[] = array($field, '{#black}' . $aseco->getPlayerNick($lgn) . '$z');
|
|
$field = '';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ($admin_contact) {
|
|
$info[] = array('Admin Contact', '{#black}' . $admin_contact);
|
|
}
|
|
|
|
// display ManiaLink message
|
|
display_manialink($login, $header, array('BgRaceScore2', 'Warmup'), $info, array(1.0, 0.3, 0.7), 'OK');
|
|
|
|
} else { // TMS/TMO
|
|
$info = '{#server}>> XASECO Info' . LF;
|
|
$info .= 'Showing info of ' . $aseco->server->name . LF;
|
|
// no info actually shown
|
|
|
|
// show chat message
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($info), $login);
|
|
}
|
|
} // chat_xaseco
|
|
|
|
function chat_plugins($aseco, $command) {
|
|
|
|
$player = $command['author'];
|
|
|
|
// display plugins list for TMN
|
|
if ($aseco->server->getGame() == 'TMN') {
|
|
$head = $aseco->formatColors('Currently active plugins:{#black}') . LF;
|
|
$list = '';
|
|
$lines = 0;
|
|
$player->msgs = array();
|
|
$player->msgs[0] = 1;
|
|
// create list of plugins
|
|
foreach ($aseco->plugins as $plugin) {
|
|
$list .= $plugin . LF;
|
|
if (++$lines > 14) {
|
|
$player->msgs[] = $head . $list;
|
|
$lines = 0;
|
|
$list = '';
|
|
}
|
|
}
|
|
// add if last batch exists
|
|
if ($list != '')
|
|
$player->msgs[] = $head . $list;
|
|
|
|
// display popup message
|
|
if (count($player->msgs) == 2) {
|
|
$aseco->client->query('SendDisplayServerMessageToLogin', $player->login, $player->msgs[1], 'OK', '', 0);
|
|
} else { // > 2
|
|
$aseco->client->query('SendDisplayServerMessageToLogin', $player->login, $player->msgs[1], 'Close', 'Next', 0);
|
|
}
|
|
|
|
// display plugins list for TMF
|
|
} elseif ($aseco->server->getGame() == 'TMF') {
|
|
$head = 'Currently active plugins:';
|
|
$list = array();
|
|
$lines = 0;
|
|
$player->msgs = array();
|
|
$player->msgs[0] = array(1, $head, array(0.7), array('Icons128x128_1', 'Browse', 0.02));
|
|
// create list of plugins
|
|
foreach ($aseco->plugins as $plugin) {
|
|
$list[] = array('{#black}' . $plugin);
|
|
if (++$lines > 14) {
|
|
$player->msgs[] = $list;
|
|
$lines = 0;
|
|
$list = array();
|
|
}
|
|
}
|
|
// add if last batch exists
|
|
if (!empty($list))
|
|
$player->msgs[] = $list;
|
|
|
|
// display ManiaLink message
|
|
display_manialink_multi($player);
|
|
} // TMO/TMS
|
|
} // chat_plugins
|
|
|
|
function chat_nations($aseco, $command) {
|
|
|
|
if ($aseco->server->getGame() == 'TMN')
|
|
$top = 10;
|
|
elseif ($aseco->server->getGame() == 'TMF')
|
|
$top = 10;
|
|
else // TMS/TMO
|
|
$top = 4;
|
|
|
|
$query = 'SELECT Nation, COUNT(Nation) AS count FROM players GROUP BY Nation ORDER BY count DESC LIMIT ' . $top;
|
|
$res = mysql_query($query);
|
|
|
|
// collect and sort nations
|
|
if (mysql_num_rows($res) > 0) {
|
|
$nations = array();
|
|
while ($row = mysql_fetch_row($res)) {
|
|
$nations[$row[0]] = $row[1];
|
|
}
|
|
mysql_free_result($res);
|
|
} else {
|
|
trigger_error('No players/nations found!', E_USER_WARNING);
|
|
mysql_free_result($res);
|
|
return;
|
|
}
|
|
arsort($nations);
|
|
|
|
if ($aseco->server->getGame() == 'TMN') {
|
|
$nats = 'TOP 10 Most Visiting Nations:';
|
|
$bgn = '{#black}'; // nation begin
|
|
$end = '$g'; // ... & end colors
|
|
|
|
// compile sorted nations
|
|
$i = 1;
|
|
foreach ($nations as $nat => $tot) {
|
|
$nats .= LF . $i++ . '. ' . $bgn . $nat . $end . ' - ' . $tot;
|
|
}
|
|
|
|
// display popup message
|
|
$aseco->client->query('SendDisplayServerMessageToLogin', $command['author']->login, $aseco->formatColors($nats), 'OK', '', 0);
|
|
|
|
} elseif ($aseco->server->getGame() == 'TMF') {
|
|
$header = 'TOP 10 Most Visiting Nations:';
|
|
$nats = array();
|
|
$bgn = '{#black}'; // nation begin
|
|
|
|
// compile sorted nations
|
|
$i = 1;
|
|
foreach ($nations as $nat => $tot) {
|
|
$nats[] = array($i++ . '.', $bgn . $nat, $tot);
|
|
}
|
|
|
|
// display ManiaLink message
|
|
display_manialink($command['author']->login, $header, array('Icons128x128_1', 'Credits'), $nats, array(0.8, 0.1, 0.4, 0.3), 'OK');
|
|
|
|
} else { // TMS/TMO
|
|
$nats = '{#server}> TOP 4 Most Visiting Nations:{#highlite}';
|
|
$bgn = '{#highlite}';
|
|
$end = '{#highlite}';
|
|
|
|
// compile sorted nations
|
|
$i = 1;
|
|
foreach ($nations as $nat => $tot) {
|
|
$nats .= LF . $i++ . '. ' . $bgn . $nat . $end . ' - ' . $tot;
|
|
}
|
|
|
|
// show chat message
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($nats), $command['author']->login);
|
|
}
|
|
} // chat_nations
|
|
?>
|