docker-tmserver/xaseco/plugins/chat.server.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
?>