- updated readme

- removed core config file
- fixed chat utility settings
- improved commands handler
This commit is contained in:
Steffen Schröder 2013-11-10 14:56:37 +01:00
parent 31a32457c1
commit 644acaff82
6 changed files with 361 additions and 357 deletions

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Core configuration for ManiaControl -->
<core-config>
<!-- Connection timeout -->
<timeout>20</timeout>
<!-- Define the file name for automatically saving the match settings after each map (relative from /Maps/MatchSettings/) -->
<!-- (leave empty for not saving) -->
<autosave_matchsettings>tracklist.txt</autosave_matchsettings>
<!-- Directory for downloaded maps (relative from /Maps/) -->
<maps_dir>mx</maps_dir>
</core-config>

View File

@ -68,7 +68,7 @@ class Chat {
* @return bool * @return bool
*/ */
public function sendInformation($message, $login = null, $prefix = false) { public function sendInformation($message, $login = null, $prefix = false) {
$format = $this->maniaControl->settingManager->getSetting($this, 'ErrorFormat', '$fff'); $format = $this->maniaControl->settingManager->getSetting($this, 'InformationFormat', '$fff');
return $this->sendChat($format . $message, $login); return $this->sendChat($format . $message, $login);
} }
@ -81,7 +81,7 @@ class Chat {
* @return bool * @return bool
*/ */
public function sendSuccess($message, $login = null, $prefix = false) { public function sendSuccess($message, $login = null, $prefix = false) {
$format = $this->maniaControl->settingManager->getSetting($this, 'ErrorFormat', '$0f0'); $format = $this->maniaControl->settingManager->getSetting($this, 'SuccessFormat', '$0f0');
return $this->sendChat($format . $message, $login); return $this->sendChat($format . $message, $login);
} }

View File

@ -8,40 +8,34 @@ namespace ManiaControl;
* @author steeffeen * @author steeffeen
*/ */
class Commands { class Commands {
/** /**
* Private properties * Private properties
*/ */
private $mc = null; private $maniaControl = null;
private $config = null; private $config = null;
private $commandHandlers = array(); private $commandHandlers = array();
private $openBills = array(); private $openBills = array();
private $serverShutdownTime = -1; private $serverShutdownTime = -1;
private $serverShutdownEmpty = false; private $serverShutdownEmpty = false;
/** /**
* Construct commands handler * Construct commands handler
*/ */
public function __construct($mc) { public function __construct(ManiaControl $maniaControl) {
$this->mc = $mc; $this->maniaControl = $maniaControl;
// Load config // Load config
$this->config = FileUtil::loadConfig('commands.xml'); $this->config = FileUtil::loadConfig('commands.xml');
// Register for callbacks // Register for callbacks
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MC_5_SECOND, $this, 'each5Seconds'); $this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MC_5_SECOND, $this, 'each5Seconds');
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_BILLUPDATED, $this, 'handleBillUpdated'); $this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_BILLUPDATED, $this, 'handleBillUpdated');
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCHAT, $this, 'handleChatCallback'); $this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCHAT, $this, 'handleChatCallback');
// Register basic commands // Register basic commands
$commands = array('help', 'version', 'shutdown', 'shutdownserver', 'networkstats', 'systeminfo', 'getservername', $commands = array('help', 'version', 'shutdown', 'shutdownserver', 'networkstats', 'systeminfo', 'setservername', 'getplanets',
'setservername', 'getplanets', 'donate', 'pay', 'kick', 'nextmap', 'restartmap', 'addmap', 'removemap', 'startwarmup', 'donate', 'pay', 'kick', 'nextmap', 'restartmap', 'addmap', 'removemap', 'startwarmup', 'stopwarmup');
'stopwarmup');
foreach ($commands as $command) { foreach ($commands as $command) {
$this->registerCommandHandler($command, $this, 'command_' . $command); $this->registerCommandHandler($command, $this, 'command_' . $command);
} }
@ -53,12 +47,13 @@ class Commands {
* @param string $commandName * @param string $commandName
* @param object $handler * @param object $handler
* @param string $method * @param string $method
* @return bool
*/ */
public function registerCommandHandler($commandName, $handler, $method) { public function registerCommandHandler($commandName, $handler, $method) {
$command = strtolower($commandName); $command = strtolower($commandName);
if (!is_object($handler) || !method_exists($handler, $method)) { if (!is_object($handler) || !method_exists($handler, $method)) {
trigger_error("Given handler can't handle command '" . $command . "' (no method '" . $method . "')!"); trigger_error("Given handler can't handle command '{$command}' (no method '{$method}')!");
return; return false;
} }
if (!array_key_exists($command, $this->commandHandlers) || !is_array($this->commandHandlers[$command])) { if (!array_key_exists($command, $this->commandHandlers) || !is_array($this->commandHandlers[$command])) {
// Init handlers array // Init handlers array
@ -66,43 +61,57 @@ class Commands {
} }
// Register command handler // Register command handler
array_push($this->commandHandlers[$command], array($handler, $method)); array_push($this->commandHandlers[$command], array($handler, $method));
return true;
} }
/** /**
* Handle chat callback * Handle chat callback
*
* @param array $callback
* @return bool
*/ */
public function handleChatCallback($callback) { public function handleChatCallback(array $callback) {
$chat = $callback[1]; $chat = $callback[1];
// Check for command // Check for command
if (!$chat[3]) return; if (!$chat[3]) {
return false;
}
// Check for valid player // Check for valid player
if ($chat[0] <= 0 || strlen($chat[1]) <= 0) return; if ($chat[0] <= 0 || strlen($chat[1]) <= 0) {
return false;
}
// Handle command // Handle command
$command = explode(" ", substr($chat[2], 1)); $command = explode(" ", substr($chat[2], 1));
$command = strtolower($command[0]); $command = strtolower($command[0]);
if (!array_key_exists($command, $this->commandHandlers) || !is_array($this->commandHandlers[$command])) { if (!array_key_exists($command, $this->commandHandlers) || !is_array($this->commandHandlers[$command])) {
// No command handler registered // No command handler registered
return; return true;
} }
// Inform command handlers // Inform command handlers
foreach ($this->commandHandlers[$command] as $handler) { foreach ($this->commandHandlers[$command] as $handler) {
call_user_func(array($handler[0], $handler[1]), $callback); call_user_func(array($handler[0], $handler[1]), $callback);
} }
return true;
} }
/** /**
* Handle bill updated callback * Handle bill updated callback
*
* @param array $callback
* @return bool
*/ */
public function handleBillUpdated($callback) { public function handleBillUpdated(array $callback) {
$bill = $callback[1]; $bill = $callback[1];
if (!array_key_exists($bill[0], $this->openBills)) return; if (!array_key_exists($bill[0], $this->openBills)) {
return false;
}
$login = $this->openBills[$bill[0]]; $login = $this->openBills[$bill[0]];
switch ($bill[1]) { switch ($bill[1]) {
case 4: case 4:
{ {
// Payed // Payed
$message = 'Success! Thanks.'; $message = 'Success! Thanks.';
$this->mc->chat->sendSuccess($message, $login); $this->maniaControl->chat->sendSuccess($message, $login);
unset($this->openBills[$bill[0]]); unset($this->openBills[$bill[0]]);
break; break;
} }
@ -110,18 +119,19 @@ class Commands {
{ {
// Refused // Refused
$message = 'Transaction cancelled.'; $message = 'Transaction cancelled.';
$this->mc->chat->sendError($message, $login); $this->maniaControl->chat->sendError($message, $login);
unset($this->openBills[$bill[0]]); unset($this->openBills[$bill[0]]);
break; break;
} }
case 6: case 6:
{ {
// Error // Error
$this->mc->chat->sendError($bill[2], $login); $this->maniaControl->chat->sendError($bill[2], $login);
unset($this->openBills[$bill[0]]); unset($this->openBills[$bill[0]]);
break; break;
} }
} }
return true;
} }
/** /**
@ -133,8 +143,10 @@ class Commands {
*/ */
private function getRightsLevel($commandName, $defaultLevel) { private function getRightsLevel($commandName, $defaultLevel) {
$command_rights = $this->config->xpath('//' . strtolower($commandName) . '/..'); $command_rights = $this->config->xpath('//' . strtolower($commandName) . '/..');
if (empty($command_rights)) return $defaultLevel; if (empty($command_rights)) {
$rights = $this->mc->authentication->RIGHTS_LEVELS; return $defaultLevel;
}
$rights = $this->maniaControl->authentication->RIGHTS_LEVELS;
$highest_level = null; $highest_level = null;
foreach ($command_rights as $right) { foreach ($command_rights as $right) {
$levelName = $right->getName(); $levelName = $right->getName();
@ -143,34 +155,41 @@ class Commands {
$highest_level = $levelInt; $highest_level = $levelInt;
} }
} }
if ($highest_level === null || !array_key_exists($highest_level, $rights)) return $defaultLevel; if ($highest_level === null || !array_key_exists($highest_level, $rights)) {
return $defaultLevel;
}
return $rights[$highest_level]; return $rights[$highest_level];
} }
/** /**
* Send ManiaControl version * Send ManiaControl version
*
* @param array $chat
* @return bool
*/ */
private function command_version($chat) { private function command_version(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('version', 'all'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('version', 'all'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
}
if (!$this->mc->chat->sendInformation('This server is using ManiaControl v' . ManiaControl::VERSION . '!', $login)) {
trigger_error("Couldn't send version to '" . $login . "'. " . $this->mc->getClientErrorText());
} }
$message = 'This server is using ManiaControl v' . ManiaControl::VERSION . '!';
return $this->maniaControl->chat->sendInformation($message, $login);
} }
/** /**
* Send help list * Send help list
*
* @param array $chat
* @return bool
*/ */
private function command_help($chat) { private function command_help(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('help', 'all'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('help', 'all'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
} }
// TODO: improve help command // TODO: improve help command
// TODO: enable help for specific commands // TODO: enable help for specific commands
@ -178,7 +197,7 @@ class Commands {
$commands = array_keys($this->commandHandlers); $commands = array_keys($this->commandHandlers);
$count = count($commands); $count = count($commands);
for ($index = 0; $index < $count; $index++) { for ($index = 0; $index < $count; $index++) {
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel($commands[$index], 'superadmin'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel($commands[$index], 'superadmin'))) {
unset($commands[$index]); unset($commands[$index]);
} }
} }
@ -191,93 +210,99 @@ class Commands {
} }
$index++; $index++;
} }
if (!$this->mc->chat->sendInformation($list, $login)) { return $this->maniaControl->chat->sendInformation($list, $login);
trigger_error("Couldn't send help list to '" . $login . "'. " . $this->mc->getClientErrorText());
}
} }
/** /**
* Handle getplanets command * Handle getplanets command
*
* @param array $chat
* @return bool
*/ */
private function command_getplanets($chat) { private function command_getplanets(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('getplanets', 'admin'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('getplanets', 'admin'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
} }
if (!$this->mc->client->query('GetServerPlanets')) { if (!$this->maniaControl->client->query('GetServerPlanets')) {
trigger_error("Couldn't retrieve server planets. " . $this->mc->getClientErrorText()); trigger_error("Couldn't retrieve server planets. " . $this->maniaControl->getClientErrorText());
} return false;
else {
$planets = $this->mc->client->getResponse();
if (!$this->mc->chat->sendInformation('This Server has ' . $planets . ' Planets!', $login)) {
trigger_error("Couldn't send server planets to '" . $login . "'. " . $this->mc->getClientErrorText());
}
} }
$planets = $this->maniaControl->client->getResponse();
$message = "This Server has {$planets} Planets!";
return $this->maniaControl->chat->sendInformation($message, $login);
} }
/** /**
* Handle donate command * Handle donate command
*
* @param array $chat
* @return bool
*/ */
private function command_donate($chat) { private function command_donate(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('donate', 'all'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('donate', 'all'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return;
} }
$params = explode(' ', $chat[1][2]); $params = explode(' ', $chat[1][2]);
if (count($params) < 2) { if (count($params) < 2) {
// TODO: send usage information // TODO: send usage information
return; return false;
} }
$amount = (int) $params[1]; $amount = (int) $params[1];
if (!$amount || $amount <= 0) { if (!$amount || $amount <= 0) {
// TODO: send usage information // TODO: send usage information
return; return false;
} }
if (count($params) >= 3) { if (count($params) >= 3) {
$receiver = $params[2]; $receiver = $params[2];
$receiverPlayer = $this->mc->database->getPlayer($receiver); $receiverPlayer = $this->maniaControl->database->getPlayer($receiver);
$receiverName = ($receiverPlayer ? $receiverPlayer['NickName'] : $receiver); $receiverName = ($receiverPlayer ? $receiverPlayer['NickName'] : $receiver);
} }
else { else {
$receiver = ''; $receiver = '';
$receiverName = $this->mc->server->getName(); $receiverName = $this->maniaControl->server->getName();
} }
$message = 'Donate ' . $amount . ' Planets to $<' . $receiverName . '$>?'; $message = 'Donate ' . $amount . ' Planets to $<' . $receiverName . '$>?';
if (!$this->mc->client->query('SendBill', $login, $amount, $message, $receiver)) { if (!$this->maniaControl->client->query('SendBill', $login, $amount, $message, $receiver)) {
trigger_error( trigger_error(
"Couldn't create donation of " . $amount . " planets from '" . $login . "' for '" . $receiver . "'. " . "Couldn't create donation of {$amount} planets from '{$login}' for '{$receiver}'. " .
$this->mc->getClientErrorText()); $this->maniaControl->getClientErrorText());
$this->mc->chat->sendError("Creating donation failed.", $login); $this->maniaControl->chat->sendError("Creating donation failed.", $login);
} return false;
else {
$bill = $this->mc->client->getResponse();
$this->openBills[$bill] = $login;
} }
$bill = $this->maniaControl->client->getResponse();
$this->openBills[$bill] = $login;
return true;
} }
/** /**
* Handle pay command * Handle pay command
*
* @param array $chat
* @return bool
*/ */
private function command_pay($chat) { private function command_pay(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('pay', 'superadmin'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('pay', 'superadmin'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
} }
$params = explode(' ', $chat[1][2]); $params = explode(' ', $chat[1][2]);
if (count($params) < 2) { if (count($params) < 2) {
// TODO: send usage information // TODO: send usage information
return; return false;
} }
$amount = (int) $params[1]; $amount = (int) $params[1];
if (!$amount || $amount <= 0) { if (!$amount || $amount <= 0) {
// TODO: send usage information // TODO: send usage information
return; return false;
} }
if (count($params) >= 3) { if (count($params) >= 3) {
$receiver = $params[2]; $receiver = $params[2];
@ -285,114 +310,118 @@ class Commands {
else { else {
$receiver = $login; $receiver = $login;
} }
$message = 'Payout from $<' . $this->mc->server->getName() . '$>.'; $message = 'Payout from $<' . $this->maniaControl->server->getName() . '$>.';
if (!$this->mc->client->query('Pay', $receiver, $amount, $message)) { if (!$this->maniaControl->client->query('Pay', $receiver, $amount, $message)) {
trigger_error( trigger_error(
"Couldn't create payout of" . $amount . " planets by '" . $login . "' for '" . $receiver . "'. " . "Couldn't create payout of {$amount} planets by '{$login}' for '{$receiver}'. " .
$this->mc->getClientErrorText()); $this->maniaControl->getClientErrorText());
$this->mc->chat->sendError("Creating payout failed.", $login); $this->maniaControl->chat->sendError("Creating payout failed.", $login);
} return false;
else {
$bill = $this->mc->client->getResponse();
$this->openBills[$bill] = $login;
} }
$bill = $this->maniaControl->client->getResponse();
$this->openBills[$bill] = $login;
return true;
} }
/** /**
* Handle networkstats command * Handle networkstats command
*
* @param array $chat
* @return bool
*/ */
private function command_networkstats($chat) { private function command_networkstats(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('networkstats', 'superadmin'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('networkstats', 'superadmin'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
}
$networkStats = $this->mc->server->getNetworkStats();
$message = 'NetworkStats: ' . 'uptime=' . $networkStats['Uptime'] . ', ' . 'nbConn=' . $networkStats['NbrConnection'] . ', ' .
'recvRate=' . $networkStats['RecvNetRate'] . ', ' . 'sendRate=' . $networkStats['SendNetRate'] . ', ' . 'recvTotal=' .
$networkStats['SendNetRate'] . ', ' . 'sentTotal=' . $networkStats['SendNetRate'];
if (!$this->mc->chat->sendInformation($message, $login)) {
trigger_error("Couldn't send network stats to '" . $login . "'. " . $this->mc->getClientErrorText());
} }
$networkStats = $this->maniaControl->server->getNetworkStats();
$message = 'NetworkStats: uptime=' . $networkStats['Uptime'] . ', nbConn=' . $networkStats['NbrConnection'] . ', recvRate=' .
$networkStats['RecvNetRate'] . ', sendRate=' . $networkStats['SendNetRate'] . ', recvTotal=' .
$networkStats['SendNetRate'] . ', sentTotal=' . $networkStats['SendNetRate'];
return $this->maniaControl->chat->sendInformation($message, $login);
} }
/** /**
* Handle systeminfo command * Handle systeminfo command
*
* @param array $chat
* @return bool
*/ */
private function command_systeminfo($chat) { private function command_systeminfo(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('systeminfo', 'superadmin'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('systeminfo', 'superadmin'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
}
$systemInfo = $this->mc->server->getSystemInfo();
$message = 'SystemInfo: ' . 'ip=' . $systemInfo['PublishedIp'] . ', ' . 'port=' . $systemInfo['Port'] . ', ' . 'p2pPort=' .
$systemInfo['P2PPort'] . ', ' . 'title=' . $systemInfo['TitleId'] . ', ' . 'login=' . $systemInfo['ServerLogin'] . ', ';
if (!$this->mc->chat->sendInformation($message, $login)) {
trigger_error("Couldn't send system info to '" . $login . "'. " . $this->mc->getClientErrorText());
} }
$systemInfo = $this->maniaControl->server->getSystemInfo();
$message = 'SystemInfo: ip=' . $systemInfo['PublishedIp'] . ', port=' . $systemInfo['Port'] . ', p2pPort=' .
$systemInfo['P2PPort'] . ', title=' . $systemInfo['TitleId'] . ', login=' . $systemInfo['ServerLogin'] . ', ';
return $this->maniaControl->chat->sendInformation($message, $login);
} }
/** /**
* Handle shutdown command * Handle shutdown command
*
* @param array $chat
* @return bool
*/ */
private function command_shutdown($chat) { private function command_shutdown(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('shutdown', 'superadmin'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('shutdown', 'superadmin'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
} }
$this->mc->quit("ManiaControl shutdown requested by '{$login}'"); return $this->maniaControl->quit("ManiaControl shutdown requested by '{$login}'");
} }
/** /**
* Handle startwarmup command * Handle startwarmup command
*
* @param array $chat
* @return bool
*/ */
private function command_startwarmup($chat) { private function command_startwarmup(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('startwarmup', 'operator'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('startwarmup', 'operator'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
}
if (!$this->mc->client->query("SetWarmUp", true)) {
trigger_error("Couldn't start warmup. " . $this->mc->getClientErrorText());
$player = $this->mc->database->getPlayer($login);
$this->mc->chat->sendInformation('$<' . ($player ? $player['NickName'] : $login) . '$> started WarmUp!');
} }
return $this->maniaControl->client->query("SetWarmUp", true);
} }
/** /**
* Handle stopwarmup command * Handle stopwarmup command
*
* @param array $chat
* @return bool
*/ */
private function command_stopwarmup($chat) { private function command_stopwarmup(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('stopwarmup', 'operator'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('stopwarmup', 'operator'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
}
if (!$this->mc->client->query("SetWarmUp", false)) {
trigger_error("Couldn't stop warmup. " . $this->mc->getClientErrorText());
}
else {
$player = $this->mc->database->getPlayer($login);
$this->mc->chat->sendInformation('$<' . ($player ? $player['NickName'] : $login) . '$> stopped WarmUp!');
} }
return $this->maniaControl->client->query("SetWarmUp", false);
} }
/** /**
* Handle server shutdown command * Handle server shutdown command
*
* @param array $chat
* @return bool
*/ */
private function command_shutdownserver($chat) { private function command_shutdownserver(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('shutdownserver', 'superadmin'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('shutdownserver', 'superadmin'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
} }
// Check for delayed shutdown // Check for delayed shutdown
$params = explode(' ', $chat[1][2]); $params = explode(' ', $chat[1][2]);
@ -401,283 +430,280 @@ class Commands {
if ($param == 'empty') { if ($param == 'empty') {
$this->serverShutdownEmpty = !$this->serverShutdownEmpty; $this->serverShutdownEmpty = !$this->serverShutdownEmpty;
if ($this->serverShutdownEmpty) { if ($this->serverShutdownEmpty) {
$this->mc->chat->sendInformation("The server will shutdown as soon as it's empty!", $login); $this->maniaControl->chat->sendInformation("The server will shutdown as soon as it's empty!", $login);
} return true;
else {
$this->mc->chat->sendInformation("Empty-shutdown cancelled!", $login);
} }
$this->maniaControl->chat->sendInformation("Empty-shutdown cancelled!", $login);
return true;
} }
else { $delay = (int) $param;
$delay = (int) $param; if ($delay <= 0) {
if ($delay <= 0) { // Cancel shutdown
// Cancel shutdown $this->serverShutdownTime = -1;
$this->serverShutdownTime = -1; $this->maniaControl->chat->sendInformation("Delayed shutdown cancelled!", $login);
$this->mc->chat->sendInformation("Delayed shutdown cancelled!", $login); return true;
}
else {
// Trigger delayed shutdown
$this->serverShutdownTime = time() + $delay * 60.;
$this->mc->chat->sendInformation("The server will shut down in " . $delay . " minutes!", $login);
}
} }
// Trigger delayed shutdown
$this->serverShutdownTime = time() + $delay * 60.;
$this->maniaControl->chat->sendInformation("The server will shut down in " . $delay . " minutes!", $login);
return true;
} }
else { return $this->shutdownServer($login);
$this->shutdownServer($login);
}
} }
/** /**
* Handle kick command * Handle kick command
*
* @param array $chat
* @return bool
*/ */
private function command_kick($chat) { private function command_kick(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('kick', 'operator'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('kick', 'operator'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
} }
$params = explode(' ', $chat[1][2], 3); $params = explode(' ', $chat[1][2], 3);
if (count($params) < 2) { if (count($params) < 2) {
// TODO: show usage // TODO: show usage
return; return false;
} }
$target = $params[1]; $target = $params[1];
$players = $this->mc->server->getPlayers(); $players = $this->maniaControl->server->getPlayers();
foreach ($players as $player) { foreach ($players as $player) {
if ($player['Login'] != $target) continue; if ($player['Login'] != $target) {
continue;
}
// Kick player // Kick player
$message = '';
if (isset($params[2])) { if (isset($params[2])) {
$message = $params[2]; $message = $params[2];
} }
else { return $this->maniaControl->client->query('Kick', $target, $message);
$message = "";
}
if (!$this->mc->client->query('Kick', $target, $message)) {
trigger_error("Couldn't kick player '" . $target . "'! " . $this->mc->getClientErrorText());
}
return;
} }
$this->mc->chat->sendError("Invalid player login.", $login); $this->maniaControl->chat->sendError("Invalid player login.", $login);
return false;
} }
/** /**
* Handle removemap command * Handle removemap command
*
* @param array $chat
* @return bool
*/ */
private function command_removemap($chat) { private function command_removemap(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('kick', 'operator'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('kick', 'operator'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
} }
// TODO: allow params // TODO: allow params
// Get map name // Get map name
$map = $this->mc->server->getMap(); $map = $this->maniaControl->server->getMap();
if (!$map) { if (!$map) {
$this->mc->chat->sendError("Couldn't remove map.", $login); $this->maniaControl->chat->sendError("Couldn't remove map.", $login);
return false;
} }
else { $mapName = $map['FileName'];
$mapName = $map['FileName']; // Remove map
if (!$this->maniaControl->client->query('RemoveMap', $mapName)) {
// Remove map trigger_error("Couldn't remove current map. " . $this->maniaControl->getClientErrorText());
if (!$this->mc->client->query('RemoveMap', $mapName)) { return false;
trigger_error("Couldn't remove current map. " . $this->mc->getClientErrorText());
}
else {
$this->mc->chat->sendSuccess('Map removed.', $login);
}
} }
$this->maniaControl->chat->sendSuccess('Map removed.', $login);
return true;
} }
/** /**
* Handle addmap command * Handle addmap command
*
* @param array $chat
* @return bool
*/ */
private function command_addmap($chat) { private function command_addmap(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('addmap', 'operator'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('addmap', 'operator'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
} }
$params = explode(' ', $chat[1][2], 2); $params = explode(' ', $chat[1][2], 2);
if (count($params) < 2) { if (count($params) < 2) {
// TODO: show usage // TODO: show usage
return; return false;
} }
// Check if ManiaControl can even write to the maps dir // Check if ManiaControl can even write to the maps dir
if (!$this->mc->client->query('GetMapsDirectory')) { if (!$this->maniaControl->client->query('GetMapsDirectory')) {
trigger_error("Couldn't get map directory. " . $this->mc->getClientErrorText()); trigger_error("Couldn't get map directory. " . $this->maniaControl->getClientErrorText());
$this->mc->chat->sendError("ManiaControl couldn't retrieve the maps directory.", $login); $this->maniaControl->chat->sendError("ManiaControl couldn't retrieve the maps directory.", $login);
return; return false;
} }
else { $mapDir = $this->maniaControl->client->getResponse();
$mapDir = $this->mc->client->getResponse(); if (!is_dir($mapDir)) {
if (!is_dir($mapDir)) { trigger_error("ManiaControl doesn't have have access to the maps directory in '{$mapDir}'.");
trigger_error("ManiaControl doesn't have have access to the maps directory in '" . $mapDir . "'."); $this->maniaControl->chat->sendError("ManiaControl doesn't have access to the maps directory.", $login);
$this->mc->chat->sendError("ManiaControl doesn't have access to the maps directory.", $login); return false;
return;
}
$dlDir = (string) $this->mc->config->maps_dir;
// Create mx directory if necessary
if (!is_dir($mapDir . $dlDir) && !mkdir($mapDir . $dlDir)) {
trigger_error("ManiaControl doesn't have to rights to save maps in'" . $mapDir . $dlDir, "'.");
$this->mc->chat->sendError("ManiaControl doesn't have to rights to save maps.", $login);
return;
}
$mapDir .= $dlDir . '/';
// Download the map
if (is_numeric($params[1])) {
$serverInfo = $this->mc->server->getSystemInfo();
$title = strtolower(substr($serverInfo['TitleId'], 0, 2));
// Check if map exists
$url = 'http://' . $title . '.mania-exchange.com/api/tracks/get_track_info/id/' . $params[1] . '?format=json';
$mapInfo = FileUtil::loadFile($url);
if (!$mapInfo || strlen($mapInfo) <= 0) {
// Invalid id
$this->mc->chat->sendError('Invalid MX-Id!', $login);
return;
}
$mapInfo = json_decode($mapInfo, true);
$url = 'http://' . $title . '.mania-exchange.com/tracks/download/' . $params[1];
$file = FileUtil::loadFile($url);
if (!$file) {
// Download error
$this->mc->chat->sendError('Download failed!', $login);
return;
}
// Save map
$fileName = $mapDir . $mapInfo['TrackID'] . '_' . $mapInfo['Name'] . '.Map.Gbx';
if (!file_put_contents($fileName, $file)) {
// Save error
$this->mc->chat->sendError('Saving map failed!', $login);
return;
}
// Check for valid map
if (!$this->mc->client->query('CheckMapForCurrentServerParams', $fileName)) {
trigger_error("Couldn't check if map is valid. " . $this->mc->getClientErrorText());
}
else {
$response = $this->mc->client->getResponse();
if (!$response) {
// Inalid map type
$this->mc->chat->sendError("Invalid map type.", $login);
return;
}
}
// Add map to map list
if (!$this->mc->client->query('InsertMap', $fileName)) {
$this->mc->chat->sendError("Couldn't add map to match settings!", $login);
return;
}
$this->mc->chat->sendSuccess('Map $<' . $mapInfo['Name'] . '$> successfully added!');
}
else {
// TODO: check if map exists locally
// TODO: load map from direct url
}
} }
$downloadDirectory = $this->maniaControl->settingManager->getSetting($this, 'MapDownloadDirectory', 'mx');
// Create download directory if necessary
if (!is_dir($mapDir . $downloadDirectory) && !mkdir($mapDir . $downloadDirectory)) {
trigger_error("ManiaControl doesn't have to rights to save maps in '{$mapDir}{$downloadDirectory}'.");
$this->maniaControl->chat->sendError("ManiaControl doesn't have the rights to save maps.", $login);
return false;
}
$mapDir .= $downloadDirectory . '/';
// Download the map
$mapId = $params[1];
if (is_numeric($mapId)) {
// Load from MX
$serverInfo = $this->maniaControl->server->getSystemInfo();
$title = strtolower(substr($serverInfo['TitleId'], 0, 2));
// Check if map exists
$url = "http://{$title}.mania-exchange.com/api/tracks/get_track_info/id/{$mapId}?format=json";
$mapInfo = FileUtil::loadFile($url);
if (!$mapInfo || strlen($mapInfo) <= 0) {
// Invalid id
$this->maniaControl->chat->sendError('Invalid MX-Id!', $login);
return false;
}
$mapInfo = json_decode($mapInfo, true);
$url = "http://{$title}.mania-exchange.com/tracks/download/{$mapId}";
$file = FileUtil::loadFile($url);
if (!$file) {
// Download error
$this->maniaControl->chat->sendError('Download failed!', $login);
return false;
}
// Save map
$fileName = $mapDir . $mapInfo['TrackID'] . '_' . $mapInfo['Name'] . '.Map.Gbx';
if (!file_put_contents($fileName, $file)) {
// Save error
$this->maniaControl->chat->sendError('Saving map failed!', $login);
return false;
}
// Check for valid map
if (!$this->maniaControl->client->query('CheckMapForCurrentServerParams', $fileName)) {
trigger_error("Couldn't check if map is valid. " . $this->maniaControl->getClientErrorText());
$this->maniaControl->chat->sendError('Error checking map!', $login);
return false;
}
$response = $this->maniaControl->client->getResponse();
if (!$response) {
// Inalid map type
$this->maniaControl->chat->sendError("Invalid map type.", $login);
return false;
}
// Add map to map list
if (!$this->maniaControl->client->query('InsertMap', $fileName)) {
$this->maniaControl->chat->sendError("Couldn't add map to match settings!", $login);
return false;
}
$this->maniaControl->chat->sendSuccess('Map $<' . $mapInfo['Name'] . '$> successfully added!');
return true;
}
// TODO: add local map by filename
// TODO: load map from direct url
} }
/** /**
* Handle nextmap command * Handle nextmap command
*
* @param array $chat
* @return bool
*/ */
private function command_nextmap($chat) { private function command_nextmap(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('nextmap', 'operator'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('nextmap', 'operator'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
}
if (!$this->mc->client->query('NextMap')) {
trigger_error("Couldn't skip map. " . $this->mc->getClientErrorText());
} }
return $this->maniaControl->client->query('NextMap');
} }
/** /**
* Handle retartmap command * Handle retartmap command
*
* @param array $chat
* @return bool
*/ */
private function command_restartmap($chat) { private function command_restartmap(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('restartmap', 'operator'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('restartmap', 'operator'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
} }
if (!$this->mc->client->query('RestartMap')) { return $this->maniaControl->client->query('RestartMap');
trigger_error("Couldn't restart map. " . $this->mc->getClientErrorText());
}
}
/**
* Handle getservername command
*/
private function command_getservername($chat) {
$login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('getservername', 'operator'))) {
// Not allowed!
$this->mc->authentication->sendNotAllowed($login);
return;
}
$serverName = $this->mc->server->getName();
$this->mc->chat->sendInformation("Server Name: " . $serverName, $login);
} }
/** /**
* Handle setservername command * Handle setservername command
*
* @param array $chat
* @return bool
*/ */
private function command_setservername($chat) { private function command_setservername(array $chat) {
$login = $chat[1][1]; $login = $chat[1][1];
if (!$this->mc->authentication->checkRight($login, $this->getRightsLevel('setservername', 'admin'))) { if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('setservername', 'admin'))) {
// Not allowed! // Not allowed!
$this->mc->authentication->sendNotAllowed($login); $this->maniaControl->authentication->sendNotAllowed($login);
return; return false;
} }
$params = explode(' ', $chat[1][2], 2); $params = explode(' ', $chat[1][2], 2);
if (count($params) < 2) { if (count($params) < 2) {
// TODO: show usage // TODO: show usage
return; return false;
} }
$serverName = $params[1]; $serverName = $params[1];
if (!$this->mc->client->query('SetServerName', $serverName)) { if (!$this->maniaControl->client->query('SetServerName', $serverName)) {
trigger_error("Couldn't set server name. " . $this->mc->getClientErrorText()); trigger_error("Couldn't set server name. " . $this->maniaControl->getClientErrorText());
$this->mc->chat->sendError("Error!"); $this->maniaControl->chat->sendError("Error!", $login);
} return false;
else {
$serverName = $this->mc->server->getName();
$this->mc->chat->sendInformation("New Name: " . $serverName);
} }
$serverName = $this->maniaControl->server->getName();
$this->maniaControl->chat->sendInformation("New Name: " . $serverName, $login);
return true;
} }
/** /**
* Check stuff each 5 seconds * Check stuff each 5 seconds
*
* @param array $callback
* @return bool
*/ */
public function each5Seconds() { public function each5Seconds(array $callback) {
// Empty shutdown // Empty shutdown
if ($this->serverShutdownEmpty) { if ($this->serverShutdownEmpty) {
$players = $this->mc->server->getPlayers(); $players = $this->maniaControl->server->getPlayers();
if (count($players) <= 0) { if (count($players) <= 0) {
$this->shutdownServer('empty'); return $this->shutdownServer('empty');
} }
} }
// Delayed shutdown // Delayed shutdown
if ($this->serverShutdownTime > 0) { if ($this->serverShutdownTime > 0) {
if (time() >= $this->serverShutdownTime) { if (time() >= $this->serverShutdownTime) {
$this->shutdownServer('delayed'); return $this->shutdownServer('delayed');
} }
} }
} }
/** /**
* Perform server shutdown * Perform server shutdown
*
* @param string $login
* @return bool
*/ */
private function shutdownServer($login = '#') { private function shutdownServer($login = '#') {
$this->mc->client->resetError(); if (!$this->maniaControl->client->query('StopServer')) {
if (!$this->mc->client->query('StopServer') || $this->mc->client->isError()) { trigger_error("Server shutdown command from '{$login}' failed. " . $this->maniaControl->getClientErrorText());
trigger_error("Server shutdown command from '" . $login . "' failed. " . $this->mc->getClientErrorText()); return false;
return;
} }
$this->mc->quit("Server shutdown requested by '" . $login . "'"); $this->maniaControl->quit("Server shutdown requested by '{$login}'");
return true;
} }
} }

