diff --git a/application/configs/authentication.iControl.xml b/application/configs/authentication.iControl.xml
deleted file mode 100644
index 38659bfb..00000000
--- a/application/configs/authentication.iControl.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
- steeffeen
-
-
-
-
-
- gorby
- canyondrive
-
-
-
-
-
- eyebo
- jojo95183
- xanashea
- ardid
- gugli
- phil13hebert
- xcaliber
- eole
- fix
- kremsy
- papychampy
- titishu
- wurstigewurst
-
-
-
diff --git a/application/configs/chat.iControl.xml b/application/configs/chat.iControl.xml
deleted file mode 100644
index 4afb1ee3..00000000
--- a/application/configs/chat.iControl.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
- $fff
- $0f0
- $f00
-
-
-
diff --git a/application/configs/commands.iControl.xml b/application/configs/commands.iControl.xml
deleted file mode 100644
index 5eb30730..00000000
--- a/application/configs/commands.iControl.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/application/configs/core.iControl.xml b/application/configs/core.iControl.xml
deleted file mode 100644
index 50386359..00000000
--- a/application/configs/core.iControl.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
- 20
-
-
-
- tracklist.txt
-
-
- mx
-
-
diff --git a/application/configs/database.iControl.xml b/application/configs/database.iControl.xml
deleted file mode 100644
index 153fc767..00000000
--- a/application/configs/database.iControl.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
- localhost
- 3306
-
-
- steff
- kjhgvhbjnfih2394ugnjk
-
-
- steff_united
-
-
diff --git a/application/configs/plugins.iControl.xml b/application/configs/plugins.iControl.xml
deleted file mode 100644
index 7f546f47..00000000
--- a/application/configs/plugins.iControl.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
- chatlog.plugin.php
- karma.plugin.php
- records.plugin.php
- united.plugin.php
-
-
-
-
diff --git a/application/configs/server.iControl.xml b/application/configs/server.iControl.xml
deleted file mode 100644
index 179b9eb5..00000000
--- a/application/configs/server.iControl.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
- true
-
-
- 144.76.158.111
- localhost
- 21003
-
-
- SuperAdmin
- dtcfvgubhnjomkjnbhv
-
-
diff --git a/application/configs/stats.iControl.xml b/application/configs/stats.iControl.xml
deleted file mode 100644
index 6bd8da92..00000000
--- a/application/configs/stats.iControl.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- true
-
-
- true
-
-
- true
-
-
- true
-
-
-
-
-
-
-
- true
-
-
- true
-
-
- true
-
-
- true
-
-
-
-
-
-
diff --git a/application/configs/united.plugin.xml b/application/configs/united.plugin.xml
index acb0ebeb..0256ed90 100644
--- a/application/configs/united.plugin.xml
+++ b/application/configs/united.plugin.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/application/core/authentication.iControl.php b/application/core/authentication.iControl.php
deleted file mode 100644
index f8dfffc7..00000000
--- a/application/core/authentication.iControl.php
+++ /dev/null
@@ -1,103 +0,0 @@
- 'none', 0 => 'superadmin', 1 => 'admin', 2 => 'operator', 3 => 'all');
-
- /**
- * Private properties
- */
- private $iControl = null;
-
- private $config = null;
-
- /**
- * Construct authentication manager
- */
- public function __construct($iControl) {
- $this->iControl = $iControl;
-
- // Load config
- $this->config = Tools::loadConfig('authentication.iControl.xml');
- }
-
- /**
- * Check if the player has enough rights
- *
- * @param string $login
- * @param string $defaultRight
- * @param string $neededRight
- * @return bool
- */
- public function checkRight($login, $neededRight) {
- $right = $this->getRights($login);
- return $this->compareRights($right, $neededRight);
- }
-
- /**
- * Compare if the rights are enough
- *
- * @param string $hasRight
- * @param string $neededRight
- * @return bool
- */
- public function compareRights($hasRight, $neededRight) {
- if (!in_array($hasRight, $this->RIGHTS_LEVELS) || !in_array($neededRight, $this->RIGHTS_LEVELS)) {
- return false;
- }
- $hasLevel = array_search($hasRight, $this->RIGHTS_LEVELS);
- $neededLevel = array_search($neededRight, $this->RIGHTS_LEVELS);
- if ($hasLevel > $neededLevel) {
- return false;
- }
- else {
- return true;
- }
- }
-
- /**
- * Get rights of the given login
- *
- * @param string $login
- * @param string $defaultRights
- * @return string
- */
- public function getRights($login, $defaultRight = 'all') {
- $groups = $this->config->xpath('//login[text()="' . $login . '"]/..');
- if (empty($groups)) return $defaultRight;
- $right = $defaultRight;
- $rightLevel = array_search($right, $this->RIGHTS_LEVELS);
- foreach ($groups as $group) {
- $level = array_search($group->getName(), $this->RIGHTS_LEVELS);
- if ($level === false) continue;
- if ($level < $rightLevel || $rightLevel === false) {
- $right = $group->getName();
- $rightLevel = $level;
- }
- }
- return $right;
- }
-
- /**
- * Sends an error message to the login
- *
- * @param string $login
- */
- public function sendNotAllowed($login) {
- if (!$this->iControl->chat->sendError('You do not have the required rights to perform this command!', $login)) {
- trigger_error("Couldn't send forbidden message to login '" . $login . "'. " . $this->iControl->getClientErrorText());
- }
- }
-}
-
-?>
diff --git a/application/core/callbacks.iControl.php b/application/core/callbacks.iControl.php
deleted file mode 100644
index 87c4c9b0..00000000
--- a/application/core/callbacks.iControl.php
+++ /dev/null
@@ -1,191 +0,0 @@
-iControl = $iControl;
-
- // Init values
- $this->last1Second = time();
- $this->last5Second = time();
- $this->last1Minute = time();
- $this->last3Minute = time();
- }
-
- /**
- * Perform OnInit callback
- */
- public function onInit() {
- // On init callback
- $this->triggerCallback(self::CB_IC_ONINIT, array(self::CB_IC_ONINIT));
-
- // Simulate begin map
- $map = $this->iControl->server->getMap();
- if ($map) {
- $this->triggerCallback(self::CB_IC_BEGINMAP, array(self::CB_IC_BEGINMAP, array($map)));
- }
- }
-
- /**
- * Handles the given array of callbacks
- */
- public function handleCallbacks() {
- // Perform iControl callbacks
- if ($this->last1Second <= time() - 1) {
- $this->last1Second = time();
-
- // 1 second
- $this->triggerCallback(self::CB_IC_1_SECOND, array(self::CB_IC_1_SECOND));
-
- if ($this->last5Second <= time() - 5) {
- $this->last5Second = time();
-
- // 5 second
- $this->triggerCallback(self::CB_IC_5_SECOND, array(self::CB_IC_5_SECOND));
-
- if ($this->last1Minute <= time() - 60) {
- $this->last1Minute = time();
-
- // 1 minute
- $this->triggerCallback(self::CB_IC_1_MINUTE, array(self::CB_IC_1_MINUTE));
-
- if ($this->last3Minute <= time() - 180) {
- $this->last3Minute = time();
-
- // 3 minute
- $this->triggerCallback(self::CB_IC_3_MINUTE, array(self::CB_IC_3_MINUTE));
- }
- }
- }
- }
-
- // Get server callbacks
- if (!$this->iControl->client) return;
- $this->iControl->client->resetError();
- $this->iControl->client->readCB();
- $callbacks = $this->iControl->client->getCBResponses();
- if (!is_array($callbacks) || $this->iControl->client->isError()) {
- trigger_error("Error reading server callbacks. " . $this->iControl->getClientErrorText());
- return;
- }
-
- // Handle callbacks
- foreach ($callbacks as $index => $callback) {
- $callbackName = $callback[0];
- switch ($callbackName) {
- case self::CB_MP_BEGINMAP:
- {
- // Map begin
- $this->triggerCallback($callbackName, $callback);
- $this->triggerCallback(self::CB_IC_BEGINMAP, $callback);
- break;
- }
- case self::CB_MP_ENDMAP:
- {
- // Map end
- $this->triggerCallback($callbackName, $callback);
- $this->triggerCallback(self::CB_IC_ENDMAP, $callback);
- break;
- }
- default:
- {
- $this->triggerCallback($callbackName, $callback);
- break;
- }
- }
- }
- }
-
- /**
- * Trigger a specific callback
- *
- * @param string $callbackName
- * @param mixed $data
- */
- public function triggerCallback($callbackName, $data) {
- if (!array_key_exists($callbackName, $this->callbackHandlers) || !is_array($this->callbackHandlers[$callbackName])) return;
- foreach ($this->callbackHandlers[$callbackName] as $handler) {
- call_user_func(array($handler[0], $handler[1]), $data);
- }
- }
-
- /**
- * Add a new callback handler
- */
- public function registerCallbackHandler($callback, $handler, $method) {
- if (!is_object($handler) || !method_exists($handler, $method)) {
- trigger_error("Given handler can't handle callback '" . $callback . "' (no method '" . $method . "')!");
- return;
- }
- if (!array_key_exists($callback, $this->callbackHandlers) || !is_array($this->callbackHandlers[$callback])) {
- // Init callback handler array
- $this->callbackHandlers[$callback] = array();
- }
- // Register callback handler
- array_push($this->callbackHandlers[$callback], array($handler, $method));
- }
-}
-
-?>
diff --git a/application/core/chat.iControl.php b/application/core/chat.iControl.php
deleted file mode 100644
index e5df2af3..00000000
--- a/application/core/chat.iControl.php
+++ /dev/null
@@ -1,85 +0,0 @@
-';
-
- /**
- * Construct iControl chat
- */
- public function __construct($iControl) {
- $this->iControl = $iControl;
-
- // Load config
- $this->config = Tools::loadConfig('chat.iControl.xml');
- }
-
- /**
- * Send a chat message to the given login
- *
- * @param string $login
- * @param string $message
- * @param bool $prefix
- */
- public function sendChat($message, $login = null, $prefix = false) {
- if (!$this->iControl->client) return false;
- if ($login === null) {
- return $this->iControl->client->query('ChatSendServerMessage', ($prefix ? $this->prefix : '') . $message);
- }
- else {
- return $this->iControl->client->query('ChatSendServerMessageToLogin', ($prefix ? $this->prefix : '') . $message, $login);
- }
- }
-
- /**
- * Send an information message to the given login
- *
- * @param string $login
- * @param string $message
- * @param bool $prefix
- */
- public function sendInformation($message, $login = null, $prefix = false) {
- $format = (string) $this->config->messages->information;
- return $this->sendChat($format . $message, $login);
- }
-
- /**
- * Send a success message to the given login
- *
- * @param string $message
- * @param string $login
- * @param bool $prefix
- */
- public function sendSuccess($message, $login = null, $prefix = false) {
- $format = (string) $this->config->messages->success;
- return $this->sendChat($format . $message, $login);
- }
-
- /**
- * Send an error message to the given login
- *
- * @param string $login
- * @param string $message
- * @param bool $prefix
- */
- public function sendError($message, $login = null, $prefix = false) {
- $format = (string) $this->config->messages->error;
- return $this->sendChat($format . $message, $login);
- }
-}
-
-?>
diff --git a/application/core/core.iControl.php b/application/core/core.iControl.php
deleted file mode 100644
index 7c35b0f4..00000000
--- a/application/core/core.iControl.php
+++ /dev/null
@@ -1,348 +0,0 @@
-config = Tools::loadConfig('core.iControl.xml');
- $this->startTime = time();
-
- // Load chat tool
- $this->chat = new Chat($this);
-
- // Load callbacks handler
- $this->callbacks = new Callbacks($this);
-
- // Load database
- $this->database = new Database($this);
-
- // Load server
- $this->server = new Server($this);
-
- // Load authentication
- $this->authentication = new Authentication($this);
-
- // Load commands handler
- $this->commands = new Commands($this);
-
- // Load stats manager
- $this->stats = new Stats($this);
-
- // Register for core callbacks
- $this->callbacks->registerCallbackHandler(Callbacks::CB_MP_ENDMAP, $this, 'handleEndMap');
- }
-
- /**
- * Return message composed of client error message and error code
- *
- * @param object $client
- * @return string
- */
- public function getClientErrorText($client = null) {
- if (is_object($client)) {
- return $client->getErrorMessage() . ' (' . $client->getErrorCode() . ')';
- }
- return $this->client->getErrorMessage() . ' (' . $this->client->getErrorCode() . ')';
- }
-
- /**
- * Quit iControl and log the given message
- */
- public function quit($message = false) {
- if ($this->shutdownRequested) return;
-
- if ($this->client) {
- // Announce quit
- $this->chat->sendInformation('iControl shutting down.');
-
- // Hide manialinks
- $this->client->query('SendHideManialinkPage');
- }
-
- // Log quit reason
- if ($message) {
- error_log($message);
- }
-
- // Shutdown
- if ($this->client) $this->client->Terminate();
-
- error_log("Quitting iControl!");
- exit();
- }
-
- /**
- * Run iControl
- */
- public function run($debug = false) {
- error_log('Starting iControl v' . self::VERSION . '!');
- $this->debug = (bool) $debug;
-
- // Load plugins
- $this->loadPlugins();
-
- // Connect to server
- $this->connect();
-
- // Loading finished
- error_log("Loading completed!");
-
- // Announce iControl
- if (!$this->chat->sendInformation('iControl v' . self::VERSION . ' successfully started!')) {
- trigger_error("Couldn't announce iControl. " . $this->iControl->getClientErrorText());
- }
-
- // OnInit
- $this->callbacks->onInit();
-
- // Main loop
- while (!$this->shutdownRequested) {
- $loopStart = microtime(true);
-
- // Disable script timeout
- set_time_limit(30);
-
- // Handle server callbacks
- $this->callbacks->handleCallbacks();
-
- // Loop plugins
- foreach ($this->plugins as $plugin) {
- if (!method_exists($plugin, 'loop')) {
- continue;
- }
- $plugin->loop();
- }
-
- // Yield for next tick
- $loopEnd = microtime(true);
- $sleepTime = 300000 - $loopEnd + $loopStart;
- if ($sleepTime > 0) {
- usleep($sleepTime);
- }
- }
-
- // Shutdown
- $this->client->Terminate();
- }
-
- /**
- * Connect to ManiaPlanet server
- */
- private function connect() {
- $enable = $this->server->config->xpath('enable');
- $enable = Tools::toBool($enable[0]);
- if (!$enable) return;
-
- // Load remote client
- $this->client = new \IXR_ClientMulticall_Gbx();
-
- $host = $this->server->config->xpath('host');
- if (!$host) trigger_error("Invalid server configuration (host).", E_USER_ERROR);
- $host = (string) $host[0];
- $port = $this->server->config->xpath('port');
- if (!$host) trigger_error("Invalid server configuration (port).", E_USER_ERROR);
- $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 . "...");
-
- // Connect
- if (!$this->client->InitWithIp($host, $port, $timeout)) {
- trigger_error(
- "Couldn't connect to server! " . $this->client->getErrorMessage() . "(" . $this->client->getErrorCode() . ")",
- E_USER_ERROR);
- }
-
- $login = $this->server->config->xpath('login');
- if (!$login) trigger_error("Invalid server configuration (login).", E_USER_ERROR);
- $login = (string) $login[0];
- $pass = $this->server->config->xpath('pass');
- if (!$pass) trigger_error("Invalid server configuration (password).", E_USER_ERROR);
- $pass = (string) $pass[0];
-
- // Authenticate
- if (!$this->client->query('Authenticate', $login, $pass)) {
- trigger_error(
- "Couldn't authenticate on server with user '" . $login . "'! " . $this->client->getErrorMessage() . "(" .
- $this->client->getErrorCode() . ")", E_USER_ERROR);
- }
-
- // Enable callback system
- if (!$this->client->query('EnableCallbacks', true)) {
- trigger_error("Couldn't enable callbacks! " . $this->client->getErrorMessage() . "(" . $this->client->getErrorCode() . ")",
- E_USER_ERROR);
- }
-
- // Wait for server to be ready
- if (!$this->server->waitForStatus($this->client, 4)) {
- trigger_error("Server couldn't get ready!", E_USER_ERROR);
- }
-
- // Set api version
- if (!$this->client->query('SetApiVersion', self::API_VERSION)) {
- trigger_error(
- "Couldn't set API version '" . self::API_VERSION . "'! This might cause problems. " .
- $this->iControl->getClientErrorText());
- }
-
- // Connect finished
- error_log("Server connection succesfully established!");
-
- // Enable service announces
- if (!$this->client->query("DisableServiceAnnounces", false)) {
- trigger_error("Couldn't enable service announces. " . $this->iControl->getClientErrorText());
- }
-
- // Enable script callbacks if needed
- if ($this->server->getGameMode() === 0) {
- if (!$this->client->query('GetModeScriptSettings')) {
- trigger_error("Couldn't get mode script settings. " . $this->iControl->getClientErrorText());
- }
- else {
- $scriptSettings = $this->client->getResponse();
- if (array_key_exists('S_UseScriptCallbacks', $scriptSettings)) {
- $scriptSettings['S_UseScriptCallbacks'] = true;
- if (!$this->client->query('SetModeScriptSettings', $scriptSettings)) {
- trigger_error(
- "Couldn't set mode script settings to enable script callbacks. " . $this->iControl->getClientErrorText());
- }
- else {
- error_log("Script callbacks successfully enabled.");
- }
- }
- }
- }
- }
-
- /**
- * Load iControl plugins
- */
- private function loadPlugins() {
- $pluginsConfig = Tools::loadConfig('plugins.iControl.xml');
- if (!$pluginsConfig || !isset($pluginsConfig->plugin)) {
- trigger_error('Invalid plugins config.');
- return;
- }
-
- // Load plugin classes
- $classes = get_declared_classes();
- foreach ($pluginsConfig->xpath('plugin') as $plugin) {
- $fileName = ICONTROL . '/plugins/' . $plugin;
- if (!file_exists($fileName)) {
- trigger_error("Couldn't load plugin '" . $plugin . "'! File doesn't exist. (/plugins/" . $plugin . ")");
- }
- else {
- require_once $fileName;
- error_log("Loading plugin: " . $plugin);
- }
- }
- $plugins = array_diff(get_declared_classes(), $classes);
-
- // Create plugins
- foreach ($plugins as $plugin) {
- $nameIndex = stripos($plugin, 'plugin');
- if ($nameIndex === false) continue;
- array_push($this->plugins, new $plugin($this));
- }
- }
-
- /**
- * Handle EndMap callback
- */
- public function handleEndMap($callback) {
- // Autosave match settings
- $autosaveMatchsettings = $this->config->xpath('autosave_matchsettings');
- if ($autosaveMatchsettings) {
- $autosaveMatchsettings = (string) $autosaveMatchsettings[0];
- if ($autosaveMatchsettings) {
- if (!$this->client->query('SaveMatchSettings', 'MatchSettings/' . $autosaveMatchsettings)) {
- trigger_error("Couldn't autosave match settings. " . $this->iControl->getClientErrorText());
- }
- }
- }
- }
-
- /**
- * Check config settings
- */
- public function checkConfig($config, $settings, $name = 'Config XML') {
- if (!is_array($settings)) $settings = array($settings);
- foreach ($settings as $setting) {
- $settingTags = $config->xpath('//' . $setting);
- if (empty($settingTags)) {
- trigger_error("Missing property '" . $setting . "' in config '" . $name . "'!", E_USER_ERROR);
- }
- }
- }
-}
-
-?>
diff --git a/application/core/database.iControl.php b/application/core/database.iControl.php
deleted file mode 100644
index 4e231c6b..00000000
--- a/application/core/database.iControl.php
+++ /dev/null
@@ -1,401 +0,0 @@
-iControl = $iControl;
-
- // Load config
- $this->config = Tools::loadConfig('database.iControl.xml');
- $this->iControl->checkConfig($this->config, array("host", "user"), 'database.iControl.xml');
-
- // Get mysql server information
- $host = $this->config->xpath('host');
- if (!$host) trigger_error("Invalid database configuration (host).", E_USER_ERROR);
- $host = (string) $host[0];
-
- $port = $this->config->xpath('port');
- if (!$port) trigger_error("Invalid database configuration (port).", E_USER_ERROR);
- $port = (int) $port[0];
-
- $user = $this->config->xpath('user');
- if (!$user) trigger_error("Invalid database configuration (user).", E_USER_ERROR);
- $user = (string) $user[0];
-
- $pass = $this->config->xpath('pass');
- if (!$pass) trigger_error("Invalid database configuration (pass).", E_USER_ERROR);
- $pass = (string) $pass[0];
-
- // Open database connection
- $this->mysqli = new \mysqli($host, $user, $pass, null, $port);
- if ($this->mysqli->connect_error) {
- // Connection error
- throw new \Exception(
- "Error on connecting to mysql server. " . $this->mysqli->connect_error . " (" . $this->mysqli->connect_errno . ")");
- }
-
- // Set charset
- $this->mysqli->set_charset("utf8");
-
- // Create/Connect database
- $this->initDatabase();
-
- // Init tables
- $this->initTables();
-
- // Register for callbacks
- $this->iControl->callbacks->registerCallbackHandler(Callbacks::CB_IC_5_SECOND, $this, 'handle5Second');
- $this->iControl->callbacks->registerCallbackHandler(Callbacks::CB_IC_BEGINMAP, $this, 'handleBeginMap');
- }
-
- /**
- * Destruct database connection
- */
- public function __destruct() {
- $this->mysqli->close();
- }
-
- /**
- * Connect to the defined database (create it if needed)
- */
- private function initDatabase() {
- $dbname = $this->config->xpath('database');
- if (!$dbname) trigger_error("Invalid database configuration (database).", E_USER_ERROR);
- $dbname = (string) $dbname[0];
-
- // Try to connect
- $result = $this->mysqli->select_db($dbname);
- if (!$result) {
- // Create database
- $query = "CREATE DATABASE `" . $this->escape($dbname) . "`;";
- $result = $this->mysqli->query($query);
- if (!$result) {
- trigger_error(
- "Couldn't create database '" . $dbname . "'. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')',
- E_USER_ERROR);
- }
- else {
- // Connect to database
- $result = $this->mysqli->select_db($dbname);
- if (!$result) {
- trigger_error(
- "Couldn't select database '" . $dbname . "'. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')',
- E_USER_ERROR);
- }
- }
- }
- }
-
- /**
- * Create the needed tables
- */
- private function initTables() {
- $query = "";
-
- // Players table
- $query .= "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLAYERS . "` (
- `index` int(11) NOT NULL AUTO_INCREMENT,
- `Login` varchar(100) NOT NULL,
- `NickName` varchar(250) NOT NULL,
- `PlayerId` int(11) NOT NULL,
- `LadderRanking` int(11) NOT NULL,
- `Flags` varchar(50) NOT NULL,
- `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- PRIMARY KEY (`index`),
- UNIQUE KEY `Login` (`Login`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Store player metadata' AUTO_INCREMENT=1;";
-
- // Maps table
- $query .= "CREATE TABLE IF NOT EXISTS `ic_maps` (
- `index` int(11) NOT NULL AUTO_INCREMENT,
- `UId` varchar(100) NOT NULL,
- `Name` varchar(100) NOT NULL,
- `FileName` varchar(200) NOT NULL,
- `Author` varchar(150) NOT NULL,
- `Environnement` varchar(50) NOT NULL,
- `Mood` varchar(50) NOT NULL,
- `BronzeTime` int(11) NOT NULL DEFAULT '-1',
- `SilverTime` int(11) NOT NULL DEFAULT '-1',
- `GoldTime` int(11) NOT NULL DEFAULT '-1',
- `AuthorTime` int(11) NOT NULL DEFAULT '-1',
- `CopperPrice` int(11) NOT NULL DEFAULT '-1',
- `LapRace` tinyint(1) NOT NULL,
- `NbLaps` int(11) NOT NULL DEFAULT '-1',
- `NbCheckpoints` int(11) NOT NULL DEFAULT '-1',
- `MapType` varchar(100) NOT NULL,
- `MapStyle` varchar(100) NOT NULL,
- `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- PRIMARY KEY (`index`),
- UNIQUE KEY `UId` (`UId`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Store map metadata' AUTO_INCREMENT=1;";
-
- // Perform queries
- if (!$this->multiQuery($query)) {
- trigger_error("Creating basic tables failed. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')', E_USER_ERROR);
- }
-
- // Optimize all existing tables
- $query = "SHOW TABLES;";
- $result = $this->query($query);
- if (!$result || !is_object($result)) {
- trigger_error("Couldn't select tables. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
- }
- else {
- $query = "OPTIMIZE TABLE ";
- $count = $result->num_rows;
- $index = 0;
- while ($row = $result->fetch_row()) {
- $query .= "`" . $row[0] . "`";
- if ($index < $count - 1) $query .= ", ";
- $index++;
- }
- $query .= ";";
- if (!$this->query($query)) {
- trigger_error("Couldn't optimize tables. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
- }
- }
- }
-
- /**
- * Wrapper for performing a simple query
- *
- * @param string $query
- * @return mixed query result
- */
- public function query($query) {
- if (!is_string($query)) return false;
- if (strlen($query) <= 0) return true;
- return $this->mysqli->query($query);
- }
-
- /**
- * Perform multi query
- *
- * @param
- * string multi_query
- * @return bool whether no error occured during executing the multi query
- */
- public function multiQuery($query) {
- if (!is_string($query)) return false;
- if (strlen($query) <= 0) return true;
- $noError = true;
- $this->mysqli->multi_query($query);
- if ($this->mysqli->error) {
- trigger_error("Executing multi query failed. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
- $noError = false;
- }
- while ($this->mysqli->more_results() && $this->mysqli->next_result()) {
- if ($this->mysqli->error) {
- trigger_error("Executing multi query failed. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
- $noError = false;
- }
- }
- return $noError;
- }
-
- /**
- * Handle 5Second callback
- */
- public function handle5Second($callback = null) {
- // Save current players in database
- $players = $this->iControl->server->getPlayers();
- if ($players) {
- $query = "";
- foreach ($players as $player) {
- if (!Tools::isPlayer($player)) continue;
- $query .= $this->composeInsertPlayer($player);
- }
- $this->multiQuery($query);
- }
- }
-
- /**
- * Handle BeginMap callback
- */
- public function handleBeginMap($callback) {
- $map = $callback[1][0];
- $query = $this->composeInsertMap($map);
- $result = $this->query($query);
- if ($this->mysqli->error) {
- trigger_error("Couldn't save map. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
- }
- }
-
- /**
- * Get the player index for the given login
- *
- * @param string $login
- * @return int null
- */
- public function getPlayerIndex($login) {
- $query = "SELECT `index` FROM `" . self::TABLE_PLAYERS . "` WHERE `Login` = '" . $this->escape($login) . "';";
- $result = $this->query($query);
- $result = $result->fetch_assoc();
- if ($result) {
- return $result['index'];
- }
- return null;
- }
-
- /**
- * Get the map index for the given UId
- *
- * @param string $uid
- * @return int null
- */
- public function getMapIndex($uid) {
- $query = "SELECT `index` FROM `" . self::TABLE_MAPS . "` WHERE `UId` = '" . $this->escape($uid) . "';";
- $result = $this->query($query);
- $result = $result->fetch_assoc();
- if ($result) {
- return $result['index'];
- }
- return null;
- }
-
- /**
- * Compose a query string for inserting the given player
- *
- * @param array $player
- */
- private function composeInsertPlayer($player) {
- if (!Tools::isPlayer($player)) return "";
- return "INSERT INTO `" . self::TABLE_PLAYERS . "` (
- `Login`,
- `NickName`,
- `PlayerId`,
- `LadderRanking`,
- `Flags`
- ) VALUES (
- '" . $this->escape($player['Login']) . "',
- '" . $this->escape($player['NickName']) . "',
- " . $player['PlayerId'] . ",
- " . $player['LadderRanking'] . ",
- '" . $this->escape($player['Flags']) . "'
- ) ON DUPLICATE KEY UPDATE
- `NickName` = VALUES(`NickName`),
- `PlayerId` = VALUES(`PlayerId`),
- `LadderRanking` = VALUES(`LadderRanking`),
- `Flags` = VALUES(`Flags`);";
- }
-
- /**
- * Compose a query string for inserting the given map
- *
- * @param array $map
- */
- private function composeInsertMap($map) {
- if (!$map) return "";
- return "INSERT INTO `" . self::TABLE_MAPS . "` (
- `UId`,
- `Name`,
- `FileName`,
- `Author`,
- `Environnement`,
- `Mood`,
- `BronzeTime`,
- `SilverTime`,
- `GoldTime`,
- `AuthorTime`,
- `CopperPrice`,
- `LapRace`,
- `NbLaps`,
- `NbCheckpoints`,
- `MapType`,
- `MapStyle`
- ) VALUES (
- '" . $this->escape($map['UId']) . "',
- '" . $this->escape($map['Name']) . "',
- '" . $this->escape($map['FileName']) . "',
- '" . $this->escape($map['Author']) . "',
- '" . $this->escape($map['Environnement']) . "',
- '" . $this->escape($map['Mood']) . "',
- " . $map['BronzeTime'] . ",
- " . $map['SilverTime'] . ",
- " . $map['GoldTime'] . ",
- " . $map['AuthorTime'] . ",
- " . $map['CopperPrice'] . ",
- " . Tools::boolToInt($map['LapRace']) . ",
- " . $map['NbLaps'] . ",
- " . $map['NbCheckpoints'] . ",
- '" . $this->escape($map['MapType']) . "',
- '" . $this->escape($map['MapStyle']) . "'
- ) ON DUPLICATE KEY UPDATE
- `Name` = VALUES(`Name`),
- `FileName` = VALUES(`FileName`),
- `Author` = VALUES(`Author`),
- `Environnement` = VALUES(`Environnement`),
- `Mood` = VALUES(`Mood`),
- `BronzeTime` = VALUES(`BronzeTime`),
- `SilverTime` = VALUES(`SilverTime`),
- `GoldTime` = VALUES(`GoldTime`),
- `AuthorTime` = VALUES(`AuthorTime`),
- `CopperPrice` = VALUES(`CopperPrice`),
- `LapRace` = VALUES(`LapRace`),
- `NbLaps` = VALUES(`NbLaps`),
- `NbCheckpoints` = VALUES(`NbCheckpoints`),
- `MapType` = VALUES(`MapType`),
- `MapStyle` = VALUES(`MapStyle`);";
- }
-
- /**
- * Retrieve all information about the player with the given login
- */
- public function getPlayer($login) {
- if (!$login) return null;
- $query = "SELECT * FROM `" . self::TABLE_PLAYERS . "` WHERE `Login` = '" . $this->escape($login) . "';";
- $result = $this->mysqli->query($query);
- if ($this->mysqli->error || !$result) {
- trigger_error(
- "Couldn't select player with login '" . $login . "'. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
- return null;
- }
- else {
- while ($player = $result->fetch_assoc()) {
- return $player;
- }
- return null;
- }
- }
-
- /**
- * Escapes the given string for a mysql query
- *
- * @param string $string
- * @return string
- */
- public function escape($string) {
- return $this->mysqli->escape_string($string);
- }
-}
-
-?>
diff --git a/application/core/server.iControl.php b/application/core/server.iControl.php
deleted file mode 100644
index bbb20ed9..00000000
--- a/application/core/server.iControl.php
+++ /dev/null
@@ -1,381 +0,0 @@
-iControl = $iControl;
-
- // Load config
- $this->config = Tools::loadConfig('server.iControl.xml');
- $this->iControl->checkConfig($this->config, array('host', 'port', 'login', 'pass'), 'server');
-
- // Register for callbacks
- $this->iControl->callbacks->registerCallbackHandler(Callbacks::CB_IC_1_SECOND, $this, 'eachSecond');
- }
-
- /**
- * Perform actions every second
- */
- public function eachSecond() {
- // Delete cached information
- $this->players = null;
- }
-
- /**
- * Fetch game directory of the server
- *
- * @return string
- */
- public function getDataDirectory() {
- if (!$this->iControl->client->query('GameDataDirectory')) {
- trigger_error("Couldn't get data directory. " . $this->iControl->getClientErrorText());
- return null;
- }
- return $this->iControl->client->getResponse();
- }
-
- /**
- * Checks if iControl has access to the given directory (server data directory if no param)
- *
- * @param string $directory
- * @return bool
- */
- public function checkAccess($directory = null) {
- if (!$directory) {
- $directory = $this->getDataDirectory();
- }
- return is_dir($directory) && is_writable($directory);
- }
-
- /**
- * Fetch server login
- */
- public function getLogin($client = null) {
- $systemInfo = $this->getSystemInfo(false, $client);
- if (!$systemInfo) return null;
- return $systemInfo['ServerLogin'];
- }
-
- /**
- * Get detailed server info
- */
- public function getInfo($detailed = false) {
- if ($detailed) {
- $login = $this->getLogin();
- if (!$this->iControl->client->query('GetDetailedPlayerInfo', $login)) {
- trigger_error("Couldn't fetch detailed server player info. " . $this->iControl->getClientErrorText());
- return null;
- }
- }
- else {
- if (!$this->iControl->client->query('GetMainServerPlayerInfo')) {
- trigger_error("Couldn't fetch server player info. " . $this->iControl->getClientErrorText());
- return null;
- }
- }
- return $this->iControl->client->getResponse();
- }
-
- /**
- * Get server options
- */
- public function getOptions() {
- if (!$this->iControl->client->query('GetServerOptions')) {
- trigger_error("Couldn't fetch server options. " . $this->iControl->getClientErrorText());
- return null;
- }
- return $this->iControl->client->getResponse();
- }
-
- /**
- * Fetch server name
- */
- public function getName() {
- if (!$this->iControl->client->query('GetServerName')) {
- trigger_error("Couldn't fetch server name. " . $this->iControl->getClientErrorText());
- return null;
- }
- return $this->iControl->client->getResponse();
- }
-
- /**
- * Fetch server version
- */
- public function getVersion($forceRefresh = false) {
- if (isset($this->iControl->client->version) && !$forceRefresh) return $this->iControl->client->version;
- if (!$this->iControl->client->query('GetVersion')) {
- trigger_error("Couldn't fetch server version. " . $this->iControl->getClientErrorText());
- return null;
- }
- else {
- $this->iControl->client->version = $this->iControl->client->getResponse();
- return $this->iControl->client->version;
- }
- }
-
- /**
- * Fetch server system info
- */
- public function getSystemInfo($forceRefresh = false, &$client = null) {
- if (!$this->iControl->client && !$client) return null;
- if (!$client) $client = $this->iControl->client;
- if (isset($client->systemInfo) && !$forceRefresh) return $client->systemInfo;
- if (!$client->query('GetSystemInfo')) {
- trigger_error("Couldn't fetch server system info. " . $this->iControl->getClientErrorText($client));
- return null;
- }
- else {
- $client->systemInfo = $client->getResponse();
- return $client->systemInfo;
- }
- }
-
- /**
- * Fetch network status
- */
- public function getNetworkStats($forceRefresh = false) {
- if (isset($this->iControl->client->networkStats) && !$forceRefresh) return $this->iControl->client->networkStats;
- if (!$this->iControl->client->query('GetNetworkStats')) {
- trigger_error("Couldn't fetch network stats. " . $this->iControl->getClientErrorText());
- return null;
- }
- else {
- $this->iControl->client->networkStats = $this->iControl->client->getResponse();
- return $this->iControl->client->networkStats;
- }
- }
-
- /**
- * Fetch current game mode
- *
- * @param bool $stringValue
- * @param int $parseValue
- * @return int | string
- */
- public function getGameMode($stringValue = false, $parseValue = null) {
- if (is_int($parseValue)) {
- $gameMode = $parseValue;
- }
- else {
- if (!$this->iControl->client->query('GetGameMode')) {
- trigger_error("Couldn't fetch current game mode. " . $this->iControl->getClientErrorText());
- return null;
- }
- $gameMode = $this->iControl->client->getResponse();
- }
- if ($stringValue) {
- switch ($gameMode) {
- case 0:
- {
- return 'Script';
- }
- case 1:
- {
- return 'Rounds';
- }
- case 2:
- {
- return 'TimeAttack';
- }
- case 3:
- {
- return 'Team';
- }
- case 4:
- {
- return 'Laps';
- }
- case 5:
- {
- return 'Cup';
- }
- case 6:
- {
- return 'Stunts';
- }
- default:
- {
- return 'Unknown';
- }
- }
- }
- return $gameMode;
- }
-
- /**
- * Fetch player info
- *
- * @param string $login
- * @return struct
- */
- public function getPlayer($login, $detailed = false) {
- if (!$login) return null;
- $command = ($detailed ? 'GetDetailedPlayerInfo' : 'GetPlayerInfo');
- if (!$this->iControl->client->query($command, $login)) {
- trigger_error("Couldn't player info for '" . $login . "'. " . $this->iControl->getClientErrorText());
- return null;
- }
- return $this->iControl->client->getResponse();
- }
-
- /**
- * Fetch all players
- */
- public function getPlayers(&$client = null, &$purePlayers = null, &$pureSpectators = null) {
- if (!$this->iControl->client && !$client) return null;
- if (!$client) $client = $this->iControl->client;
- $fetchLength = 30;
- $offset = 0;
- $players = array();
- if (!is_array($purePlayers)) $purePlayers = array();
- if (!is_array($pureSpectators)) $pureSpectators = array();
- $tries = 0;
- while ($tries < 10) {
- if (!$client->query('GetPlayerList', $fetchLength, $offset)) {
- trigger_error("Couldn't get player list. " . $this->iControl->getClientErrorText($client));
- $tries++;
- }
- else {
- $chunk = $client->getResponse();
- $count = count($chunk);
- $serverLogin = $this->getLogin($client);
- for ($index = 0; $index < $count; $index++) {
- $login = $chunk[$index]['Login'];
- if ($login === $serverLogin) {
- // Ignore server
- unset($chunk[$index]);
- }
- else {
- if ($chunk[$index]['SpectatorStatus'] > 0) {
- // Pure spectator
- array_push($pureSpectators, $chunk[$index]);
- }
- else {
- // Pure player
- array_push($purePlayers, $chunk[$index]);
- }
- }
- }
- $players = array_merge($players, $chunk);
- $offset += $count;
- if ($count < $fetchLength) break;
- }
- }
- return $players;
- }
-
- /**
- * Retrieve validation replay for given login
- *
- * @param string $login
- * @return string
- */
- public function getValidationReplay($login) {
- if (!$login) return null;
- if (!$this->iControl->client->query('GetValidationReplay', $login)) {
- trigger_error("Couldn't get validation replay of '" . $login . "'. " . $this->iControl->getClientErrorText());
- return null;
- }
- return $this->iControl->client->getResponse();
- }
-
- public function getGhostReplay($login) {
- $dataDir = $this->getDataDirectory();
- if (!$this->checkAccess($dataDir)) {
- return null;
- }
-
- // Build file name
- $map = $this->getMap();
- $gameMode = $this->getGameMode();
- $time = time();
- $fileName = 'Ghost.' . $login . '.' . $gameMode . '.' . $time . '.' . $map['UId'] . '.Replay.Gbx';
-
- // Save ghost replay
- if (!$this->iControl->client->query('SaveBestGhostsReplay', $login, self::GHOSTREPLAYDIR . $fileName)) {
- trigger_error("Couldn't save ghost replay. " . $this->iControl->getClientErrorText());
- return null;
- }
-
- // Load replay file
- $ghostReplay = file_get_contents($dataDir . 'Replays/' . self::GHOSTREPLAYDIR . $fileName);
- if (!$ghostReplay) {
- trigger_error("Couldn't retrieve saved ghost replay.");
- return null;
- }
- return $ghostReplay;
- }
-
- /**
- * Fetch current map
- */
- public function getMap() {
- if (!$this->iControl->client) return null;
- if (!$this->iControl->client->query('GetCurrentMapInfo')) {
- trigger_error("Couldn't fetch map info. " . $this->iControl->getClientErrorText());
- return null;
- }
- return $this->iControl->client->getResponse();
- }
-
- /**
- * Waits for the server to have the given status
- */
- public function waitForStatus($client, $statusCode = 4) {
- $client->query('GetStatus');
- $response = $client->getResponse();
- // Check if server reached given status
- if ($response['Code'] === 4) return true;
- // Server not yet in given status -> Wait for it...
- $waitBegin = time();
- $timeoutTags = $this->iControl->config->xpath('timeout');
- $maxWaitTime = (!empty($timeoutTags) ? (int) $timeoutTags[0] : 20);
- $lastStatus = $response['Name'];
- error_log("Waiting for server to reach status " . $statusCode . "...");
- error_log("Current Status: " . $lastStatus);
- while ($response['Code'] !== 4) {
- sleep(1);
- $client->query('GetStatus');
- $response = $client->getResponse();
- if ($lastStatus !== $response['Name']) {
- error_log("New Status: " . $response['Name']);
- $lastStatus = $response['Name'];
- }
- if (time() - $maxWaitTime > $waitBegin) {
- // It took too long to reach the status
- trigger_error(
- "Server couldn't reach status " . $statusCode . " after " . $maxWaitTime . " seconds! " .
- $this->iControl->getClientErrorText());
- return false;
- }
- }
- return true;
- }
-}
-
-?>
diff --git a/application/core/stats.iControl.php b/application/core/stats.iControl.php
deleted file mode 100644
index 97805195..00000000
--- a/application/core/stats.iControl.php
+++ /dev/null
@@ -1,297 +0,0 @@
-iControl = $iControl;
-
- // Load config
- $this->config = Tools::loadConfig('stats.iControl.xml');
- $this->loadSettings();
-
- // Init database tables
- $this->initTables();
-
- // Register for needed callbacks
- $this->iControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_ENDMAP, $this, 'handleEndMap');
- $this->iControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCHAT, $this, 'handlePlayerChat');
- $this->iControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCONNECT, $this, 'handlePlayerConnect');
- $this->iControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERDISCONNECT, $this, 'handlePlayerDisconnect');
- $this->iControl->callbacks->registerCallbackHandler(Callbacks::CB_TM_PLAYERFINISH, $this, 'handlePlayerFinish');
- }
-
- /**
- * Create the database tables
- */
- private function initTables() {
- $query = "";
-
- // Server stats
- $query .= "CREATE TABLE IF NOT EXISTS `" . self::TABLE_STATS_SERVER . "` (
- `index` int(11) NOT NULL AUTO_INCREMENT,
- `day` date NOT NULL,
- `connectCount` int(11) NOT NULL DEFAULT '0',
- `maxPlayerCount` int(11) NOT NULL DEFAULT '0',
- `playedMaps` int(11) NOT NULL DEFAULT '0',
- `finishCount` int(11) NOT NULL DEFAULT '0',
- `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- PRIMARY KEY (`index`),
- UNIQUE KEY `day` (`day`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Stores server stats' AUTO_INCREMENT=1;";
-
- // Player stats
- $query .= "CREATE TABLE IF NOT EXISTS `" . self::TABLE_STATS_PLAYERS . "` (
- `index` int(11) NOT NULL AUTO_INCREMENT,
- `Login` varchar(100) NOT NULL,
- `playTime` int(11) NOT NULL DEFAULT '0',
- `connectCount` int(11) NOT NULL DEFAULT '0',
- `chatCount` int(11) NOT NULL DEFAULT '0',
- `finishCount` int(11) NOT NULL DEFAULT '0',
- `hitCount` int(11) NOT NULL DEFAULT '0',
- `eliminationCount` int(11) NOT NULL DEFAULT '0',
- `lastJoin` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
- `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- PRIMARY KEY (`index`),
- UNIQUE KEY `Login` (`Login`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Tracks player stats' AUTO_INCREMENT=1;";
-
- // Perform queries
- if (!$this->iControl->database->multiQuery($query)) {
- trigger_error("Creating stats tables failed.");
- }
- }
-
- /**
- * Load settings from config
- */
- private function loadSettings() {
- $this->settings = new \stdClass();
-
- $this->settings->track_server_connects = Tools::checkSetting($this->config, 'track_server_connects');
- $this->settings->track_server_max_players = Tools::checkSetting($this->config, 'track_server_max_players');
- $this->settings->track_server_played_maps = Tools::checkSetting($this->config, 'track_server_played_maps');
- $this->settings->track_server_finishes = Tools::checkSetting($this->config, 'track_server_finishes');
-
- $this->settings->track_player_connects = Tools::checkSetting($this->config, 'track_player_connects');
- $this->settings->track_player_playtime = Tools::checkSetting($this->config, 'track_player_playtime');
- $this->settings->track_player_chats = Tools::checkSetting($this->config, 'track_player_chats');
- $this->settings->track_player_finishes = Tools::checkSetting($this->config, 'track_player_finishes');
- }
-
- /**
- * Handle EndMap callback
- */
- public function handleEndMap($callback) {
- $multiquery = "";
-
- // Track played server maps
- if ($this->settings->track_server_played_maps) {
- $multiquery .= "INSERT INTO `" . self::TABLE_STATS_SERVER . "` (
- `day`,
- `playedMaps`
- ) VALUES (
- CURDATE(),
- 1
- ) ON DUPLICATE KEY UPDATE
- `playedMaps` = `playedMaps` + VALUES(`playedMaps`)
- ;";
- }
-
- // Perform query
- if (!$this->iControl->database->multiQuery($multiquery)) {
- trigger_error("Perform queries on end map failed.");
- }
- }
-
- /**
- * Handle PlayerChat callback
- */
- public function handlePlayerChat($callback) {
- if ($callback[1][0] <= 0) return;
- $multiquery = "";
- $login = $callback[1][1];
-
- // Track chats
- if ($this->settings->track_player_chats) {
- $multiquery .= "INSERT INTO `" . self::TABLE_STATS_PLAYERS . "` (
- `Login`,
- `chatCount`
- ) VALUES (
- '" . $this->iControl->database->escape($login) . "',
- 1
- ) ON DUPLICATE KEY UPDATE
- `chatCount` = `chatCount` + VALUES(`chatCount`)
- ;";
- }
-
- // Perform query
- if (!$this->iControl->database->multiQuery($multiquery)) {
- trigger_error("Perform queries on player chat failed.");
- }
- }
-
- /**
- * Handle PlayerConnect callback
- */
- public function handlePlayerConnect($callback) {
- $multiquery = "";
- $login = $callback[1][0];
-
- // Track server connect
- if ($this->settings->track_server_connects) {
- $multiquery .= "INSERT INTO `" . self::TABLE_STATS_SERVER . "` (
- `day`,
- `connectCount`
- ) VALUES (
- CURDATE(),
- 1
- ) ON DUPLICATE KEY UPDATE
- `connectCount` = `connectCount` + VALUES(`connectCount`)
- ;";
- }
-
- // Track server max players
- if ($this->settings->track_server_max_players) {
- $players = $this->iControl->server->getPlayers();
- $multiquery .= "INSERT INTO `" . self::TABLE_STATS_SERVER . "` (
- `day`,
- `maxPlayerCount`
- ) VALUES (
- CURDATE(),
- " . count($players) . "
- ) ON DUPLICATE KEY UPDATE
- `maxPlayerCount` = GREATEST(`maxPlayerCount`, VALUES(`maxPlayerCount`))
- ;";
- }
-
- // Track player connect
- if ($this->settings->track_player_connects) {
- $multiquery .= "INSERT INTO `" . self::TABLE_STATS_PLAYERS . "` (
- `Login`,
- `lastJoin`,
- `connectCount`
- ) VALUES (
- '" . $this->iControl->database->escape($login) . "',
- NOW(),
- 1
- ) ON DUPLICATE KEY UPDATE
- `lastJoin` = VALUES(`lastJoin`),
- `connectCount` = `connectCount` + VALUES(`connectCount`)
- ;";
- }
-
- // Perform query
- if (!$this->iControl->database->multiQuery($multiquery)) {
- trigger_error("Perform queries on player connect failed.");
- }
- }
-
- /**
- * Handle PlayerDisconnect callback
- */
- public function handlePlayerDisconnect($callback) {
- $multiquery = "";
- $login = $callback[1][0];
-
- // Track player playtime
- if ($this->settings->track_player_playtime) {
- $query = "SELECT `lastJoin` FROM `" . self::TABLE_STATS_PLAYERS . "`
- WHERE `Login` = '" . $this->iControl->database->escape($login) . "'
- ;";
- $result = $this->iControl->database->query($query);
- if (!$result) {
- // Error
- trigger_error("Error selecting player join time from '" . $login . "'.");
- }
- else {
- // Add play time
- while ($row = $result->fetch_object()) {
- if (!property_exists($row, 'lastJoin')) continue;
- $lastJoin = strtotime($row->lastJoin);
- $lastJoin = ($lastJoin > $this->iControl->startTime ? $lastJoin : $this->iControl->startTime);
- $multiquery .= "INSERT INTO `" . self::TABLE_STATS_PLAYERS . "` (
- `Login`,
- `playTime`
- ) VALUES (
- '" . $this->iControl->database->escape($login) . "',
- TIMESTAMPDIFF(SECOND, '" . Tools::timeToTimestamp($lastJoin) . "', NOW())
- ) ON DUPLICATE KEY UPDATE
- `playTime` = `playTime` + VALUES(`playTime`)
- ;";
- break;
- }
- }
- }
-
- // Perform query
- if (!$this->iControl->database->multiQuery($multiquery)) {
- trigger_error("Perform queries on player connect failed.");
- }
- }
-
- /**
- * Handle the PlayerFinish callback
- */
- public function handlePlayerFinish($callback) {
- if ($callback[1][0] <= 0) return;
- if ($callback[1][2] <= 0) return;
-
- $multiquery = "";
- $login = $callback[1][1];
-
- // Track server finishes
- if ($this->settings->track_server_finishes) {
- $multiquery .= "INSERT INTO `" . self::TABLE_STATS_SERVER . "` (
- `day`,
- `finishCount`
- ) VALUES (
- CURDATE(),
- 1
- ) ON DUPLICATE KEY UPDATE
- `finishCount` = `finishCount` + VALUES(`finishCount`)
- ;";
- }
-
- // Track player finishes
- if ($this->settings->track_player_finishes) {
- $multiquery .= "INSERT INTO `" . self::TABLE_STATS_PLAYERS . "` (
- `Login`,
- `finishCount`
- ) VALUES (
- '" . $this->iControl->database->escape($login) . "',
- 1
- ) ON DUPLICATE KEY UPDATE
- `finishCount` = `finishCount` + VALUES(`finishCount`)
- ;";
- }
-
- // Perform query
- if (!$this->iControl->database->multiQuery($multiquery)) {
- trigger_error("Perform queries on player finish failed.");
- }
- }
-}
-
-?>
diff --git a/application/core/tools.iControl.php b/application/core/tools.iControl.php
deleted file mode 100644
index af130eb4..00000000
--- a/application/core/tools.iControl.php
+++ /dev/null
@@ -1,240 +0,0 @@
-xpath('//' . $setting);
- if (empty($settings)) {
- return false;
- }
- else {
- foreach ($settings as $setting) {
- return self::toBool((string) $setting[0]);
- }
- }
- }
-
- /**
- * Check if the given data describes a player
- *
- * @param array $player
- * @return bool
- */
- public static function isPlayer($player) {
- if (!$player || !is_array($player)) return false;
- if (!array_key_exists('PlayerId', $player) || !is_int($player['PlayerId']) || $player['PlayerId'] <= 0) return false;
- return true;
- }
-
- /**
- * Convert the given time int to mysql timestamp
- *
- * @param int $time
- * @return string
- */
- public static function timeToTimestamp($time) {
- return date("Y-m-d H:i:s", $time);
- }
-
- /**
- * Add alignment attributes to an xml element
- *
- * @param simple_xml_element $xml
- * @param string $halign
- * @param string $valign
- */
- public static function addAlignment($xml, $halign = 'center', $valign = 'center2') {
- if (!is_object($xml) || !method_exists($xml, 'addAttribute')) return;
- if (!property_exists($xml, 'halign')) $xml->addAttribute('halign', $halign);
- if (!property_exists($xml, 'valign')) $xml->addAttribute('valign', $valign);
- }
-
- /**
- * Add translate attribute to an xml element
- *
- * @param simple_xml_element $xml
- * @param bool $translate
- */
- public static function addTranslate($xml, $translate = true) {
- if (!is_object($xml) || !method_exists($xml, 'addAttribute')) return;
- if (!property_exists($xml, 'translate')) $xml->addAttribute('translate', ($translate ? 1 : 0));
- }
-
- /**
- * Load a remote file
- *
- * @param string $url
- * @return string || null
- */
- public static function loadFile($url) {
- if (!$url) return false;
- $urlData = parse_url($url);
- $port = (isset($urlData['port']) ? $urlData['port'] : 80);
-
- $fsock = fsockopen($urlData['host'], $port);
- stream_set_timeout($fsock, 3);
-
- $query = 'GET ' . $urlData['path'] . ' HTTP/1.0' . PHP_EOL;
- $query .= 'Host: ' . $urlData['host'] . PHP_EOL;
- $query .= 'Content-Type: UTF-8' . PHP_EOL;
- $query .= 'User-Agent: iControl v' . iControl::VERSION . PHP_EOL;
- $query .= PHP_EOL;
-
- fwrite($fsock, $query);
-
- $buffer = '';
- $info = array('timed_out' => false);
- while (!feof($fsock) && !$info['timed_out']) {
- $buffer .= fread($fsock, 1024);
- $info = stream_get_meta_data($fsock);
- }
- fclose($fsock);
-
- if ($info['timed_out'] || !$buffer) {
- return null;
- }
- if (substr($buffer, 9, 3) != "200") {
- return null;
- }
-
- $result = explode("\r\n\r\n", $buffer, 2);
-
- if (count($result) < 2) {
- return null;
- }
-
- return $result[1];
- }
-
- /**
- * Formats the given time (milliseconds)
- *
- * @param int $time
- * @return string
- */
- public static function formatTime($time) {
- if (!is_int($time)) $time = (int) $time;
- $milliseconds = $time % 1000;
- $seconds = floor($time / 1000);
- $minutes = floor($seconds / 60);
- $hours = floor($minutes / 60);
- $minutes -= $hours * 60;
- $seconds -= $hours * 60 + $minutes * 60;
- $format = ($hours > 0 ? $hours . ':' : '');
- $format .= ($hours > 0 && $minutes < 10 ? '0' : '') . $minutes . ':';
- $format .= ($seconds < 10 ? '0' : '') . $seconds . ':';
- $format .= ($milliseconds < 100 ? '0' : '') . ($milliseconds < 10 ? '0' : '') . $milliseconds;
- return $format;
- }
-
- /**
- * Convert given data to real boolean
- *
- * @param
- * mixed data
- */
- public static function toBool($var) {
- if ($var === true) return true;
- if ($var === false) return false;
- if ($var === null) return false;
- if (is_object($var)) {
- $var = (string) $var;
- }
- if (is_int($var)) {
- return ($var > 0);
- }
- else if (is_string($var)) {
- $text = strtolower($var);
- if ($text === 'true' || $text === 'yes') {
- return true;
- }
- else if ($text === 'false' || $text === 'no') {
- return false;
- }
- else {
- return ((int) $text > 0);
- }
- }
- else {
- return (bool) $var;
- }
- }
-
- /**
- * Converts the given boolean to an int representation
- *
- * @param bool $bool
- * @return int
- */
- public static function boolToInt($bool) {
- return ($bool ? 1 : 0);
- }
-
- /**
- * Build new simple xml element
- *
- * @param string $name
- * @param string $id
- * @return \SimpleXMLElement
- */
- public static function newManialinkXml($id = null) {
- $xml = new \SimpleXMLElement('');
- $xml->addAttribute('version', '1');
- if ($id) $xml->addAttribute('id', $id);
- return $xml;
- }
-
- /**
- * Load config xml-file
- *
- * @param string $fileName
- * @return \SimpleXMLElement
- */
- public static function loadConfig($fileName) {
- // Load config file from configs folder
- $fileLocation = ICONTROL . '/configs/' . $fileName;
- if (!file_exists($fileLocation)) {
- trigger_error("Config file doesn't exist! (" . $fileName . ")", E_USER_ERROR);
- }
- return simplexml_load_file($fileLocation);
- }
-
- /**
- * Send the given manialink to players
- *
- * @param string $manialink
- * @param array $logins
- */
- public static function sendManialinkPage($client, $manialink, $logins = null, $timeout = 0, $hideOnClick = false) {
- if (!$client || !$manialink) return;
- if (!$logins) {
- // Send manialink to all players
- $client->query('SendDisplayManialinkPage', $manialink, $timeout, $hideOnClick);
- }
- else if (is_array($logins)) {
- // Send manialink to players
- foreach ($logins as $login) {
- $client->query('SendDisplayManialinkPageToLogin', $login, $manialink, $timeout, $hideOnClick);
- }
- }
- else if (is_string($logins)) {
- // Send manialink to player
- $client->query('SendDisplayManialinkPageToLogin', $logins, $manialink, $timeout, $hideOnClick);
- }
- }
-}
-
-?>
diff --git a/application/iControl.bat b/application/iControl.bat
deleted file mode 100644
index c52e833d..00000000
--- a/application/iControl.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-REM set the path to your php.exe here
-START "" /B "D:\Programme\xampp\php\php.exe" -f "iControl.php" 2>&1
diff --git a/application/iControl.php b/application/iControl.php
deleted file mode 100644
index a06dcc28..00000000
--- a/application/iControl.php
+++ /dev/null
@@ -1,26 +0,0 @@
-run(true);
-
-?>
diff --git a/application/iControl.sh b/application/iControl.sh
deleted file mode 100644
index 352ae1e6..00000000
--- a/application/iControl.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-php iControl.php 2>&1 &
-echo $! > iControl.pid
diff --git a/application/plugins/chatlog.plugin.php b/application/plugins/chatlog.plugin.php
index 86caced0..405176d8 100644
--- a/application/plugins/chatlog.plugin.php
+++ b/application/plugins/chatlog.plugin.php
@@ -1,9 +1,9 @@
iControl = $iControl;
+ public function __construct($mControl) {
+ $this->mControl = $mControl;
// Load config
$this->config = Tools::loadConfig('chatlog.plugin.xml');
@@ -51,7 +51,7 @@ class Plugin_Chatlog {
// File name
$fileName = (string) $this->config->filename;
- $this->settings->fileName = ICONTROL . '/' . $fileName;
+ $this->settings->fileName = mControl . '/' . $fileName;
// log_server_messages
$log_server_messages = $this->config->xpath('log_server_messages');
@@ -77,7 +77,7 @@ class Plugin_Chatlog {
* @param string $login
*/
private function logText($text, $login = null) {
- $message = date(iControl::DATE) . '>> ' . ($login ? $login . ': ' : '') . $text . PHP_EOL;
+ $message = date(mControl::DATE) . '>> ' . ($login ? $login . ': ' : '') . $text . PHP_EOL;
file_put_contents($this->settings->fileName, $message, FILE_APPEND);
}
}
diff --git a/application/plugins/karma.plugin.php b/application/plugins/karma.plugin.php
index ff11aeb3..a08c7d85 100644
--- a/application/plugins/karma.plugin.php
+++ b/application/plugins/karma.plugin.php
@@ -1,9 +1,9 @@
iControl = $iControl;
+ public function __construct($mControl) {
+ $this->mControl = $mControl;
// Load config
$this->config = Tools::loadConfig('karma.plugin.xml');
@@ -72,7 +72,7 @@ class Plugin_Karma {
}
/**
- * Handle OnInit iControl callback
+ * Handle OnInit mControl callback
*
* @param array $callback
*/
@@ -82,7 +82,7 @@ class Plugin_Karma {
}
/**
- * Handle iControl BeginMap callback
+ * Handle mControl BeginMap callback
*
* @param array $callback
*/
diff --git a/application/plugins/obstacle.plugin.php b/application/plugins/obstacle.plugin.php
index 85ba29ee..1a178d06 100644
--- a/application/plugins/obstacle.plugin.php
+++ b/application/plugins/obstacle.plugin.php
@@ -1,9 +1,9 @@
iControl = $iControl;
+ public function __construct($mControl) {
+ $this->mControl = $mControl;
// Load config
$this->config = Tools::loadConfig('obstacle.plugin.xml');
diff --git a/application/plugins/plugin.iControl.php b/application/plugins/plugin.iControl.php
deleted file mode 100644
index 81cb6767..00000000
--- a/application/plugins/plugin.iControl.php
+++ /dev/null
@@ -1,37 +0,0 @@
-iControl = $iControl;
-
- error_log('Pugin v' . self::VERSION . ' ready!');
- }
-
- /**
- * Perform actions during each loop
- */
- public function loop() {
- }
-}
-
-?>
diff --git a/application/plugins/records.plugin.php b/application/plugins/records.plugin.php
index 206e9cfb..5726dc89 100644
--- a/application/plugins/records.plugin.php
+++ b/application/plugins/records.plugin.php
@@ -1,6 +1,6 @@
iControl = $iControl;
+ public function __construct($mControl) {
+ $this->mControl = $mControl;
// Load config
$this->config = Tools::loadConfig('records.plugin.xml');
@@ -123,7 +123,7 @@ class Plugin_Records {
}
/**
- * Handle iControl init
+ * Handle mControl init
*/
public function handleOnInit($callback = null) {
// Let manialinks update
@@ -255,8 +255,8 @@ class Plugin_Records {
$serverVersion = $this->iControl->server->getVersion();
$serverData['ServerVersion'] = $serverVersion['Version'];
$serverData['ServerBuild'] = $serverVersion['Build'];
- $serverData['Tool'] = 'iControl';
- $serverData['Version'] = iControl::VERSION;
+ $serverData['Tool'] = 'mControl';
+ $serverData['Version'] = mControl::VERSION;
$this->dedimaniaData['serverData'] = $serverData;
}
@@ -267,7 +267,7 @@ class Plugin_Records {
$header .= 'Accept-Encoding: gzip;' . PHP_EOL;
$header .= 'Content-Type: text/xml; charset=utf-8;' . PHP_EOL;
$header .= 'Keep-Alive: 300;' . PHP_EOL;
- $header .= 'User-Agent: iControl v' . iControl::VERSION . ';' . PHP_EOL;
+ $header .= 'User-Agent: mControl v' . mControl::VERSION . ';' . PHP_EOL;
$this->dedimaniaData['header'] = $header;
}
diff --git a/application/plugins/united.plugin.php b/application/plugins/united.plugin.php
index 543bab36..90c2dda2 100644
--- a/application/plugins/united.plugin.php
+++ b/application/plugins/united.plugin.php
@@ -1,6 +1,6 @@
iControl = $iControl;
+ public function __construct($mControl) {
+ $this->mControl = $mControl;
// Load config
$this->config = Tools::loadConfig('united.plugin.xml');
@@ -78,7 +78,7 @@ class Plugin_United {
}
/**
- * Handle iControl OnInit callback
+ * Handle mControl OnInit callback
*
* @param array $callback
*/
@@ -303,7 +303,7 @@ class Plugin_United {
}
// Build manialink url
- $manialink = 'icontrol?favorite';
+ $manialink = 'mControl?favorite';
foreach ($serverLogins as $serverLogin) {
$manialink .= '&' . $serverLogin;
}
@@ -478,9 +478,9 @@ class Plugin_United {
}
// Set api version
- if (!$client->query('SetApiVersion', iControl::API_VERSION)) {
+ if (!$client->query('SetApiVersion', mControl::API_VERSION)) {
trigger_error(
- "Couldn't set API version '" . iControl::API_VERSION . "'! This might cause problems. " .
+ "Couldn't set API version '" . mControl::API_VERSION . "'! This might cause problems. " .
$this->iControl->getClientErrorText($client));
}
diff --git a/application/readme.txt b/application/readme.txt
index ae1e74b0..32d9d8d0 100644
--- a/application/readme.txt
+++ b/application/readme.txt
@@ -1,6 +1,6 @@
**********************************************
* *
-* iControl ManiaPlanet Server Control *
+* mControl ManiaPlanet Server Control *
* Written by steeffeen *
* Contact: mail@steeffeen.com *
* *
@@ -12,30 +12,30 @@ SETUP:
2. Configure the needed settings:
- 2.1 Open the file 'configs/server.iControl.xml'.
+ 2.1 Open the file 'configs/server.mControl.xml'.
Enter your maniaplanet server information.
- 2.2 Open the file 'configs/database.iControl.xml'
+ 2.2 Open the file 'configs/database.mControl.xml'
Enter your mysql server information or disable database usage if you don't have a mysql server available.
- 2.3 Open the file 'configs/authentication.iControl.xml'.
- Add the player logins who should have access to the commands of iControl.
+ 2.3 Open the file 'configs/authentication.mControl.xml'.
+ Add the player logins who should have access to the commands of mControl.
-3. (Optional) Enable or disable the available plugins in the file 'configs/plugins.iControl.xml'.
+3. (Optional) Enable or disable the available plugins in the file 'configs/plugins.mControl.xml'.
-4. (Optional) Edit the other config files in 'configs/' in order to customize your iControl to fit your needs.
+4. (Optional) Edit the other config files in 'configs/' in order to customize your mControl to fit your needs.
-5. Run the tool via the shell script 'iControl.sh' (UNIX) or the batch file 'iControl.bat' (Windows)
+5. Run the tool via the shell script 'mControl.sh' (UNIX) or the batch file 'mControl.bat' (Windows)
6. Enjoy!
INFORMATION:
-- iControl is only tested on UNIX machines
+- mControl is only tested on UNIX machines
- even though it might run properly on Windows I 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 iControl under Windows
- - in order to run iControl under Windows you have to alter the file iControl.bat and enter the path to your php.exe
+ - furthermore I can't promise that there won't be a feature in the future that makes it impossible to run mControl under Windows
+ - in order to run mControl under Windows you have to alter the file mControl.bat and enter the path to your php.exe
- Tests were performed using PHP Version 5.4
- If you notice problems with other version please let me know