View File

@ -55,13 +55,11 @@ class ManiaControl {
* Private properties * Private properties
*/ */
private $shutdownRequested = false; private $shutdownRequested = false;
private $config = null;
/** /**
* Construct ManiaControl * Construct ManiaControl
*/ */
public function __construct() { public function __construct() {
$this->config = FileUtil::loadConfig('core.xml');
$this->database = new Database($this); $this->database = new Database($this);
$this->settingManager = new SettingManager($this); $this->settingManager = new SettingManager($this);
$this->chat = new Chat($this); $this->chat = new Chat($this);
@ -169,14 +167,11 @@ class ManiaControl {
$port = $this->server->config->xpath('port'); $port = $this->server->config->xpath('port');
if (!$host) trigger_error("Invalid server configuration (port).", E_USER_ERROR); if (!$host) trigger_error("Invalid server configuration (port).", E_USER_ERROR);
$port = (string) $port[0]; $port = (string) $port[0];
$timeout = $this->config->xpath('timeout');
if (!$timeout) trigger_error("Invalid core configuration (timeout).", E_USER_ERROR);
$timeout = (int) $timeout[0];
error_log("Connecting to server at {$host}:{$port}..."); error_log("Connecting to server at {$host}:{$port}...");
// Connect // Connect
if (!$this->client->InitWithIp($host, $port, $timeout)) { if (!$this->client->InitWithIp($host, $port, 20)) {
trigger_error("Couldn't connect to server! " . $this->getClientErrorText(), E_USER_ERROR); trigger_error("Couldn't connect to server! " . $this->getClientErrorText(), E_USER_ERROR);
} }

View File

@ -353,8 +353,7 @@ class Server {
if ($response['Code'] === 4) return true; if ($response['Code'] === 4) return true;
// Server not yet in given status -> Wait for it... // Server not yet in given status -> Wait for it...
$waitBegin = time(); $waitBegin = time();
$timeoutTags = $this->mc->config->xpath('timeout'); $maxWaitTime = 20;
$maxWaitTime = (!empty($timeoutTags) ? (int) $timeoutTags[0] : 20);
$lastStatus = $response['Name']; $lastStatus = $response['Name'];
error_log("Waiting for server to reach status " . $statusCode . "..."); error_log("Waiting for server to reach status " . $statusCode . "...");
error_log("Current Status: " . $lastStatus); error_log("Current Status: " . $lastStatus);

View File

@ -1,10 +1,13 @@
********************************************** *******************************************************
* * * *
* mc ManiaPlanet Server Control * * ManiaControl - ManiaPlanet Server Controller *
* Written by steeffeen * * Written by steeffeen & kremsy *
* Contact: mail@steeffeen.com * * *
* * * Contact: *
********************************************** * steff@maniacontrol.com, *
* lukas@maniacontrol.com *
* *
*******************************************************
SETUP: SETUP:
@ -12,32 +15,28 @@ SETUP:
2. Configure the needed settings: 2. Configure the needed settings:
2.1 Open the file 'configs/server.mc.xml'. 2.1 Open the file 'configs/server.xml'.
Enter your maniaplanet server information. Enter your maniaplanet server information.
2.2 Open the file 'configs/database.mc.xml' 2.2 Open the file 'configs/database.xml'
Enter your mysql server information or disable database usage if you don't have a mysql server available. Enter your mysql server information.
2.3 Open the file 'configs/authentication.mc.xml'. 2.3 Open the file 'configs/authentication.xml'.
Add the player logins who should have access to the commands of mc. Add the player logins who should have access to the commands of ManiaControl.
3. (Optional) Enable or disable the available plugins in the file 'configs/plugins.mc.xml'. 3. Run the tool via the shell script 'ManiaControl.sh' (UNIX) or the batch file 'ManiaControl.bat' (Windows)
4. (Optional) Edit the other config files in 'configs/' in order to customize your mc to fit your needs. 4. Enjoy!
5. Run the tool via the shell script 'mc.sh' (UNIX) or the batch file 'mc.bat' (Windows)
6. Enjoy!
INFORMATION: INFORMATION:
- mc is only tested on UNIX machines - ManiaControl is only tested on UNIX machines
- even though it might run properly on Windows I can't promise it will work all the time - even though it might run properly on Windows we can't promise it will work all the time
- furthermore I can't promise that there won't be a feature in the future that makes it impossible to run mc under Windows - furthermore we can't promise that there won't be a feature in the future that makes it impossible to run ManiaControl on Windows
- in order to run mc under Windows you have to alter the file mc.bat and enter the path to your php.exe - in order to run ManiaControl on Windows you have to alter the file ManiaControl.bat and enter the path to your php.exe
- Tests were performed using PHP Version 5.4 - Tests were performed using PHP Version 5.4
- If you notice problems with other version please let me know - If you notice problems with other version please let me know
- Please report bugs by writing a mail to mail@steeffeen.com - Please report bugs by writing a mail to bugs@maniacontrol.com