- removed unnecessary files
- cleaned up database class - plugin and plugin handler class - improved player and player handler classes - other cleanup and improvements
This commit is contained in:
		| @@ -3,4 +3,4 @@ REM Set the path to your php.exe here | |||||||
| set phpPath="D:\Programme\xampp\php\php.exe" | set phpPath="D:\Programme\xampp\php\php.exe" | ||||||
|  |  | ||||||
| REM Start ManiaControl | REM Start ManiaControl | ||||||
| START "" /B %phpPath% -f "ManiaControl.php" 2>&1 | START "" /B %phpPath% -f "startManiaControl.php" 2>&1 | ||||||
|   | |||||||
| @@ -1,3 +1,3 @@ | |||||||
| #!/bin/sh | #!/bin/sh | ||||||
| php ManiaControl.php 2>&1 & | php startManiaControl.php 2>&1 & | ||||||
| echo $! > ManiaControl.pid | echo $! > ManiaControl.pid | ||||||
|   | |||||||
| @@ -1,14 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <!-- Configure the chatlog plugin --> |  | ||||||
| <chatlog-config> |  | ||||||
|  |  | ||||||
| 	<!-- Enable plugin --> |  | ||||||
| 	<enabled>true</enabled> |  | ||||||
|  |  | ||||||
| 	<!-- Filename for the chatlog --> |  | ||||||
| 	<filename>chat.log</filename> |  | ||||||
|  |  | ||||||
| 	<!-- Log server messages --> |  | ||||||
| 	<log_server_messages>true</log_server_messages> |  | ||||||
|  |  | ||||||
| </chatlog-config> |  | ||||||
| @@ -7,10 +7,10 @@ | |||||||
| 	<port>3306</port> | 	<port>3306</port> | ||||||
| 
 | 
 | ||||||
| 	<!-- MySQL User --> | 	<!-- MySQL User --> | ||||||
| 	<user>steff</user> | 	<user>maniacontrol</user> | ||||||
| 	<pass>kjhgvhbjnfih2394ugnjk</pass> | 	<pass>kjhgvhbjnfih2394ugnjk</pass> | ||||||
| 
 | 
 | ||||||
| 	<!-- Database Name --> | 	<!-- Database Name --> | ||||||
| 	<database>steff_united</database> | 	<database>maniacontrol_dev</database> | ||||||
| 
 | 
 | ||||||
| </database-config> | </database-config> | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <!-- Configure the karma plugin --> |  | ||||||
| <karma-plugin-config> |  | ||||||
|  |  | ||||||
| 	<!-- Enable the plugin --> |  | ||||||
| 	<enabled>true</enabled> |  | ||||||
|  |  | ||||||
| 	<!-- Title --> |  | ||||||
| 	<title>Map Voting</title> |  | ||||||
|  |  | ||||||
| 	<!-- Position --> |  | ||||||
| 	<pos_x>92</pos_x> |  | ||||||
| 	<pos_y>83</pos_y> |  | ||||||
|  |  | ||||||
| </karma-plugin-config> |  | ||||||
| @@ -1,11 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <!-- Configure the obstacle plugin --> |  | ||||||
| <obstacle-config> |  | ||||||
|  |  | ||||||
| 	<!-- Enable/Disable the whole plugin --> |  | ||||||
| 	<enabled>true</enabled> |  | ||||||
|  |  | ||||||
| 	<!-- Set right level needed for jumps --> |  | ||||||
| 	<jumps_rightlevel>operator</jumps_rightlevel> |  | ||||||
|  |  | ||||||
| </obstacle-config> |  | ||||||
| @@ -1,13 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <!-- Configure which plugins should be loaded --> |  | ||||||
| <plugins-config> |  | ||||||
| 	<!-- <plugin>FILENAME1</plugin> <plugin>FILENAME2</plugin> |  | ||||||
|  |  | ||||||
| 	<plugin>chatlog.plugin.php</plugin> |  | ||||||
| 	<plugin>karma.plugin.php</plugin> |  | ||||||
| 	<plugin>records.plugin.php</plugin> |  | ||||||
| 	<plugin>united.plugin.php</plugin>--> |  | ||||||
|  |  | ||||||
| 	<!-- <plugin>obstacle.plugin.php</plugin> --> |  | ||||||
|  |  | ||||||
| </plugins-config> |  | ||||||
| @@ -1,67 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <!-- Configure the records plugin --> |  | ||||||
| <records-config> |  | ||||||
|  |  | ||||||
| 	<!-- Enable/Disable the whole plugin --> |  | ||||||
| 	<enabled>true</enabled> |  | ||||||
|  |  | ||||||
| 	<!-- Configure local records --> |  | ||||||
| 	<local_records> |  | ||||||
| 		<enabled>true</enabled> |  | ||||||
|  |  | ||||||
| 		<!-- Define how many records per map are saved --> |  | ||||||
| 		<count>200</count> |  | ||||||
|  |  | ||||||
| 		<!-- Define the widget --> |  | ||||||
| 		<widget> |  | ||||||
| 			<enabled>true</enabled> |  | ||||||
| 			<pos_x>-139</pos_x> |  | ||||||
| 			<pos_y>65</pos_y> |  | ||||||
| 			<title>Local Records</title> |  | ||||||
| 			<width>40</width> |  | ||||||
| 			<lines>25</lines> |  | ||||||
| 			<line_height>4</line_height> |  | ||||||
| 		</widget> |  | ||||||
|  |  | ||||||
| 	</local_records> |  | ||||||
|  |  | ||||||
| 	<!-- Configure dedimania records --> |  | ||||||
| 	<dedimania_records> |  | ||||||
| 		<enabled>true</enabled> |  | ||||||
|  |  | ||||||
| 		<!-- Define your dedimania account (http://dedimania.net/tm2stats/?do=register) --> |  | ||||||
| 		<account> |  | ||||||
| 			<login>steff_test</login> |  | ||||||
| 			<code>468a0a185c</code> |  | ||||||
| 		</account> |  | ||||||
| 		<account> |  | ||||||
| 			<login>nsa_dev</login> |  | ||||||
| 			<code>3c20cbc737</code> |  | ||||||
| 		</account> |  | ||||||
| 		<account> |  | ||||||
| 			<login>united_canyon</login> |  | ||||||
| 			<code>703d080ddd</code> |  | ||||||
| 		</account> |  | ||||||
| 		<account> |  | ||||||
| 			<login>united_stadium</login> |  | ||||||
| 			<code>067b0d0017</code> |  | ||||||
| 		</account> |  | ||||||
| 		<account> |  | ||||||
| 			<login>united_valley</login> |  | ||||||
| 			<code>37ed993fe1</code> |  | ||||||
| 		</account> |  | ||||||
|  |  | ||||||
| 		<!-- Define the widget --> |  | ||||||
| 		<widget> |  | ||||||
| 			<enabled>true</enabled> |  | ||||||
| 			<pos_x>139</pos_x> |  | ||||||
| 			<pos_y>60</pos_y> |  | ||||||
| 			<title>Dedimania</title> |  | ||||||
| 			<width>40</width> |  | ||||||
| 			<lines>20</lines> |  | ||||||
| 			<line_height>4</line_height> |  | ||||||
| 		</widget> |  | ||||||
|  |  | ||||||
| 	</dedimania_records> |  | ||||||
|  |  | ||||||
| </records-config> |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <!-- Configure your maniaplanet server --> |  | ||||||
| <server-config> |  | ||||||
|  |  | ||||||
| 	<!-- Enable to use only one static server (default behavior) --> |  | ||||||
| 	<enable>true</enable> |  | ||||||
|  |  | ||||||
| 	<!-- Server connection details (Make sure that the firewall and the server config are properly configured!) --> |  | ||||||
| 	<host>144.76.158.111</host> |  | ||||||
| 	<host>localhost</host> |  | ||||||
| 	<port>21003</port> |  | ||||||
|  |  | ||||||
| 	<!-- XmlRpc login details --> |  | ||||||
| 	<login>SuperAdmin</login> |  | ||||||
| 	<pass>dtcfvgubhnjomkjnbhv</pass> |  | ||||||
|  |  | ||||||
| </server-config> |  | ||||||
| @@ -1,119 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <!-- Configure the United plugin --> |  | ||||||
| <!-- Note: You should disable the config server.ManiaControl.xml while using this plugin --> |  | ||||||
| <united-config> |  | ||||||
|  |  | ||||||
| 	<!-- Enable the whole plugin --> |  | ||||||
| 	<enabled>false</enabled> |  | ||||||
|  |  | ||||||
| 	<!-- Configure the server order (Random or as defined in the xml) --> |  | ||||||
| 	<random_order>false</random_order> |  | ||||||
|  |  | ||||||
| 	<!-- Define the mode that should be running on all the server --> |  | ||||||
| 	<!-- Rounds (1), TimeAttack (2), Team (3), Laps (4), Cup (5), Stunts (6) --> |  | ||||||
| 	<mode>2</mode> |  | ||||||
|  |  | ||||||
| 	<!-- Whether game server should be hidden from the browser --> |  | ||||||
| 	<hide_game_server>false</hide_game_server> |  | ||||||
|  |  | ||||||
| 	<!-- Set lobby status for lobby server --> |  | ||||||
| 	<set_lobby_status>true</set_lobby_status> |  | ||||||
|  |  | ||||||
| 	<!-- Define the game server --> |  | ||||||
| 	<gameserver> |  | ||||||
|  |  | ||||||
| 		<!-- Define the join/spec password for game server --> |  | ||||||
| 		<password>a</password> |  | ||||||
|  |  | ||||||
| 		<!-- Template --> |  | ||||||
| 		<!-- <server> --> |  | ||||||
| 		<!-- <host>ip</host> --> |  | ||||||
| 		<!-- <port>5000</port> --> |  | ||||||
| 		<!-- <login>SuperAdmin</login> --> |  | ||||||
| 		<!-- <pass>SuperAdmin</pass> --> |  | ||||||
| 		<!-- </server> --> |  | ||||||
|  |  | ||||||
| 		<!-- Canyon --> |  | ||||||
| 		<server> |  | ||||||
| 			<host>144.76.158.111</host> |  | ||||||
| 			<port>21013</port> |  | ||||||
| 			<login>SuperAdmin</login> |  | ||||||
| 			<pass>dtcfvgubhnjomkjnbhv</pass> |  | ||||||
| 		</server> |  | ||||||
|  |  | ||||||
| 		<!-- Stadium --> |  | ||||||
| 		<server> |  | ||||||
| 			<host>144.76.158.111</host> |  | ||||||
| 			<port>21033</port> |  | ||||||
| 			<login>SuperAdmin</login> |  | ||||||
| 			<pass>dtcfvgubhnjomkjnbhv</pass> |  | ||||||
| 		</server> |  | ||||||
|  |  | ||||||
| 		<!-- Valley --> |  | ||||||
| 		<server> |  | ||||||
| 			<host>144.76.158.111</host> |  | ||||||
| 			<port>21053</port> |  | ||||||
| 			<login>SuperAdmin</login> |  | ||||||
| 			<pass>dtcfvgubhnjomkjnbhv</pass> |  | ||||||
| 		</server> |  | ||||||
|  |  | ||||||
| 	</gameserver> |  | ||||||
|  |  | ||||||
| 	<!-- Define lobbies --> |  | ||||||
| 	<lobbies> |  | ||||||
|  |  | ||||||
| 		<!-- Define the join/spec password for lobbies --> |  | ||||||
| 		<password>a</password> |  | ||||||
|  |  | ||||||
| 		<!-- Template --> |  | ||||||
| 		<!-- <server> --> |  | ||||||
| 		<!-- <host>ip</host> --> |  | ||||||
| 		<!-- <port>5000</port> --> |  | ||||||
| 		<!-- <login>SuperAdmin</login> --> |  | ||||||
| 		<!-- <pass>SuperAdmin</pass> --> |  | ||||||
| 		<!-- </server> --> |  | ||||||
|  |  | ||||||
| 		<!-- Canyon --> |  | ||||||
| 		<server> |  | ||||||
| 			<host>144.76.158.111</host> |  | ||||||
| 			<port>21023</port> |  | ||||||
| 			<login>SuperAdmin</login> |  | ||||||
| 			<pass>dtcfvgubhnjomkjnbhv</pass> |  | ||||||
| 		</server> |  | ||||||
|  |  | ||||||
| 		<!-- Stadium --> |  | ||||||
| 		<server> |  | ||||||
| 			<host>144.76.158.111</host> |  | ||||||
| 			<port>21043</port> |  | ||||||
| 			<login>SuperAdmin</login> |  | ||||||
| 			<pass>dtcfvgubhnjomkjnbhv</pass> |  | ||||||
| 		</server> |  | ||||||
|  |  | ||||||
| 		<!-- Valley --> |  | ||||||
| 		<server> |  | ||||||
| 			<host>144.76.158.111</host> |  | ||||||
| 			<port>21063</port> |  | ||||||
| 			<login>SuperAdmin</login> |  | ||||||
| 			<pass>dtcfvgubhnjomkjnbhv</pass> |  | ||||||
| 		</server> |  | ||||||
|  |  | ||||||
| 	</lobbies> |  | ||||||
|  |  | ||||||
| 	<!-- Configure widgets --> |  | ||||||
| 	<widgets> |  | ||||||
| 		<enabled>true</enabled> |  | ||||||
|  |  | ||||||
| 		<!-- Favorite widget --> |  | ||||||
| 		<addfavorite> |  | ||||||
| 			<enabled>true</enabled> |  | ||||||
| 			<pos_x>76</pos_x> |  | ||||||
| 			<pos_y>85.5</pos_y> |  | ||||||
| 			<width>10</width> |  | ||||||
| 			<height>10</height> |  | ||||||
| 			<!-- Enable add_all to let players add all game and lobby server to favorite with 1 click --> |  | ||||||
| 			<add_all>true</add_all> |  | ||||||
| 		</addfavorite> |  | ||||||
|  |  | ||||||
| 	</widgets> |  | ||||||
|  |  | ||||||
| </united-config> |  | ||||||
| @@ -28,7 +28,7 @@ class Authentication { | |||||||
| 		$this->mc = $mc; | 		$this->mc = $mc; | ||||||
| 		 | 		 | ||||||
| 		// Load config | 		// Load config | ||||||
| 		$this->config = Tools::loadConfig('authentication.ManiaControl.xml'); | 		$this->config = Tools::loadConfig('authentication.xml'); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
| namespace ManiaControl; | namespace ManiaControl; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Class for handling server callbacks |  * Class for handling server and controller callbacks | ||||||
|  * |  * | ||||||
|  * @author steeffeen |  * @author steeffeen | ||||||
|  */ |  */ | ||||||
| @@ -12,14 +12,14 @@ class Callbacks { | |||||||
| 	 * Constants | 	 * Constants | ||||||
| 	 */ | 	 */ | ||||||
| 	// ManiaControl callbacks | 	// ManiaControl callbacks | ||||||
| 	const CB_IC_1_SECOND = 'ManiaControl.1Second'; | 	const CB_MC_1_SECOND = 'ManiaControl.1Second'; | ||||||
| 	const CB_IC_5_SECOND = 'ManiaControl.5Second'; | 	const CB_MC_5_SECOND = 'ManiaControl.5Second'; | ||||||
| 	const CB_IC_1_MINUTE = 'ManiaControl.1Minute'; | 	const CB_MC_1_MINUTE = 'ManiaControl.1Minute'; | ||||||
| 	const CB_IC_3_MINUTE = 'ManiaControl.3Minute'; | 	const CB_MC_3_MINUTE = 'ManiaControl.3Minute'; | ||||||
| 	const CB_IC_ONINIT = 'ManiaControl.OnInit'; | 	const CB_MC_ONINIT = 'ManiaControl.OnInit'; | ||||||
| 	const CB_IC_CLIENTUPDATED = 'ManiaControl.ClientUpdated'; | 	const CB_MC_CLIENTUPDATED = 'ManiaControl.ClientUpdated'; | ||||||
| 	const CB_IC_BEGINMAP = 'ManiaControl.BeginMap'; | 	const CB_MC_BEGINMAP = 'ManiaControl.BeginMap'; | ||||||
| 	const CB_IC_ENDMAP = 'ManiaControl.EndMap'; | 	const CB_MC_ENDMAP = 'ManiaControl.EndMap'; | ||||||
| 	// ManiaPlanet callbacks | 	// ManiaPlanet callbacks | ||||||
| 	const CB_MP_SERVERSTART = 'ManiaPlanet.ServerStart'; | 	const CB_MP_SERVERSTART = 'ManiaPlanet.ServerStart'; | ||||||
| 	const CB_MP_SERVERSTOP = 'ManiaPlanet.ServerStop'; | 	const CB_MP_SERVERSTOP = 'ManiaPlanet.ServerStop'; | ||||||
| @@ -45,27 +45,24 @@ class Callbacks { | |||||||
| 	const CB_TM_PLAYERCHECKPOINT = 'TrackMania.PlayerCheckpoint'; | 	const CB_TM_PLAYERCHECKPOINT = 'TrackMania.PlayerCheckpoint'; | ||||||
| 	const CB_TM_PLAYERFINISH = 'TrackMania.PlayerFinish'; | 	const CB_TM_PLAYERFINISH = 'TrackMania.PlayerFinish'; | ||||||
| 	const CB_TM_PLAYERINCOHERENCE = 'TrackMania.PlayerIncoherence'; | 	const CB_TM_PLAYERINCOHERENCE = 'TrackMania.PlayerIncoherence'; | ||||||
|  | 	 | ||||||
| 	/** | 	/** | ||||||
| 	 * Private properties | 	 * Private properties | ||||||
| 	 */ | 	 */ | ||||||
| 	private $mc = null; | 	private $maniaControl = null; | ||||||
|  |  | ||||||
| 	private $callbackHandlers = array(); | 	private $callbackHandlers = array(); | ||||||
|  |  | ||||||
| 	private $last1Second = -1; | 	private $last1Second = -1; | ||||||
|  |  | ||||||
| 	private $last5Second = -1; | 	private $last5Second = -1; | ||||||
|  |  | ||||||
| 	private $last1Minute = -1; | 	private $last1Minute = -1; | ||||||
|  |  | ||||||
| 	private $last3Minute = -1; | 	private $last3Minute = -1; | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Construct callbacks handler | 	 * Construct callbacks handler | ||||||
|  | 	 * | ||||||
|  | 	 * @param ManiaControl $maniaControl        	 | ||||||
| 	 */ | 	 */ | ||||||
| 	public function __construct($mc) { | 	public function __construct(ManiaControl $maniaControl) { | ||||||
| 		$this->mc = $mc; | 		$this->maniaControl = $maniaControl; | ||||||
| 		 | 		 | ||||||
| 		// Init values | 		// Init values | ||||||
| 		$this->last1Second = time(); | 		$this->last1Second = time(); | ||||||
| @@ -79,12 +76,12 @@ class Callbacks { | |||||||
| 	 */ | 	 */ | ||||||
| 	public function onInit() { | 	public function onInit() { | ||||||
| 		// On init callback | 		// On init callback | ||||||
| 		$this->triggerCallback(self::CB_IC_ONINIT, array(self::CB_IC_ONINIT)); | 		$this->triggerCallback(self::CB_MC_ONINIT, array(self::CB_MC_ONINIT)); | ||||||
| 		 | 		 | ||||||
| 		// Simulate begin map | 		// Simulate begin map | ||||||
| 		$map = $this->mc->server->getMap(); | 		$map = $this->maniaControl->server->getMap(); | ||||||
| 		if ($map) { | 		if ($map) { | ||||||
| 			$this->triggerCallback(self::CB_IC_BEGINMAP, array(self::CB_IC_BEGINMAP, array($map))); | 			$this->triggerCallback(self::CB_MC_BEGINMAP, array(self::CB_MC_BEGINMAP, array($map))); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -97,37 +94,39 @@ class Callbacks { | |||||||
| 			$this->last1Second = time(); | 			$this->last1Second = time(); | ||||||
| 			 | 			 | ||||||
| 			// 1 second | 			// 1 second | ||||||
| 			$this->triggerCallback(self::CB_IC_1_SECOND, array(self::CB_IC_1_SECOND)); | 			$this->triggerCallback(self::CB_MC_1_SECOND, array(self::CB_MC_1_SECOND)); | ||||||
| 			 | 			 | ||||||
| 			if ($this->last5Second <= time() - 5) { | 			if ($this->last5Second <= time() - 5) { | ||||||
| 				$this->last5Second = time(); | 				$this->last5Second = time(); | ||||||
| 				 | 				 | ||||||
| 				// 5 second | 				// 5 second | ||||||
| 				$this->triggerCallback(self::CB_IC_5_SECOND, array(self::CB_IC_5_SECOND)); | 				$this->triggerCallback(self::CB_MC_5_SECOND, array(self::CB_MC_5_SECOND)); | ||||||
| 				 | 				 | ||||||
| 				if ($this->last1Minute <= time() - 60) { | 				if ($this->last1Minute <= time() - 60) { | ||||||
| 					$this->last1Minute = time(); | 					$this->last1Minute = time(); | ||||||
| 					 | 					 | ||||||
| 					// 1 minute | 					// 1 minute | ||||||
| 					$this->triggerCallback(self::CB_IC_1_MINUTE, array(self::CB_IC_1_MINUTE)); | 					$this->triggerCallback(self::CB_MC_1_MINUTE, array(self::CB_MC_1_MINUTE)); | ||||||
| 					 | 					 | ||||||
| 					if ($this->last3Minute <= time() - 180) { | 					if ($this->last3Minute <= time() - 180) { | ||||||
| 						$this->last3Minute = time(); | 						$this->last3Minute = time(); | ||||||
| 						 | 						 | ||||||
| 						// 3 minute | 						// 3 minute | ||||||
| 						$this->triggerCallback(self::CB_IC_3_MINUTE, array(self::CB_IC_3_MINUTE)); | 						$this->triggerCallback(self::CB_MC_3_MINUTE, array(self::CB_MC_3_MINUTE)); | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		 | 		 | ||||||
| 		// Get server callbacks | 		// Get server callbacks | ||||||
| 		if (!$this->mc->client) return; | 		if (!$this->maniaControl->client) { | ||||||
| 		$this->mc->client->resetError(); | 			return; | ||||||
| 		$this->mc->client->readCB(); | 		} | ||||||
| 		$callbacks = $this->mc->client->getCBResponses(); | 		$this->maniaControl->client->resetError(); | ||||||
| 		if (!is_array($callbacks) || $this->mc->client->isError()) { | 		$this->maniaControl->client->readCB(); | ||||||
| 			trigger_error("Error reading server callbacks. " . $this->mc->getClientErrorText()); | 		$callbacks = $this->maniaControl->client->getCBResponses(); | ||||||
|  | 		if (!is_array($callbacks) || $this->maniaControl->client->isError()) { | ||||||
|  | 			trigger_error("Error reading server callbacks. " . $this->maniaControl->getClientErrorText()); | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 		 | 		 | ||||||
| @@ -139,14 +138,14 @@ class Callbacks { | |||||||
| 					{ | 					{ | ||||||
| 						// Map begin | 						// Map begin | ||||||
| 						$this->triggerCallback($callbackName, $callback); | 						$this->triggerCallback($callbackName, $callback); | ||||||
| 						$this->triggerCallback(self::CB_IC_BEGINMAP, $callback); | 						$this->triggerCallback(self::CB_MC_BEGINMAP, $callback); | ||||||
| 						break; | 						break; | ||||||
| 					} | 					} | ||||||
| 				case self::CB_MP_ENDMAP: | 				case self::CB_MP_ENDMAP: | ||||||
| 					{ | 					{ | ||||||
| 						// Map end | 						// Map end | ||||||
| 						$this->triggerCallback($callbackName, $callback); | 						$this->triggerCallback($callbackName, $callback); | ||||||
| 						$this->triggerCallback(self::CB_IC_ENDMAP, $callback); | 						$this->triggerCallback(self::CB_MC_ENDMAP, $callback); | ||||||
| 						break; | 						break; | ||||||
| 					} | 					} | ||||||
| 				default: | 				default: | ||||||
| @@ -162,12 +161,14 @@ class Callbacks { | |||||||
| 	 * Trigger a specific callback | 	 * Trigger a specific callback | ||||||
| 	 * | 	 * | ||||||
| 	 * @param string $callbackName        	 | 	 * @param string $callbackName        	 | ||||||
| 	 * @param mixed $data        	 | 	 * @param array $data        	 | ||||||
| 	 */ | 	 */ | ||||||
| 	public function triggerCallback($callbackName, $data) { | 	public function triggerCallback($callbackName, array $callback) { | ||||||
| 		if (!array_key_exists($callbackName, $this->callbackHandlers) || !is_array($this->callbackHandlers[$callbackName])) return; | 		if (!array_key_exists($callbackName, $this->callbackHandlers)) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
| 		foreach ($this->callbackHandlers[$callbackName] as $handler) { | 		foreach ($this->callbackHandlers[$callbackName] as $handler) { | ||||||
| 			call_user_func(array($handler[0], $handler[1]), $data); | 			call_user_func(array($handler[0], $handler[1]), $callback); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -176,7 +177,7 @@ class Callbacks { | |||||||
| 	 */ | 	 */ | ||||||
| 	public function registerCallbackHandler($callback, $handler, $method) { | 	public function registerCallbackHandler($callback, $handler, $method) { | ||||||
| 		if (!is_object($handler) || !method_exists($handler, $method)) { | 		if (!is_object($handler) || !method_exists($handler, $method)) { | ||||||
| 			trigger_error("Given handler can't handle callback '" . $callback . "' (no method '" . $method . "')!"); | 			trigger_error("Given handler can't handle callback '{$callback}' (no method '{$method}')!"); | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 		if (!array_key_exists($callback, $this->callbackHandlers) || !is_array($this->callbackHandlers[$callback])) { | 		if (!array_key_exists($callback, $this->callbackHandlers) || !is_array($this->callbackHandlers[$callback])) { | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ class Chat { | |||||||
| 		$this->mc = $mc; | 		$this->mc = $mc; | ||||||
| 		 | 		 | ||||||
| 		// Load config | 		// Load config | ||||||
| 		$this->config = Tools::loadConfig('chat.ManiaControl.xml'); | 		$this->config = Tools::loadConfig('chat.xml'); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| @@ -41,7 +41,8 @@ class Chat { | |||||||
| 			return $this->mc->client->query('ChatSendServerMessage', '$z' . ($prefix ? $this->prefix : '') . $message . '$z'); | 			return $this->mc->client->query('ChatSendServerMessage', '$z' . ($prefix ? $this->prefix : '') . $message . '$z'); | ||||||
| 		} | 		} | ||||||
| 		else { | 		else { | ||||||
| 			return $this->mc->client->query('ChatSendServerMessageToLogin', '$z' . ($prefix ? $this->prefix : '') . $message . '$z', $login); | 			return $this->mc->client->query('ChatSendServerMessageToLogin', '$z' . ($prefix ? $this->prefix : '') . $message . '$z',  | ||||||
|  | 					$login); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -31,10 +31,10 @@ class Commands { | |||||||
| 		$this->mc = $mc; | 		$this->mc = $mc; | ||||||
| 		 | 		 | ||||||
| 		// Load config | 		// Load config | ||||||
| 		$this->config = Tools::loadConfig('commands.ManiaControl.xml'); | 		$this->config = Tools::loadConfig('commands.xml'); | ||||||
| 		 | 		 | ||||||
| 		// Register for callbacks | 		// Register for callbacks | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_5_SECOND, $this, 'each5Seconds'); | 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MC_5_SECOND, $this, 'each5Seconds'); | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_BILLUPDATED, $this, 'handleBillUpdated'); | 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_BILLUPDATED, $this, 'handleBillUpdated'); | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCHAT, $this, 'handleChatCallback'); | 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCHAT, $this, 'handleChatCallback'); | ||||||
| 		 | 		 | ||||||
| @@ -345,7 +345,7 @@ class Commands { | |||||||
| 			$this->mc->authentication->sendNotAllowed($login); | 			$this->mc->authentication->sendNotAllowed($login); | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 		$this->mc->quit("ManiaControl shutdown requested by '" . $login . "'"); | 		$this->mc->quit("ManiaControl shutdown requested by '{$login}'"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
|   | |||||||
| @@ -11,32 +11,28 @@ class Database { | |||||||
| 	/** | 	/** | ||||||
| 	 * Constants | 	 * Constants | ||||||
| 	 */ | 	 */ | ||||||
| 	const TABLE_PLAYERS = 'ic_players'; | 	const TABLE_PLAYERS = 'mc_players'; | ||||||
| 	const TABLE_MAPS = 'ic_maps'; | 	const TABLE_MAPS = 'mc_maps'; | ||||||
|  | 	 | ||||||
| 	/** | 	/** | ||||||
| 	 * Public properties | 	 * Public properties | ||||||
| 	 */ | 	 */ | ||||||
| 	public $mysqli = null; | 	public $mysqli = null; | ||||||
|  | 	 | ||||||
| 	/** | 	/** | ||||||
| 	 * Private properties | 	 * Private properties | ||||||
| 	 */ | 	 */ | ||||||
| 	private $mc = null; | 	private $maniaControl = null; | ||||||
|  |  | ||||||
| 	private $config = null; | 	private $config = null; | ||||||
|  |  | ||||||
| 	private $multiQueries = ''; |  | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Construct database connection | 	 * Construct database connection | ||||||
| 	 */ | 	 */ | ||||||
| 	public function __construct($mc) { | 	public function __construct(ManiaControl $maniaControl) { | ||||||
| 		$this->mc = $mc; | 		$this->maniaControl = $maniaControl; | ||||||
| 		 | 		 | ||||||
| 		// Load config | 		// Load config | ||||||
| 		$this->config = Tools::loadConfig('database.ManiaControl.xml'); | 		$this->config = Tools::loadConfig('database.xml'); | ||||||
| 		$this->mc->checkConfig($this->config, array("host", "user"), 'database.ManiaControl.xml'); |  | ||||||
| 		 | 		 | ||||||
| 		// Get mysql server information | 		// Get mysql server information | ||||||
| 		$host = $this->config->xpath('host'); | 		$host = $this->config->xpath('host'); | ||||||
| @@ -58,23 +54,12 @@ class Database { | |||||||
| 		// Open database connection | 		// Open database connection | ||||||
| 		$this->mysqli = new \mysqli($host, $user, $pass, null, $port); | 		$this->mysqli = new \mysqli($host, $user, $pass, null, $port); | ||||||
| 		if ($this->mysqli->connect_error) { | 		if ($this->mysqli->connect_error) { | ||||||
| 			// Connection error | 			trigger_error($this->mysqli->connect_error, E_USER_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"); | 		$this->mysqli->set_charset("utf8"); | ||||||
| 		 | 		 | ||||||
| 		// Create/Connect database |  | ||||||
| 		$this->initDatabase(); | 		$this->initDatabase(); | ||||||
| 		 | 		$this->optimizeTables(); | ||||||
| 		// Init tables |  | ||||||
| 		$this->initTables(); |  | ||||||
| 		 |  | ||||||
| 		// Register for callbacks |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_5_SECOND, $this, 'handle5Second'); |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_BEGINMAP, $this, 'handleBeginMap'); |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| @@ -86,6 +71,8 @@ class Database { | |||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Connect to the defined database (create it if needed) | 	 * Connect to the defined database (create it if needed) | ||||||
|  | 	 * | ||||||
|  | 	 * @return bool | ||||||
| 	 */ | 	 */ | ||||||
| 	private function initDatabase() { | 	private function initDatabase() { | ||||||
| 		$dbname = $this->config->xpath('database'); | 		$dbname = $this->config->xpath('database'); | ||||||
| @@ -94,307 +81,67 @@ class Database { | |||||||
| 		 | 		 | ||||||
| 		// Try to connect | 		// Try to connect | ||||||
| 		$result = $this->mysqli->select_db($dbname); | 		$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->mc->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) { | 		if ($result) { | ||||||
| 			return $result['index']; | 			return true; | ||||||
| 		} | 		} | ||||||
| 		return null; | 		 | ||||||
| 	} | 		// Create database | ||||||
|  | 		$databaseQuery = "CREATE DATABASE ?;"; | ||||||
| 	/** | 		$databaseStatement = $this->mysqli->prepare($databaseQuery); | ||||||
| 	 * Get the map index for the given UId | 		if ($this->mysqli->error) { | ||||||
| 	 * | 			trigger_error($this->mysqli->error, E_USER_ERROR); | ||||||
| 	 * @param string $uid        	 | 			return false; | ||||||
| 	 * @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; | 		$databaseStatement->bind_param('s', $dbname); | ||||||
| 	} | 		$databaseStatement->execute(); | ||||||
|  | 		if ($databaseStatement->error) { | ||||||
| 	/** | 			trigger_error($databaseStatement->error, E_USER_ERROR); | ||||||
| 	 * Compose a query string for inserting the given player | 			return false; | ||||||
| 	 * |  | ||||||
| 	 * @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 { | 		$databaseStatement->close(); | ||||||
| 			while ($player = $result->fetch_assoc()) { | 		 | ||||||
| 				return $player; | 		// Connect to new database | ||||||
|  | 		$this->mysqli->select_db($dbname); | ||||||
|  | 		if ($this->mysqli->error) { | ||||||
|  | 			trigger_error("Couldn't select database '{$dbname}'. " . $this->mysqli->error, E_USER_ERROR); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Optimize all existing tables | ||||||
|  | 	 * | ||||||
|  | 	 * @return bool | ||||||
|  | 	 */ | ||||||
|  | 	private function optimizeTables() { | ||||||
|  | 		$showQuery = "SHOW TABLES;"; | ||||||
|  | 		$result = $this->mysqli->query($showQuery); | ||||||
|  | 		if ($this->mysqli->error) { | ||||||
|  | 			trigger_error($this->mysqli->error); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$count = $result->num_rows; | ||||||
|  | 		if ($count <= 0) { | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		$optimizeQuery = "OPTIMIZE TABLE "; | ||||||
|  | 		$index = 0; | ||||||
|  | 		while ($row = $result->fetch_row()) { | ||||||
|  | 			$tableName = $row[0]; | ||||||
|  | 			$optimizeQuery .= "`{$tableName}`"; | ||||||
|  | 			if ($index < $count - 1) { | ||||||
|  | 				$optimizeQuery .= ", "; | ||||||
| 			} | 			} | ||||||
| 			return null; | 			$index++; | ||||||
| 		} | 		} | ||||||
| 	} | 		$optimizeQuery .= ";"; | ||||||
|  | 		$this->mysqli->query($optimizeQuery); | ||||||
| 	/** | 		if ($this->mysqli->error) { | ||||||
| 	 * Escapes the given string for a mysql query | 			trigger_error($this->mysqli->error); | ||||||
| 	 * | 			return false; | ||||||
| 	 * @param string $string        	 | 		} | ||||||
| 	 * @return string | 		return true; | ||||||
| 	 */ |  | ||||||
| 	public function escape($string) { |  | ||||||
| 		return $this->mysqli->escape_string($string); |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -11,12 +11,9 @@ require_once __DIR__ . '/chat.php'; | |||||||
| require_once __DIR__ . '/commands.php'; | require_once __DIR__ . '/commands.php'; | ||||||
| require_once __DIR__ . '/database.php'; | require_once __DIR__ . '/database.php'; | ||||||
| require_once __DIR__ . '/server.php'; | require_once __DIR__ . '/server.php'; | ||||||
| require_once __DIR__ . '/stats.php'; |  | ||||||
| require_once __DIR__ . '/tools.php'; | require_once __DIR__ . '/tools.php'; | ||||||
| require_once __DIR__ . '/pluginHandler.php'; | require_once __DIR__ . '/pluginHandler.php'; | ||||||
| require_once __DIR__ . '/plugin.php'; |  | ||||||
| require_once __DIR__ . '/playerHandler.php'; | require_once __DIR__ . '/playerHandler.php'; | ||||||
| require_once __DIR__ . '/player.php'; |  | ||||||
| require_once __DIR__ . '/manialinkIdHandler.php'; | require_once __DIR__ . '/manialinkIdHandler.php'; | ||||||
| list($endiantest) = array_values(unpack('L1L', pack('V', 1))); | list($endiantest) = array_values(unpack('L1L', pack('V', 1))); | ||||||
| if ($endiantest == 1) { | if ($endiantest == 1) { | ||||||
| @@ -38,90 +35,40 @@ class ManiaControl { | |||||||
| 	const VERSION = '0.1'; | 	const VERSION = '0.1'; | ||||||
| 	const API_VERSION = '2013-04-16'; | 	const API_VERSION = '2013-04-16'; | ||||||
| 	const DATE = 'd-m-y h:i:sa T'; | 	const DATE = 'd-m-y h:i:sa T'; | ||||||
| 
 | 	 | ||||||
|     /** |  | ||||||
|      * Private properties |  | ||||||
|      */ |  | ||||||
|     private $version = 0; |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Public properties | 	 * Public properties | ||||||
| 	 */ | 	 */ | ||||||
| 	public $authentication = null; | 	public $authentication = null; | ||||||
| 
 |  | ||||||
| 	public $callbacks = null; | 	public $callbacks = null; | ||||||
| 
 |  | ||||||
| 	public $client = null; | 	public $client = null; | ||||||
| 
 |  | ||||||
| 	public $chat = null; | 	public $chat = null; | ||||||
| 
 |  | ||||||
| 	public $config = null; |  | ||||||
| 
 |  | ||||||
| 	public $commands = null; | 	public $commands = null; | ||||||
| 
 |  | ||||||
| 	public $database = null; | 	public $database = null; | ||||||
| 
 |  | ||||||
| 	public $debug = false; |  | ||||||
| 
 |  | ||||||
| 	public $server = null; | 	public $server = null; | ||||||
| 
 | 	public $manialinkIdHandler = null; | ||||||
| 	public $startTime = -1; | 	public $pluginHandler = null; | ||||||
| 
 | 	 | ||||||
| 	public $stats = null; |  | ||||||
| 
 |  | ||||||
|     public $manialinkIdHandler = null; |  | ||||||
|     public $pluginHandler = null; |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Private properties | 	 * Private properties | ||||||
| 	 */ | 	 */ | ||||||
| 	//private $plugins = array();
 |  | ||||||
| 
 |  | ||||||
| 	private $shutdownRequested = false; | 	private $shutdownRequested = false; | ||||||
|  | 	private $config = null; | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Construct ManiaControl | 	 * Construct ManiaControl | ||||||
| 	 */ | 	 */ | ||||||
| 	public function __construct() { | 	public function __construct() { | ||||||
| 		// Load core
 | 		$this->config = Tools::loadConfig('core.xml'); | ||||||
| 		$this->config = Tools::loadConfig('core.ManiaControl.xml'); |  | ||||||
| 		$this->startTime = time(); |  | ||||||
| 		 |  | ||||||
| 		// Load chat tool
 |  | ||||||
| 		$this->chat = new Chat($this); | 		$this->chat = new Chat($this); | ||||||
| 		 |  | ||||||
| 		// Load callbacks handler
 |  | ||||||
| 		$this->callbacks = new Callbacks($this); | 		$this->callbacks = new Callbacks($this); | ||||||
| 		 |  | ||||||
| 		// Load database
 |  | ||||||
| 		$this->database = new Database($this); | 		$this->database = new Database($this); | ||||||
| 		 |  | ||||||
| 		// Load server
 |  | ||||||
| 		$this->server = new Server($this); | 		$this->server = new Server($this); | ||||||
| 		 |  | ||||||
| 		// Load authentication
 |  | ||||||
| 		$this->authentication = new Authentication($this); | 		$this->authentication = new Authentication($this); | ||||||
| 
 | 		$this->playerHandler = new PlayerHandler($this); | ||||||
|         // Load playerHandler
 | 		$this->manialinkIdHandler = new ManialinkIdHandler(); | ||||||
|         $this->playerHandler = new PlayerHandler($this); |  | ||||||
| 
 |  | ||||||
|         // Load manialinkidHandler
 |  | ||||||
|         $this->manialinkIdHandler = new ManialinkIdHandler(); |  | ||||||
| 
 |  | ||||||
|         // Load pluginHandler
 |  | ||||||
|         $this->pluginHandler = new PluginHandler($this); |  | ||||||
| 
 |  | ||||||
| 		// Load commands handler
 |  | ||||||
| 		$this->commands = new Commands($this); | 		$this->commands = new Commands($this); | ||||||
| 		 | 		$this->pluginHandler = new PluginHandler($this); | ||||||
| 		// Load stats manager
 |  | ||||||
| 		$this->stats = new Stats($this); |  | ||||||
| 
 |  | ||||||
| 		// Register for core callbacks
 |  | ||||||
| 		$this->callbacks->registerCallbackHandler(Callbacks::CB_MP_ENDMAP, $this, 'handleEndMap'); |  | ||||||
| 
 |  | ||||||
|         // Set ManiaControl version
 |  | ||||||
|         $this->version = self::VERSION; |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| @@ -141,8 +88,6 @@ class ManiaControl { | |||||||
| 	 * Quit ManiaControl and log the given message | 	 * Quit ManiaControl and log the given message | ||||||
| 	 */ | 	 */ | ||||||
| 	public function quit($message = false) { | 	public function quit($message = false) { | ||||||
| 		if ($this->shutdownRequested) return; |  | ||||||
| 		 |  | ||||||
| 		if ($this->client) { | 		if ($this->client) { | ||||||
| 			// Announce quit
 | 			// Announce quit
 | ||||||
| 			$this->chat->sendInformation('ManiaControl shutting down.'); | 			$this->chat->sendInformation('ManiaControl shutting down.'); | ||||||
| @@ -157,7 +102,9 @@ class ManiaControl { | |||||||
| 		} | 		} | ||||||
| 		 | 		 | ||||||
| 		// Shutdown
 | 		// Shutdown
 | ||||||
| 		if ($this->client) $this->client->Terminate(); | 		if ($this->client) { | ||||||
|  | 			$this->client->Terminate(); | ||||||
|  | 		} | ||||||
| 		 | 		 | ||||||
| 		error_log("Quitting ManiaControl!"); | 		error_log("Quitting ManiaControl!"); | ||||||
| 		exit(); | 		exit(); | ||||||
| @@ -166,14 +113,12 @@ class ManiaControl { | |||||||
| 	/** | 	/** | ||||||
| 	 * Run ManiaControl | 	 * Run ManiaControl | ||||||
| 	 */ | 	 */ | ||||||
| 	public function run($debug = false) { | 	public function run() { | ||||||
| 		error_log('Starting ManiaControl v' . self::VERSION . '!'); | 		error_log('Starting ManiaControl v' . self::VERSION . '!'); | ||||||
| 		$this->debug = (bool) $debug; |  | ||||||
| 		 | 		 | ||||||
| 		// Load plugins
 | 		// Load plugins
 | ||||||
| 		//$this->loadPlugins();
 |  | ||||||
| 		$this->pluginHandler->loadPlugins(); | 		$this->pluginHandler->loadPlugins(); | ||||||
| 
 | 		 | ||||||
| 		// Connect to server
 | 		// Connect to server
 | ||||||
| 		$this->connect(); | 		$this->connect(); | ||||||
| 		 | 		 | ||||||
| @@ -181,14 +126,8 @@ class ManiaControl { | |||||||
| 		error_log("Loading completed!"); | 		error_log("Loading completed!"); | ||||||
| 		 | 		 | ||||||
| 		// Announce ManiaControl
 | 		// Announce ManiaControl
 | ||||||
| 		if (!$this->chat->sendInformation('ManiaControl v' . self::VERSION . ' successfully started!')) { | 		$this->chat->sendInformation('ManiaControl v' . self::VERSION . ' successfully started!'); | ||||||
| 			trigger_error("Couldn't announce ManiaControl. " . $this->getClientErrorText()); | 		 | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
|         //get PlayerList
 |  | ||||||
|         $this->client->query('GetPlayerList', 300, 0, 2); |  | ||||||
|         $this->playerHandler->addPlayerList($this->client->getResponse()); |  | ||||||
| 
 |  | ||||||
| 		// OnInit
 | 		// OnInit
 | ||||||
| 		$this->callbacks->onInit(); | 		$this->callbacks->onInit(); | ||||||
| 		 | 		 | ||||||
| @@ -202,14 +141,6 @@ class ManiaControl { | |||||||
| 			// Handle server callbacks
 | 			// Handle server callbacks
 | ||||||
| 			$this->callbacks->handleCallbacks(); | 			$this->callbacks->handleCallbacks(); | ||||||
| 			 | 			 | ||||||
| 			// Loop plugins
 |  | ||||||
| 			/*foreach ($this->plugins as $plugin) { |  | ||||||
| 				if (!method_exists($plugin, 'loop')) { |  | ||||||
| 					continue; |  | ||||||
| 				} |  | ||||||
| 				$plugin->loop(); |  | ||||||
| 			}*/ |  | ||||||
| 			 |  | ||||||
| 			// Yield for next tick
 | 			// Yield for next tick
 | ||||||
| 			$loopEnd = microtime(true); | 			$loopEnd = microtime(true); | ||||||
| 			$sleepTime = 300000 - $loopEnd + $loopStart; | 			$sleepTime = 300000 - $loopEnd + $loopStart; | ||||||
| @@ -243,13 +174,11 @@ class ManiaControl { | |||||||
| 		if (!$timeout) trigger_error("Invalid core configuration (timeout).", E_USER_ERROR); | 		if (!$timeout) trigger_error("Invalid core configuration (timeout).", E_USER_ERROR); | ||||||
| 		$timeout = (int) $timeout[0]; | 		$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, $timeout)) { | ||||||
| 			trigger_error( | 			trigger_error("Couldn't connect to server! " . $this->getClientErrorText(), E_USER_ERROR); | ||||||
| 					"Couldn't connect to server! " . $this->client->getErrorMessage() . "(" . $this->client->getErrorCode() . ")",  |  | ||||||
| 					E_USER_ERROR); |  | ||||||
| 		} | 		} | ||||||
| 		 | 		 | ||||||
| 		$login = $this->server->config->xpath('login'); | 		$login = $this->server->config->xpath('login'); | ||||||
| @@ -261,15 +190,12 @@ class ManiaControl { | |||||||
| 		 | 		 | ||||||
| 		// Authenticate
 | 		// Authenticate
 | ||||||
| 		if (!$this->client->query('Authenticate', $login, $pass)) { | 		if (!$this->client->query('Authenticate', $login, $pass)) { | ||||||
| 			trigger_error( | 			trigger_error("Couldn't authenticate on server with user '{$login}'! " . $this->getClientErrorText(), E_USER_ERROR); | ||||||
| 					"Couldn't authenticate on server with user '" . $login . "'! " . $this->client->getErrorMessage() . "(" . |  | ||||||
| 							 $this->client->getErrorCode() . ")", E_USER_ERROR); |  | ||||||
| 		} | 		} | ||||||
| 		 | 		 | ||||||
| 		// Enable callback system
 | 		// Enable callback system
 | ||||||
| 		if (!$this->client->query('EnableCallbacks', true)) { | 		if (!$this->client->query('EnableCallbacks', true)) { | ||||||
| 			trigger_error("Couldn't enable callbacks! " . $this->client->getErrorMessage() . "(" . $this->client->getErrorCode() . ")",  | 			trigger_error("Couldn't enable callbacks! " . $this->getClientErrorText(), E_USER_ERROR); | ||||||
| 					E_USER_ERROR); |  | ||||||
| 		} | 		} | ||||||
| 		 | 		 | ||||||
| 		// Wait for server to be ready
 | 		// Wait for server to be ready
 | ||||||
| @@ -280,18 +206,12 @@ class ManiaControl { | |||||||
| 		// Set api version
 | 		// Set api version
 | ||||||
| 		if (!$this->client->query('SetApiVersion', self::API_VERSION)) { | 		if (!$this->client->query('SetApiVersion', self::API_VERSION)) { | ||||||
| 			trigger_error( | 			trigger_error( | ||||||
| 					"Couldn't set API version '" . self::API_VERSION . "'! This might cause problems. " . | 					"Couldn't set API version '" . self::API_VERSION . "'! This might cause problems. " . $this->getClientErrorText()); | ||||||
| 							 $this->getClientErrorText()); |  | ||||||
| 		} | 		} | ||||||
| 		 | 		 | ||||||
| 		// Connect finished
 | 		// Connect finished
 | ||||||
| 		error_log("Server connection succesfully established!"); | 		error_log("Server connection succesfully established!"); | ||||||
| 		 | 		 | ||||||
| 		// Enable service announces
 |  | ||||||
| 		if (!$this->client->query("DisableServiceAnnounces", false)) { |  | ||||||
| 			trigger_error("Couldn't enable service announces. " . $this->getClientErrorText()); |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Enable script callbacks if needed
 | 		// Enable script callbacks if needed
 | ||||||
| 		if ($this->server->getGameMode() === 0) { | 		if ($this->server->getGameMode() === 0) { | ||||||
| 			if (!$this->client->query('GetModeScriptSettings')) { | 			if (!$this->client->query('GetModeScriptSettings')) { | ||||||
| @@ -302,8 +222,7 @@ class ManiaControl { | |||||||
| 				if (array_key_exists('S_UseScriptCallbacks', $scriptSettings)) { | 				if (array_key_exists('S_UseScriptCallbacks', $scriptSettings)) { | ||||||
| 					$scriptSettings['S_UseScriptCallbacks'] = true; | 					$scriptSettings['S_UseScriptCallbacks'] = true; | ||||||
| 					if (!$this->client->query('SetModeScriptSettings', $scriptSettings)) { | 					if (!$this->client->query('SetModeScriptSettings', $scriptSettings)) { | ||||||
| 						trigger_error( | 						trigger_error("Couldn't set mode script settings to enable script callbacks. " . $this->getClientErrorText()); | ||||||
| 								"Couldn't set mode script settings to enable script callbacks. " . $this->getClientErrorText()); |  | ||||||
| 					} | 					} | ||||||
| 					else { | 					else { | ||||||
| 						error_log("Script callbacks successfully enabled."); | 						error_log("Script callbacks successfully enabled."); | ||||||
| @@ -312,84 +231,6 @@ class ManiaControl { | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	/** |  | ||||||
| 	 * Load ManiaControl plugins |  | ||||||
| 	 */ |  | ||||||
| 	//private function loadPlugins() {
 |  | ||||||
| 	/*	$pluginsConfig = Tools::loadConfig('plugins.ManiaControl.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 = ManiaControlDir . '/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->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); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * @param mixed $version |  | ||||||
|      */ |  | ||||||
|     public function setVersion($version) |  | ||||||
|     { |  | ||||||
|         $this->version = $version; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * @return mixed |  | ||||||
|      */ |  | ||||||
|     public function getVersion() |  | ||||||
|     { |  | ||||||
|         return $this->version; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ?>
 | ?>
 | ||||||
| @@ -1,111 +1,80 @@ | |||||||
| <?php | <?php | ||||||
| /** |  | ||||||
|  * Created by PhpStorm. |  | ||||||
|  * User: Lukas |  | ||||||
|  * Date: 09.11.13 |  | ||||||
|  * Time: 19:32 |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| namespace ManiaControl; | namespace ManiaControl; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Class representing players | ||||||
|  |  * | ||||||
|  |  * @author Kremsy & Steff | ||||||
|  |  */ | ||||||
| class Player { | class Player { | ||||||
|     /** | 	/** | ||||||
|      * public properties | 	 * Public properties | ||||||
|      */ | 	 */ | ||||||
|     public $id; //Internal Id from ManiaControl | 	public $index = -1; | ||||||
|     public $pid; //Id from dedicated Server | 	public $pid = -1; | ||||||
|     public $login; | 	public $login = ''; | ||||||
|     public $nickname; | 	public $nickname = ''; | ||||||
|     public $teamname; | 	public $isFakePlayer = false; | ||||||
|     public $ip; | 	public $teamName = ''; | ||||||
|     public $client; | 	public $ip = ''; | ||||||
|     public $ipport; | 	public $ipFull = ''; | ||||||
|     public $zone; | 	public $clientVersion = ''; | ||||||
|     public $continent; | 	public $zone = ''; | ||||||
|     public $nation; | 	public $continent = ''; | ||||||
|     //public $prevstatus; | 	public $nation = ''; | ||||||
|     public $isSpectator; | 	public $isSpectator = false; | ||||||
|     public $isOfficial; | 	public $isOfficial = false; | ||||||
|     public $language; | 	public $language = ''; | ||||||
|     public $avatar; | 	public $avatar = ''; | ||||||
|     public $teamid; | 	public $teamId; // TODO: default value | ||||||
|     public $unlocked; | 	public $unlocked; // TODO: default value | ||||||
|     public $ladderrank; | 	public $ladderRank = -1; | ||||||
|     public $ladderscore; | 	public $ladderScore = -1; | ||||||
|     public $created; | 	public $created = -1; | ||||||
|  | 	public $rightLevel = 0; | ||||||
|     public $rightLevel; | 	 | ||||||
|  | 	// TODO: usefull construct player without rpc info? | ||||||
|  | 	// TODO: add all attributes like, allies, clublink ... just make vardump on rpc infos | ||||||
|     //TODO: usefull construct player without rpc info? | 	// TODO: READ ADDITIONAL INFOS FROM DATABASE | ||||||
|     //TODO: isBot properti | 	/** | ||||||
|     //TODO: add all attributes like, allies, clublink ... just make vardump on rpc infos | 	 * Construct a player | ||||||
|     //TODO: READ ADDITIONAL INFOS FROM DATABASE | 	 * | ||||||
|     public function __construct($rpc_infos = null){ | 	 * @param array $rpcInfos        	 | ||||||
|  | 	 */ | ||||||
|         if ($rpc_infos) { | 	public function __construct($rpcInfos) { | ||||||
|             $this->login = $rpc_infos['Login']; | 		$this->created = time(); | ||||||
|             $this->nickname = $rpc_infos['NickName']; | 		if (!$rpcInfos) { | ||||||
|             $this->pid = $rpc_infos['PlayerId']; | 			return; | ||||||
|             $this->teamid = $rpc_infos['TeamId']; | 		} | ||||||
|             $this->ipport = $rpc_infos['IPAddress']; | 		 | ||||||
|             $this->ip = preg_replace('/:\d+/', '', $rpc_infos['IPAddress']);  // strip port | 		$this->login = $rpcInfos['Login']; | ||||||
|             //$this->prevstatus = false; | 		$this->isFakePlayer = (stripos($this->login, '*') !== false); | ||||||
|             $this->isSpectator = $rpc_infos['IsSpectator']; | 		$this->nickname = $rpcInfos['NickName']; | ||||||
|             $this->isOfficial = $rpc_infos['IsInOfficialMode']; | 		$this->pid = $rpcInfos['PlayerId']; | ||||||
|             $this->teamname = $rpc_infos['LadderStats']['TeamName']; | 		$this->teamId = $rpcInfos['TeamId']; | ||||||
|             $this->zone = substr($rpc_infos['Path'], 6);  // strip 'World|' | 		$this->ipFull = $rpcInfos['IPAddress']; | ||||||
|             $zones = explode('|', $rpc_infos['Path']); | 		$this->ip = preg_replace('/:\d+/', '', $this->ipFull); | ||||||
|             if (isset($zones[1])) { | 		$this->isSpectator = $rpcInfos['IsSpectator']; | ||||||
|                 switch ($zones[1]) { | 		$this->isOfficial = $rpcInfos['IsInOfficialMode']; | ||||||
|                     case 'Europe': | 		$this->teamName = $rpcInfos['LadderStats']['TeamName']; | ||||||
|                     case 'Africa': | 		$this->zone = substr($rpcInfos['Path'], 6); | ||||||
|                     case 'Asia': | 		$zones = explode('|', $rpcInfos['Path']); | ||||||
|                     case 'Middle East': | 		if (isset($zones[1])) { | ||||||
|                     case 'North America': | 			if (isset($zones[2])) { | ||||||
|                     case 'South America': | 				$this->continent = $zones[1]; | ||||||
|                     case 'Oceania': | 				$this->nation = $zones[2]; | ||||||
|                         $this->continent = $zones[1]; | 			} | ||||||
|                         $this->nation = $zones[2]; | 			else { | ||||||
|                         break; | 				$this->nation = $zones[1]; | ||||||
|                     default: | 			} | ||||||
|                         $this->continent = ''; | 		} | ||||||
|                         $this->nation = $zones[1]; | 		$this->ladderRank = $rpcInfos['LadderStats']['PlayerRankings'][0]['Ranking']; | ||||||
|                 } | 		$this->ladderScore = round($rpcInfos['LadderStats']['PlayerRankings'][0]['Score'], 2); | ||||||
|             } else { | 		$this->clientVersion = $rpcInfos['ClientVersion']; | ||||||
|                 $this->continent = ''; | 		$this->language = $rpcInfos['Language']; | ||||||
|                 $this->nation = ''; | 		$this->avatar = $rpcInfos['Avatar']['FileName']; | ||||||
|             } | 	} | ||||||
|             $this->ladderrank = $rpc_infos['LadderStats']['PlayerRankings'][0]['Ranking']; |  | ||||||
|             $this->ladderscore = round($rpc_infos['LadderStats']['PlayerRankings'][0]['Score'], 2); |  | ||||||
|             $this->client = $rpc_infos['ClientVersion']; |  | ||||||
|             $this->language = $rpc_infos['Language']; |  | ||||||
|             $this->avatar = $rpc_infos['Avatar']['FileName']; |  | ||||||
|             $this->created = time(); |  | ||||||
|         } else { |  | ||||||
|             // set defaults |  | ||||||
|             $this->pid = 0; |  | ||||||
|             $this->login = ''; |  | ||||||
|             $this->nickname = ''; |  | ||||||
|             $this->ipport = ''; |  | ||||||
|             $this->ip = ''; |  | ||||||
|             //$this->prevstatus = false; |  | ||||||
|             $this->isSpectator = false; |  | ||||||
|             $this->isOfficial = false; |  | ||||||
|             $this->teamname = ''; |  | ||||||
|             $this->zone = ''; |  | ||||||
|             $this->continent = ''; |  | ||||||
|             $this->nation = ''; |  | ||||||
|             $this->ladderrank = 0; |  | ||||||
|             $this->ladderscore = 0; |  | ||||||
|             $this->created = 0; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         //rightlevels, 0 = user, 1 = operator, 2 = admin, 3 = superadmin, 4 = headadmin (from config) |  | ||||||
|         $this->rightLevel = 0; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
| @@ -1,113 +1,156 @@ | |||||||
| <?php | <?php | ||||||
| /** |  | ||||||
|  * Created by PhpStorm. |  | ||||||
|  * User: Lukas |  | ||||||
|  * Date: 09.11.13 |  | ||||||
|  * Time: 19:44 |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| namespace ManiaControl; | namespace ManiaControl; | ||||||
|  |  | ||||||
|  | require_once __DIR__ . '/player.php'; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Class playerHandler |  * Class managing players | ||||||
|  |  * | ||||||
|  * @package ManiaControl |  * @package ManiaControl | ||||||
|  */ |  */ | ||||||
| class playerHandler { | class playerHandler { | ||||||
|  | 	/** | ||||||
|  | 	 * Constants | ||||||
|  | 	 */ | ||||||
|  | 	const TABLE_PLAYERS = 'mc_players'; | ||||||
|  | 	 | ||||||
|  | 	/** | ||||||
|  | 	 * Public properties | ||||||
|  | 	 */ | ||||||
|  | 	public $rightLevels = array(0 => 'Player', 1 => 'Operator', 2 => 'Admin', 3 => 'MasterAdmin', 4 => 'Owner'); | ||||||
|  | 	 | ||||||
|  | 	/** | ||||||
|  | 	 * Private properties | ||||||
|  | 	 */ | ||||||
|  | 	private $maniaControl = null; | ||||||
|  | 	private $playerList = array(); | ||||||
|  |  | ||||||
|     /** | 	/** | ||||||
|      * Private properties | 	 * Construct player handler | ||||||
|      */ | 	 * | ||||||
|     private $playerList; | 	 * @param ManiaControl $maniaControl        	 | ||||||
|     private $mc; | 	 */ | ||||||
|  | 	public function __construct(ManiaControl $maniaControl) { | ||||||
|  | 		$this->maniaControl = $maniaControl; | ||||||
|  | 		 | ||||||
|  | 		$this->initTables(); | ||||||
|  | 		 | ||||||
|  | 		$this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MC_ONINIT, $this, 'onInit'); | ||||||
|  | 		$this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCONNECT, $this, 'playerConnect'); | ||||||
|  | 		$this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERDISCONNECT, $this, 'playerDisconnect'); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|     /** | 	/** | ||||||
|      * Public properties | 	 * Initialize all necessary tables | ||||||
|      */ | 	 * | ||||||
|     public $rightLevels = array(0 => 'Player', 1 => 'Operator', 2 => 'Admin', 3 => 'MasterAdmin', 4 => 'MasterAdmin'); | 	 * @return bool | ||||||
|  | 	 */ | ||||||
|  | 	private function initTables() { | ||||||
|  | 		$mysqli = $this->maniaControl->database->mysqli; | ||||||
|  | 		$playerTableQuery = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLAYERS . "` ( | ||||||
|  | 				`index` int(11) NOT NULL AUTO_INCREMENT, | ||||||
|  | 				`pid` int(11) NOT NULL DEFAULT '-1', | ||||||
|  | 				`login` varchar(100) COLLATE utf8_unicode_ci NOT NULL, | ||||||
|  | 				`ipFull` varchar(50) COLLATE utf8_unicode_ci NOT NULL, | ||||||
|  | 				`clientVersion` varchar(50) COLLATE utf8_unicode_ci NOT NULL, | ||||||
|  | 				`zone` varchar(150) COLLATE utf8_unicode_ci NOT NULL, | ||||||
|  | 				`language` varchar(50) COLLATE utf8_unicode_ci NOT NULL, | ||||||
|  | 				`avatar` varchar(100) COLLATE utf8_unicode_ci 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 COLLATE=utf8_unicode_ci COMMENT='Player data' AUTO_INCREMENT=1;"; | ||||||
|  | 		$playerTableStatement = $mysqli->prepare($playerTableQuery); | ||||||
|  | 		if ($mysqli->error) { | ||||||
|  | 			trigger_error($mysqli->error, E_USER_ERROR); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$playerTableStatement->execute(); | ||||||
|  | 		if ($playerTableStatement->error) { | ||||||
|  | 			trigger_error($playerTableStatement->error, E_USER_ERROR); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$playerTableStatement->close(); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|     public function __construct(ManiaControl $mc){ | 	/** | ||||||
|         $this->mc = $mc; | 	 * Handle OnInit callback | ||||||
|         $this->playerList = array(); | 	 * | ||||||
|         $this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCONNECT, $this, 'playerConnect'); | 	 * @param array $callback        	 | ||||||
|         $this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERDISCONNECT, $this, 'playerDisconnect'); | 	 */ | ||||||
|     } | 	public function onInit(array $callback) { | ||||||
|  | 		$this->maniaControl->client->query('GetPlayerList', 300, 0, 2); | ||||||
|  | 		$playerList = $this->maniaControl->client->getResponse(); | ||||||
|  | 		foreach ($playerList as $player) { | ||||||
|  | 			$callback = array(Callbacks::CB_MP_PLAYERCONNECT, array($player['Login'])); | ||||||
|  | 			$this->playerConnect($callback); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Handle playerConnect callback | ||||||
|  | 	 * | ||||||
|  | 	 * @param array $callback        	 | ||||||
|  | 	 */ | ||||||
|  | 	public function playerConnect(array $callback) { | ||||||
|  | 		$login = $callback[1][0]; | ||||||
|  | 		$this->maniaControl->client->query('GetDetailedPlayerInfo', $login); | ||||||
|  | 		$playerInfo = $this->maniaControl->client->getResponse(); | ||||||
|  | 		$player = new Player($playerInfo); | ||||||
|  | 		$this->addPlayer($player); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|     /** | 	/** | ||||||
|      * initializes a Whole PlayerList | 	 * Handle playerDisconnect callback | ||||||
|      * @param $players | 	 * | ||||||
|      */ | 	 * @param array $callback        	 | ||||||
|     public function addPlayerList($players){ | 	 */ | ||||||
|         foreach($players as $player){ | 	public function playerDisconnect(array $callback) { | ||||||
|             $this->playerConnect(array($player['Login'], '')); | 		$login = $callback[1][0]; | ||||||
|         } | 		$player = $this->removePlayer($login); | ||||||
|     } | 	} | ||||||
|     /** |  | ||||||
|      * Handles a playerConnect |  | ||||||
|      * @param $player |  | ||||||
|      */ |  | ||||||
|     public function playerConnect($player){ |  | ||||||
|         //TODO: Welcome Message?, on mc restart not all players listed, no relay support yet |  | ||||||
|         //TODO: Add Rights |  | ||||||
|         //TODO: Database |  | ||||||
|         $this->mc->client->query('GetDetailedPlayerInfo', $player[0]); |  | ||||||
|         $this->addPlayer(new Player($this->mc->client->getResponse())); |  | ||||||
|         $player = $this->playerList[$player[0]]; |  | ||||||
|         if($player->pid != 0){ //Player 0 = server |  | ||||||
|             $string = array(0 => 'New Player', 1 => 'Operator', 2 => 'Admin', 3 => 'MasterAdmin', 4 => 'MasterAdmin'); |  | ||||||
|             $this->mc->chat->sendChat('$ff0'.$string[$player->rightLevel].': '. $player->nickname . '$z $ff0Nation:$fff ' . $player->nation . ' $ff0Ladder: $fff' . $player->ladderrank); |  | ||||||
|         } |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|     /** | 	/** | ||||||
|      * Handles a playerDisconnect | 	 * Get a Player from the PlayerList | ||||||
|      * @param $player | 	 * | ||||||
|      */ | 	 * @param string $login        	 | ||||||
|     public function playerDisconnect($player){ | 	 * @return Player | ||||||
|         $player = $this->removePlayer($player[0]); | 	 */ | ||||||
|         $played = TOOLS::formatTime(time() - $player->created); | 	public function getPlayer($login) { | ||||||
|         $this->mc->chat->sendChat($player->nickname . '$z $ff0has left the game. Played:$fff ' . $played); | 		if (!isset($this->playerList[$login])) { | ||||||
|     } | 			return null; | ||||||
|  | 		} | ||||||
|  | 		return $this->playerList[$login]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Add a player to the PlayerList | ||||||
|  | 	 * | ||||||
|  | 	 * @param Player $player        	 | ||||||
|  | 	 * @return bool | ||||||
|  | 	 */ | ||||||
|  | 	private function addPlayer(Player $player) { | ||||||
|  | 		if (!$player) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$this->playerList[$player->login] = $player; | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|     /** | 	/** | ||||||
|      * Gets a Player from the Playerlist | 	 * Remove a Player from the PlayerList | ||||||
|      * @param $login | 	 * | ||||||
|      * @return null | 	 * @param string $login        	 | ||||||
|      */ | 	 * @return Player $player | ||||||
|     public function getPlayer($login){ | 	 */ | ||||||
|         if (isset($this->playerList[$login])) | 	private function removePlayer($login) { | ||||||
|             return $this->playerList[$login]; | 		if (!isset($this->playerList[$login])) { | ||||||
|         else | 			return null; | ||||||
|             return null; | 		} | ||||||
|     } | 		$player = $this->playerList[$login]; | ||||||
|  | 		unset($this->playerList[$login]); | ||||||
|     /** | 		return $player; | ||||||
|      * Adds a player to the PlayerList | 	} | ||||||
|      * @param Player $player |  | ||||||
|      * @return bool |  | ||||||
|      */ |  | ||||||
|     private function addPlayer(Player $player){ |  | ||||||
|         if($player != null){ |  | ||||||
|             $this->playerList[$player->login] = $player; |  | ||||||
|             return true; |  | ||||||
|         }else{ |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     /** |  | ||||||
|      * Removes a Player from the PlayerList |  | ||||||
|      * @param $login |  | ||||||
|      * @return Player $player |  | ||||||
|      */ |  | ||||||
|     private function removePlayer($login){ |  | ||||||
|         if(isset($this->playerList[$login])){ |  | ||||||
|             $player = $this->playerList[$login]; |  | ||||||
|             unset($this->playerList[$login]); |  | ||||||
|         } else { |  | ||||||
|             $player = null; |  | ||||||
|         } |  | ||||||
|         return $player; |  | ||||||
|     } |  | ||||||
| }  | }  | ||||||
| @@ -3,152 +3,55 @@ | |||||||
| namespace ManiaControl; | namespace ManiaControl; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Class plugin parent class for all plugins |  * Plugin parent class | ||||||
|  * |  * | ||||||
|  * @author Lukas Kremsmayr and steeffeen |  * @author Lukas Kremsmayr and steeffeen | ||||||
|  */ |  */ | ||||||
|  | abstract class Plugin { | ||||||
|  | 	 | ||||||
|  class Plugin { |  | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
|   	 * Private properties | 	 * Private properties | ||||||
|   	 */ |  | ||||||
|   	private $mc; |  | ||||||
|     private $version; |  | ||||||
|     private $author; |  | ||||||
|     private $updateUrl; |  | ||||||
|     private $name; |  | ||||||
|     private $description; |  | ||||||
|     private $active; |  | ||||||
|  |  | ||||||
|     public function __construct($mc, $name, $version = 0, $author = '', $description = '', $updateUrl = ''){ |  | ||||||
|        $this->mc = $mc; |  | ||||||
|        $this->name = $name; |  | ||||||
|        $this->version = $version; |  | ||||||
|        $this->author = $author; |  | ||||||
|        $this->description = $description; |  | ||||||
|        $this->updateUrl = $updateUrl; |  | ||||||
|  |  | ||||||
|        $this->mc->pluginHandler->registerPlugin($this); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Reserves manialinks on the ManialinkIdHandler |  | ||||||
| 	 * |  | ||||||
| 	 * @param int $count    |  | ||||||
| 	 * @return array with manialink Ids     	      	 |  | ||||||
| 	 */ | 	 */ | ||||||
|     public function reserveManialinkIds($count){ | 	protected $maniaControl; | ||||||
|        return $this->mc->manialinkIdHandler->reserveManialikIds($count); | 	protected $name; | ||||||
|     } | 	protected $version; | ||||||
|  | 	protected $author; | ||||||
|  | 	protected $description; | ||||||
|  |  | ||||||
|     public function checkUpdate(){ | 	/** | ||||||
|      | 	 * Create plugin instance | ||||||
|     } | 	 * | ||||||
|  | 	 * @param ManiaControl $maniaControl        	 | ||||||
|  | 	 */ | ||||||
|  | 	public abstract function __construct(ManiaControl $maniaControl); | ||||||
|  |  | ||||||
|      /** | 	/** | ||||||
|       * Enables the Plugin | 	 * Get plugin author | ||||||
|       */ | 	 * | ||||||
|      public function enablePlugin() | 	 * @return string | ||||||
|      { | 	 */ | ||||||
|          $this->active = true; | 	public abstract function getAuthor(); | ||||||
|      } |  | ||||||
|  |  | ||||||
|      /** | 	/** | ||||||
|       * Disable the Plugin | 	 * Get plugin version | ||||||
|       */ | 	 * | ||||||
|      public function disablePlugin() | 	 * @return float | ||||||
|      { | 	 */ | ||||||
|          $this->active = false; | 	public abstract function getVersion(); | ||||||
|      } |  | ||||||
|  |  | ||||||
|      /** | 	/** | ||||||
|       * @return mixed | 	 * Get plugin name | ||||||
|       */ | 	 * | ||||||
|      public function isActive() | 	 * @return string | ||||||
|      { | 	 */ | ||||||
|          return $this->active; | 	public abstract function getName(); | ||||||
|      } |  | ||||||
|  |  | ||||||
|      /** | 	/** | ||||||
|       * @param mixed $author | 	 * Get plugin description | ||||||
|       */ | 	 * | ||||||
|      public function setAuthor($author) | 	 * @return string | ||||||
|      { | 	 */ | ||||||
|          $this->author = $author; | 	public abstract function getDescription(); | ||||||
|      } | } | ||||||
|  |  | ||||||
|      /** | ?> | ||||||
|       * @return mixed |  | ||||||
|       */ |  | ||||||
|      public function getAuthor() |  | ||||||
|      { |  | ||||||
|          return $this->author; |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|      /** |  | ||||||
|       * @param mixed $updateUrl |  | ||||||
|       */ |  | ||||||
|      public function setUpdateUrl($updateUrl) |  | ||||||
|      { |  | ||||||
|          $this->updateUrl = $updateUrl; |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|      /** |  | ||||||
|       * @return mixed |  | ||||||
|       */ |  | ||||||
|      public function getUpdateUrl() |  | ||||||
|      { |  | ||||||
|          return $this->updateUrl; |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|      /** |  | ||||||
|       * @param mixed $version |  | ||||||
|       */ |  | ||||||
|      public function setVersion($version) |  | ||||||
|      { |  | ||||||
|          $this->version = $version; |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|      /** |  | ||||||
|       * @return mixed |  | ||||||
|       */ |  | ||||||
|      public function getVersion() |  | ||||||
|      { |  | ||||||
|          return $this->version; |  | ||||||
|      } |  | ||||||
|      /** |  | ||||||
|       * @param mixed $name |  | ||||||
|       */ |  | ||||||
|      public function setName($name) |  | ||||||
|      { |  | ||||||
|          $this->name = $name; |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|      /** |  | ||||||
|       * @return mixed |  | ||||||
|       */ |  | ||||||
|      public function getName() |  | ||||||
|      { |  | ||||||
|          return $this->name; |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|      /** |  | ||||||
|       * @param string $description |  | ||||||
|       */ |  | ||||||
|      public function setDescription($description) |  | ||||||
|      { |  | ||||||
|          $this->description = $description; |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|      /** |  | ||||||
|       * @return string |  | ||||||
|       */ |  | ||||||
|      public function getDescription() |  | ||||||
|      { |  | ||||||
|          return $this->description; |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|  } |  | ||||||
| ?> |  | ||||||
|   | |||||||
| @@ -2,32 +2,163 @@ | |||||||
|  |  | ||||||
| namespace ManiaControl; | namespace ManiaControl; | ||||||
|  |  | ||||||
|  | require_once __DIR__ . '/plugin.php'; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Class handles plugins |  * Class handling plugins | ||||||
|  * |  * | ||||||
|  * @author Lukas Kremsmayr and steeffeen |  * @author Lukas Kremsmayr and steeffeen | ||||||
|  */ |  */ | ||||||
|  | class PluginHandler { | ||||||
|  | 	/** | ||||||
|  | 	 * Constants | ||||||
|  | 	 */ | ||||||
|  | 	const TABLE_PLUGINS = 'mc_plugins'; | ||||||
|  | 	 | ||||||
|  | 	/** | ||||||
|  | 	 * Private properties | ||||||
|  | 	 */ | ||||||
|  | 	private $maniaControl = null; | ||||||
|  | 	private $activePlugins = array(); | ||||||
|  | 	private $pluginClasses = array(); | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Construct plugin handler | ||||||
|  | 	 * | ||||||
|  | 	 * @param ManiaControl $maniaControl        	 | ||||||
|  | 	 */ | ||||||
|  | 	public function __construct(ManiaControl $maniaControl) { | ||||||
|  | 		$this->maniaControl = $maniaControl; | ||||||
|  | 		$this->initTables(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  class PluginHandler { | 	/** | ||||||
|  | 	 * Initialize necessary database tables | ||||||
|  | 	 * | ||||||
|  | 	 * @return bool | ||||||
|  | 	 */ | ||||||
|  | 	private function initTables() { | ||||||
|  | 		$mysqli = $this->maniaControl->database->mysqli; | ||||||
|  | 		$pluginsTableQuery = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLUGINS . "` ( | ||||||
|  | 				`index` int(11) NOT NULL AUTO_INCREMENT, | ||||||
|  | 				`className` varchar(100) COLLATE utf8_unicode_ci NOT NULL, | ||||||
|  | 				`active` tinyint(1) NOT NULL DEFAULT '0', | ||||||
|  | 				`changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||||||
|  | 				PRIMARY KEY (`index`) | ||||||
|  | 				) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='ManiaControl plugin status' AUTO_INCREMENT=1;"; | ||||||
|  | 		$tableStatement = $mysqli->prepare($pluginsTableQuery); | ||||||
|  | 		if ($mysqli->error) { | ||||||
|  | 			trigger_error($mysqli->error, E_USER_ERROR); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$tableStatement->execute(); | ||||||
|  | 		if ($tableStatement->error) { | ||||||
|  | 			trigger_error($tableStatement->error, E_USER_ERROR); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$tableStatement->close(); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|      /** | 	/** | ||||||
|       * Private properties | 	 * Save plugin status in database | ||||||
|       */ | 	 * | ||||||
|      private $mc; | 	 * @param string $className        	 | ||||||
|      private $plugins; | 	 * @param bool $active        	 | ||||||
|  | 	 * @return bool | ||||||
|  | 	 */ | ||||||
|  | 	private function savePluginStatus($className, $active) { | ||||||
|  | 		$mysqli = $this->maniaControl->database->mysqli; | ||||||
|  | 		$pluginStatusQuery = "INSERT INTO `" . self::TABLE_PLUGINS . "` ( | ||||||
|  | 				`className`, | ||||||
|  | 				`active` | ||||||
|  | 				) VALUES ( | ||||||
|  | 				?, ? | ||||||
|  | 				) ON DUPLICATE KEY UPDATE | ||||||
|  | 				`active` = VALUES(`active`);"; | ||||||
|  | 		$pluginStatement = $mysqli->prepare($pluginStatusQuery); | ||||||
|  | 		if ($mysqli->error) { | ||||||
|  | 			trigger_error($mysqli->error); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$activeInt = ($active ? 1 : 0); | ||||||
|  | 		$pluginStatement->bind_param('si', $className, $activeInt); | ||||||
|  | 		$pluginStatement->execute(); | ||||||
|  | 		if ($pluginStatement->error) { | ||||||
|  | 			trigger_error($pluginStatement->error); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$pluginStatement->close(); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|      public function __construct($mc){ | 	/** | ||||||
|          $this->mc = $mc; | 	 * Get plugin status from database | ||||||
|          $this->plugins = array(); | 	 * | ||||||
|      } | 	 * @param string $className        	 | ||||||
|  | 	 * @return bool | ||||||
|  | 	 */ | ||||||
|  | 	private function getPluginStatus($className) { | ||||||
|  | 		$mysqli = $this->maniaControl->database->mysqli; | ||||||
|  | 		$pluginStatusQuery = "SELECT `active` FROM `" . self::TABLE_PLUGINS . "` | ||||||
|  | 				WHERE `className` = ?;"; | ||||||
|  | 		$pluginStatement = $mysqli->prepare($pluginStatusQuery); | ||||||
|  | 		if ($mysqli->error) { | ||||||
|  | 			trigger_error($mysqli->error); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$pluginStatement->bind_param('s', $className); | ||||||
|  | 		$pluginStatement->execute(); | ||||||
|  | 		if ($pluginStatement->error) { | ||||||
|  | 			trigger_error($pluginStatement->error); | ||||||
|  | 			$pluginStatement->close(); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$pluginStatement->store_result(); | ||||||
|  | 		if ($pluginStatement->num_rows <= 0) { | ||||||
|  | 			$pluginStatement->free_result(); | ||||||
|  | 			$pluginStatement->close(); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		$pluginStatement->bind_result($activeInt); | ||||||
|  | 		$pluginStatement->fetch(); | ||||||
|  | 		$active = ($activeInt === 1); | ||||||
|  | 		$pluginStatement->free_result(); | ||||||
|  | 		$pluginStatement->close(); | ||||||
|  | 		return $active; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|      public function registerPlugin($plugin){ | 	/** | ||||||
|         array_push($this->plugins, $plugin); | 	 * Load complete plugins directory and start all configured plugins | ||||||
|      } | 	 */ | ||||||
|  | 	public function loadPlugins() { | ||||||
|  | 		$pluginsDirectory = ManiaControlDir . '/plugins/'; | ||||||
|  | 		$pluginFiles = scandir($pluginsDirectory, 0); | ||||||
|  | 		foreach ($pluginFiles as $pluginFile) { | ||||||
|  | 			if (stripos($pluginFile, '.') === 0) { | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 			$classesBefore = get_declared_classes(); | ||||||
|  | 			$success = include_once $pluginsDirectory . $pluginFile; | ||||||
|  | 			if (!$success) { | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 			$classesAfter = get_declared_classes(); | ||||||
|  | 			$newClasses = array_diff($classesAfter, $classesBefore); | ||||||
|  | 			foreach ($newClasses as $className) { | ||||||
|  | 				if (!is_subclass_of($className, 'ManiaControl\Plugin')) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				array_push($this->pluginClasses, $className); | ||||||
|  | 				$active = $this->getPluginStatus($className); | ||||||
|  | 				if (!$active) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				$plugin = new $className($this->maniaControl); | ||||||
|  | 				array_push($this->activePlugins, $plugin); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|      public function loadPlugins(){ | ?> | ||||||
|  |  | ||||||
|      } |  | ||||||
|  } |  | ||||||
| ?> |  | ||||||
|   | |||||||
| @@ -31,11 +31,10 @@ class Server { | |||||||
| 		$this->mc = $mc; | 		$this->mc = $mc; | ||||||
| 		 | 		 | ||||||
| 		// Load config | 		// Load config | ||||||
| 		$this->config = Tools::loadConfig('server.ManiaControl.xml'); | 		$this->config = Tools::loadConfig('server.xml'); | ||||||
| 		$this->mc->checkConfig($this->config, array('host', 'port', 'login', 'pass'), 'server'); |  | ||||||
| 		 | 		 | ||||||
| 		// Register for callbacks | 		// Register for callbacks | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_1_SECOND, $this, 'eachSecond'); | 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MC_1_SECOND, $this, 'eachSecond'); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| @@ -226,8 +225,8 @@ class Server { | |||||||
| 		} | 		} | ||||||
| 		return $gameMode; | 		return $gameMode; | ||||||
| 	} | 	} | ||||||
|  | 	 | ||||||
|     //TODO: remove getPlayer / getPlayers -> methods now in playerHandler handeld, but should be improved more | 	// TODO: remove getPlayer / getPlayers -> methods now in playerHandler handeld, but should be improved more | ||||||
| 	/** | 	/** | ||||||
| 	 * Fetch player info | 	 * Fetch player info | ||||||
| 	 * | 	 * | ||||||
|   | |||||||
| @@ -140,15 +140,15 @@ class Tools { | |||||||
| 		return $format; | 		return $format; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|     /** | 	/** | ||||||
|      * Formats the given time (seconds) to hh:mm:ss | 	 * Formats the given time (seconds) to hh:mm:ss | ||||||
|      * | 	 * | ||||||
|      * @param int $time | 	 * @param int $time        	 | ||||||
|      * @return string | 	 * @return string | ||||||
|      */ | 	 */ | ||||||
|     public static function formatTimeH($seconds) { | 	public static function formatTimeH($seconds) { | ||||||
|         return gmdate("H:i:s", $seconds); | 		return gmdate("H:i:s", $seconds); | ||||||
|     } | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Convert given data to real boolean | 	 * Convert given data to real boolean | ||||||
|   | |||||||
| @@ -1,85 +0,0 @@ | |||||||
| <?php |  | ||||||
|  |  | ||||||
| namespace ManiaControl; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * ManiaControl Chatlog Plugin |  | ||||||
|  * |  | ||||||
|  * @author steeffeen |  | ||||||
|  */ |  | ||||||
| class Plugin_Chatlog extends Plugin{ |  | ||||||
| 	/** |  | ||||||
| 	 * Constants |  | ||||||
| 	 */ |  | ||||||
| 	const VERSION = '1.0'; |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Private properties |  | ||||||
| 	 */ |  | ||||||
| 	private $mc = null; |  | ||||||
|  |  | ||||||
| 	private $config = null; |  | ||||||
|  |  | ||||||
| 	private $settings = null; |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Constuct chatlog plugin |  | ||||||
| 	 */ |  | ||||||
| 	public function __construct($mc) { |  | ||||||
| 		$this->mc = $mc; |  | ||||||
| 		 |  | ||||||
| 		// Load config |  | ||||||
| 		$this->config = Tools::loadConfig('chatlog.plugin.xml'); |  | ||||||
| 		 |  | ||||||
| 		// Check for enabled setting |  | ||||||
| 		if (!Tools::toBool($this->config->enabled)) return; |  | ||||||
| 		 |  | ||||||
| 		// Load settings |  | ||||||
| 		$this->loadSettings(); |  | ||||||
| 		 |  | ||||||
| 		// Register for callbacksc |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCHAT, $this, 'handlePlayerChatCallback'); |  | ||||||
| 		 |  | ||||||
| 		error_log('Chatlog Pugin v' . self::VERSION . ' ready!'); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Load settings from config |  | ||||||
| 	 */ |  | ||||||
| 	private function loadSettings() { |  | ||||||
| 		$this->settings = new \stdClass(); |  | ||||||
| 		 |  | ||||||
| 		// File name |  | ||||||
| 		$fileName = (string) $this->config->filename; |  | ||||||
| 		$this->settings->fileName = ManiaControlDir . '/' . $fileName; |  | ||||||
| 		 |  | ||||||
| 		// log_server_messages |  | ||||||
| 		$log_server_messages = $this->config->xpath('log_server_messages'); |  | ||||||
| 		$this->settings->log_server_messages = ($log_server_messages ? (Tools::toBool($log_server_messages[0])) : false); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle PlayerChat callback |  | ||||||
| 	 */ |  | ||||||
| 	public function handlePlayerChatCallback($callback) { |  | ||||||
| 		$data = $callback[1]; |  | ||||||
| 		if ($data[0] <= 0 && !$this->settings->log_server_messages) { |  | ||||||
| 			// Skip server message |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 		$this->logText($data[2], $data[1]); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Log the given message |  | ||||||
| 	 * |  | ||||||
| 	 * @param string $message        	 |  | ||||||
| 	 * @param string $login        	 |  | ||||||
| 	 */ |  | ||||||
| 	private function logText($text, $login = null) { |  | ||||||
| 		$message = date(ManiaControl::DATE) . '>> ' . ($login ? $login . ': ' : '') . $text . PHP_EOL; |  | ||||||
| 		file_put_contents($this->settings->fileName, $message, FILE_APPEND); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ?> |  | ||||||
| @@ -1,305 +0,0 @@ | |||||||
| <?php |  | ||||||
|  |  | ||||||
| namespace ManiaControl; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * ManiaControl Karma Plugin |  | ||||||
|  * |  | ||||||
|  * @author : steeffeen |  | ||||||
|  */ |  | ||||||
| class Plugin_Karma { |  | ||||||
| 	/** |  | ||||||
| 	 * Constants |  | ||||||
| 	 */ |  | ||||||
| 	const VERSION = '1.0'; |  | ||||||
| 	const MLID_KARMA = 'KarmaPlugin.MLID'; |  | ||||||
| 	const TABLE_KARMA = 'ic_karma'; |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Private properties |  | ||||||
| 	 */ |  | ||||||
| 	private $mc = null; |  | ||||||
|  |  | ||||||
| 	private $config = null; |  | ||||||
|  |  | ||||||
| 	private $sendManialinkRequested = -1; |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Construct plugin |  | ||||||
| 	 * |  | ||||||
| 	 * @param object $mc        	 |  | ||||||
| 	 */ |  | ||||||
| 	public function __construct($mc) { |  | ||||||
| 		$this->mc = $mc; |  | ||||||
| 		 |  | ||||||
| 		// Load config |  | ||||||
| 		$this->config = Tools::loadConfig('karma.plugin.xml'); |  | ||||||
| 		if (!Tools::toBool($this->config->enabled)) return; |  | ||||||
| 		 |  | ||||||
| 		// Init database |  | ||||||
| 		$this->initDatabase(); |  | ||||||
| 		 |  | ||||||
| 		// Register for callbacks |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_ONINIT, $this, 'handleOnInitCallback'); |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_BEGINMAP, $this, 'handleBeginMapCallback'); |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCONNECT, $this, 'handlePlayerConnectCallback'); |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERMANIALINKPAGEANSWER, $this,  |  | ||||||
| 				'handleManialinkPageAnswerCallback'); |  | ||||||
| 		 |  | ||||||
| 		error_log('Karma Pugin v' . self::VERSION . ' ready!'); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Repetitive actions |  | ||||||
| 	 */ |  | ||||||
| 	public function loop() { |  | ||||||
| 		if ($this->sendManialinkRequested > 0 && $this->sendManialinkRequested <= time()) { |  | ||||||
| 			$this->sendManialinkRequested = -1; |  | ||||||
| 			 |  | ||||||
| 			// Send manialink to all players |  | ||||||
| 			$players = $this->mc->server->getPlayers(); |  | ||||||
| 			foreach ($players as $player) { |  | ||||||
| 				$login = $player['Login']; |  | ||||||
| 				$manialink = $this->buildManialink($login); |  | ||||||
| 				if (!$manialink) { |  | ||||||
| 					// Skip and retry |  | ||||||
| 					$this->sendManialinkRequested = time() + 5; |  | ||||||
| 					continue; |  | ||||||
| 				} |  | ||||||
| 				Tools::sendManialinkPage($this->mc->client, $manialink->asXml(), $login); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle OnInit ManiaControl callback |  | ||||||
| 	 * |  | ||||||
| 	 * @param array $callback        	 |  | ||||||
| 	 */ |  | ||||||
| 	public function handleOnInitCallback($callback) { |  | ||||||
| 		// Send manialink to all players once |  | ||||||
| 		$this->sendManialinkRequested = time() + 3; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle ManiaControl BeginMap callback |  | ||||||
| 	 * |  | ||||||
| 	 * @param array $callback        	 |  | ||||||
| 	 */ |  | ||||||
| 	public function handleBeginMapCallback($callback) { |  | ||||||
| 		// Send manialink to all players once |  | ||||||
| 		$this->sendManialinkRequested = time() + 2; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle PlayerConnect callback |  | ||||||
| 	 * |  | ||||||
| 	 * @param array $callback        	 |  | ||||||
| 	 */ |  | ||||||
| 	public function handlePlayerConnectCallback($callback) { |  | ||||||
| 		$login = $callback[1][0]; |  | ||||||
| 		$manialink = $this->buildManialink($login); |  | ||||||
| 		if (!$manialink) return; |  | ||||||
| 		Tools::sendManialinkPage($this->mc->client, $manialink->asXml(), $login); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Create necessary tables |  | ||||||
| 	 */ |  | ||||||
| 	private function initDatabase() { |  | ||||||
| 		$query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_KARMA . "` ( |  | ||||||
| 			`index` int(11) NOT NULL AUTO_INCREMENT, |  | ||||||
| 			`mapIndex` int(11) NOT NULL, |  | ||||||
| 			`playerIndex` int(11) NOT NULL, |  | ||||||
| 			`vote` tinyint(1) NOT NULL, |  | ||||||
| 			`changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |  | ||||||
| 			PRIMARY KEY (`index`), |  | ||||||
| 			UNIQUE KEY `player_map_vote` (`mapIndex`, `playerIndex`) |  | ||||||
| 			) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Save players map votes' AUTO_INCREMENT=1;"; |  | ||||||
| 		$result = $this->mc->database->query($query); |  | ||||||
| 		if ($this->mc->database->mysqli->error) { |  | ||||||
| 			trigger_error('MySQL Error on creating karma table. ' . $this->mc->database->mysqli->error, E_USER_ERROR); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle ManialinkPageAnswer callback |  | ||||||
| 	 * |  | ||||||
| 	 * @param array $callback        	 |  | ||||||
| 	 */ |  | ||||||
| 	public function handleManialinkPageAnswerCallback($callback) { |  | ||||||
| 		$action = $callback[1][2]; |  | ||||||
| 		if (substr($action, 0, strlen(self::MLID_KARMA)) !== self::MLID_KARMA) return; |  | ||||||
| 		 |  | ||||||
| 		// Get vote |  | ||||||
| 		$action = substr($action, -4); |  | ||||||
| 		$vote = null; |  | ||||||
| 		switch ($action) { |  | ||||||
| 			case '.pos': |  | ||||||
| 				{ |  | ||||||
| 					$vote = 1; |  | ||||||
| 					break; |  | ||||||
| 				} |  | ||||||
| 			case '.neu': |  | ||||||
| 				{ |  | ||||||
| 					$vote = 0; |  | ||||||
| 					break; |  | ||||||
| 				} |  | ||||||
| 			case '.neg': |  | ||||||
| 				{ |  | ||||||
| 					$vote = -1; |  | ||||||
| 					break; |  | ||||||
| 				} |  | ||||||
| 			default: |  | ||||||
| 				{ |  | ||||||
| 					return; |  | ||||||
| 				} |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Save vote |  | ||||||
| 		$login = $callback[1][1]; |  | ||||||
| 		$playerIndex = $this->mc->database->getPlayerIndex($login); |  | ||||||
| 		$map = $this->mc->server->getMap(); |  | ||||||
| 		$mapIndex = $this->mc->database->getMapIndex($map['UId']); |  | ||||||
| 		$query = "INSERT INTO `" . self::TABLE_KARMA . "` ( |  | ||||||
| 			`mapIndex`, |  | ||||||
| 			`playerIndex`, |  | ||||||
| 			`vote` |  | ||||||
| 			) VALUES ( |  | ||||||
| 			" . $mapIndex . ", |  | ||||||
| 			" . $playerIndex . ", |  | ||||||
| 			" . $vote . " |  | ||||||
| 			) ON DUPLICATE KEY UPDATE |  | ||||||
| 			`vote` = VALUES(`vote`);"; |  | ||||||
| 		$result = $this->mc->database->query($query); |  | ||||||
| 		if (!$result) return; |  | ||||||
| 		 |  | ||||||
| 		// Send success message |  | ||||||
| 		$this->mc->chat->sendSuccess('Vote successfully updated!', $login); |  | ||||||
| 		 |  | ||||||
| 		// Send updated manialink |  | ||||||
| 		$this->sendManialinkRequested = time() + 1; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Build karma voting manialink xml for the given login |  | ||||||
| 	 */ |  | ||||||
| 	private function buildManialink($login) { |  | ||||||
| 		// Get config |  | ||||||
| 		$title = (string) $this->config->title; |  | ||||||
| 		$pos_x = (float) $this->config->pos_x; |  | ||||||
| 		$pos_y = (float) $this->config->pos_y; |  | ||||||
| 		 |  | ||||||
| 		$mysqli = $this->mc->database->mysqli; |  | ||||||
| 		 |  | ||||||
| 		// Get indezes |  | ||||||
| 		$playerIndex = $this->mc->database->getPlayerIndex($login); |  | ||||||
| 		if ($playerIndex === null) return null; |  | ||||||
| 		$map = $this->mc->server->getMap(); |  | ||||||
| 		if (!$map) return null; |  | ||||||
| 		$mapIndex = $this->mc->database->getMapIndex($map['UId']); |  | ||||||
| 		if ($mapIndex === null) return null; |  | ||||||
| 		 |  | ||||||
| 		// Get votings |  | ||||||
| 		$query = "SELECT |  | ||||||
| 			(SELECT `vote` FROM `" . |  | ||||||
| 				 self::TABLE_KARMA . "` WHERE `mapIndex` = " . $mapIndex . " AND `playerIndex` = " . $playerIndex . ") as `playerVote`, |  | ||||||
| 			(SELECT COUNT(`vote`) FROM `" . |  | ||||||
| 				 self::TABLE_KARMA . "` WHERE `mapIndex` = " . $mapIndex . " AND `vote` = 1) AS `positiveVotes`, |  | ||||||
| 			(SELECT COUNT(`vote`) FROM `" . |  | ||||||
| 				 self::TABLE_KARMA . "` WHERE `mapIndex` = " . $mapIndex . " AND `vote` = 0) AS `neutralVotes`, |  | ||||||
| 			(SELECT COUNT(`vote`) FROM `" . |  | ||||||
| 				 self::TABLE_KARMA . "` WHERE `mapIndex` = " . $mapIndex . " AND `vote` = -1) AS `negativeVotes` |  | ||||||
| 			FROM `" . self::TABLE_KARMA . "`;"; |  | ||||||
| 		$result = $mysqli->query($query); |  | ||||||
| 		if ($mysqli->error) { |  | ||||||
| 			trigger_error('MySQL ERROR: ' . $mysqli->error); |  | ||||||
| 		} |  | ||||||
| 		$votes = $result->fetch_assoc(); |  | ||||||
| 		if (!$votes) { |  | ||||||
| 			$votes = array('playerVote' => null, 'positiveVotes' => 0, 'neutralVotes' => 0, 'negativeVotes' => 0); |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Build manialink |  | ||||||
| 		$xml = Tools::newManialinkXml(self::MLID_KARMA); |  | ||||||
| 		 |  | ||||||
| 		$frameXml = $xml->addChild('frame'); |  | ||||||
| 		$frameXml->addAttribute('posn', $pos_x . ' ' . $pos_y); |  | ||||||
| 		 |  | ||||||
| 		// Title |  | ||||||
| 		$labelXml = $frameXml->addChild('label'); |  | ||||||
| 		Tools::addAlignment($labelXml); |  | ||||||
| 		$labelXml->addAttribute('posn', '0 4.5 -1'); |  | ||||||
| 		$labelXml->addAttribute('sizen', '22 0'); |  | ||||||
| 		$labelXml->addAttribute('style', 'TextTitle1'); |  | ||||||
| 		$labelXml->addAttribute('textsize', '1'); |  | ||||||
| 		$labelXml->addAttribute('text', $title); |  | ||||||
| 		 |  | ||||||
| 		// Background |  | ||||||
| 		$quadXml = $frameXml->addChild('quad'); |  | ||||||
| 		Tools::addAlignment($quadXml); |  | ||||||
| 		$quadXml->addAttribute('sizen', '23 15 -2'); |  | ||||||
| 		$quadXml->addAttribute('style', 'Bgs1InRace'); |  | ||||||
| 		$quadXml->addAttribute('substyle', 'BgTitleShadow'); |  | ||||||
| 		 |  | ||||||
| 		// Votes |  | ||||||
| 		for ($i = 1; $i >= -1; $i--) { |  | ||||||
| 			$x = $i * 7.; |  | ||||||
| 			 |  | ||||||
| 			// Vote button |  | ||||||
| 			$quadXml = $frameXml->addChild('quad'); |  | ||||||
| 			Tools::addAlignment($quadXml); |  | ||||||
| 			$quadXml->addAttribute('posn', $x . ' 0 0'); |  | ||||||
| 			$quadXml->addAttribute('sizen', '6 6'); |  | ||||||
| 			$quadXml->addAttribute('style', 'Icons64x64_1'); |  | ||||||
| 			 |  | ||||||
| 			// Vote count |  | ||||||
| 			$labelXml = $frameXml->addChild('label'); |  | ||||||
| 			Tools::addAlignment($labelXml); |  | ||||||
| 			$labelXml->addAttribute('posn', $x . ' -4.5 0'); |  | ||||||
| 			$labelXml->addAttribute('style', 'TextTitle1'); |  | ||||||
| 			$labelXml->addAttribute('textsize', '2'); |  | ||||||
| 			 |  | ||||||
| 			if ((string) $i === $votes['playerVote']) { |  | ||||||
| 				// Player vote X |  | ||||||
| 				$voteQuadXml = $frameXml->addChild('quad'); |  | ||||||
| 				Tools::addAlignment($voteQuadXml); |  | ||||||
| 				$voteQuadXml->addAttribute('posn', $x . ' 0 1'); |  | ||||||
| 				$voteQuadXml->addAttribute('sizen', '6 6'); |  | ||||||
| 				$voteQuadXml->addAttribute('style', 'Icons64x64_1'); |  | ||||||
| 				$voteQuadXml->addAttribute('substyle', 'Close'); |  | ||||||
| 			} |  | ||||||
| 			 |  | ||||||
| 			switch ($i) { |  | ||||||
| 				case 1: |  | ||||||
| 					{ |  | ||||||
| 						// Positive |  | ||||||
| 						$quadXml->addAttribute('substyle', 'LvlGreen'); |  | ||||||
| 						$quadXml->addAttribute('action', self::MLID_KARMA . '.pos'); |  | ||||||
| 						$labelXml->addAttribute('text', $votes['positiveVotes']); |  | ||||||
| 						break; |  | ||||||
| 					} |  | ||||||
| 				case 0: |  | ||||||
| 					{ |  | ||||||
| 						// Neutral |  | ||||||
| 						$quadXml->addAttribute('substyle', 'LvlYellow'); |  | ||||||
| 						$quadXml->addAttribute('action', self::MLID_KARMA . '.neu'); |  | ||||||
| 						$labelXml->addAttribute('text', $votes['neutralVotes']); |  | ||||||
| 						break; |  | ||||||
| 					} |  | ||||||
| 				case -1: |  | ||||||
| 					{ |  | ||||||
| 						// Negative |  | ||||||
| 						$quadXml->addAttribute('substyle', 'LvlRed'); |  | ||||||
| 						$quadXml->addAttribute('action', self::MLID_KARMA . '.neg'); |  | ||||||
| 						$labelXml->addAttribute('text', $votes['negativeVotes']); |  | ||||||
| 						break; |  | ||||||
| 					} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		return $xml; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ?> |  | ||||||
| @@ -1,63 +0,0 @@ | |||||||
| <?php |  | ||||||
|  |  | ||||||
| namespace ManiaControl; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * ManiaControl Obstacle Plugin |  | ||||||
|  * |  | ||||||
|  * @author steeffeen |  | ||||||
|  */ |  | ||||||
| class Plugin_Obstacle extends Plugin { |  | ||||||
| 	/** |  | ||||||
| 	 * Constants |  | ||||||
| 	 */ |  | ||||||
| 	const CB_JUMPTO = 'Obstacle.JumpTo'; |  | ||||||
| 	const VERSION = '1.0'; |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Private properties |  | ||||||
| 	 */ |  | ||||||
| 	private $mc = null; |  | ||||||
|  |  | ||||||
| 	private $config = null; |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Constuct obstacle plugin |  | ||||||
| 	 */ |  | ||||||
| 	public function __construct($mc) { |  | ||||||
| 		$this->mc = $mc; |  | ||||||
| 		 |  | ||||||
| 		// Load config |  | ||||||
| 		$this->config = Tools::loadConfig('obstacle.plugin.xml'); |  | ||||||
| 		 |  | ||||||
| 		// Check for enabled setting |  | ||||||
| 		if (!Tools::toBool($this->config->enabled)) return; |  | ||||||
| 		 |  | ||||||
| 		// Register for jump command |  | ||||||
| 		$this->mc->commands->registerCommandHandler('jumpto', $this, 'command_jumpto'); |  | ||||||
| 		 |  | ||||||
| 		error_log('Obstacle Pugin v' . self::VERSION . ' ready!'); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle jumpto command |  | ||||||
| 	 */ |  | ||||||
| 	public function command_jumpto($chat) { |  | ||||||
| 		$login = $chat[1][1]; |  | ||||||
| 		$rightLevel = (string) $this->config->jumps_rightlevel; |  | ||||||
| 		if (!$this->mc->authentication->checkRight($login, $rightLevel)) { |  | ||||||
| 			// Not allowed |  | ||||||
| 			$this->mc->authentication->sendNotAllowed($login); |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			// Send jump callback |  | ||||||
| 			$params = explode(' ', $chat[1][2], 2); |  | ||||||
| 			$param = $login . ";" . $params[1] . ";"; |  | ||||||
| 			if (!$this->mc->client->query('TriggerModeScriptEvent', self::CB_JUMPTO, $param)) { |  | ||||||
| 				trigger_error("Couldn't send jump callback for '" . $login . "'. " . $this->mc->getClientErrorText()); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ?> |  | ||||||
| @@ -1,37 +0,0 @@ | |||||||
| <?php |  | ||||||
|  |  | ||||||
| namespace ManiaControl; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Abstract ManiaControl plugin class |  | ||||||
|  */ |  | ||||||
| abstract class Plugin_Name { |  | ||||||
| 	/** |  | ||||||
| 	 * Constants |  | ||||||
| 	 */ |  | ||||||
| 	const VERSION = '0.1'; |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Private properties |  | ||||||
| 	 */ |  | ||||||
| 	private $mc = null; |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Construct plugin |  | ||||||
| 	 * |  | ||||||
| 	 * @param object $mc        	 |  | ||||||
| 	 */ |  | ||||||
| 	public function __construct($mc) { |  | ||||||
| 		$this->mc = $mc; |  | ||||||
| 		 |  | ||||||
| 		error_log('Pugin v' . self::VERSION . ' ready!'); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Perform actions during each loop |  | ||||||
| 	 */ |  | ||||||
| 	public function loop() { |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ?> |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,677 +0,0 @@ | |||||||
| <?php |  | ||||||
|  |  | ||||||
| namespace ManiaControl; |  | ||||||
|  |  | ||||||
| // TODO: Jump message "now playing stadium" |  | ||||||
| // TODO: put inactive server in idle (keeping same map) |  | ||||||
| // TODO: let next server wait for the first player |  | ||||||
| // TODO: check compatibility with other modes (laps, ...) |  | ||||||
| // TODO: max players setting |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * ManiaControl United Plugin |  | ||||||
|  * |  | ||||||
|  * @author steeffeen |  | ||||||
|  */ |  | ||||||
| class Plugin_United { |  | ||||||
| 	/** |  | ||||||
| 	 * Constants |  | ||||||
| 	 */ |  | ||||||
| 	const VERSION = '1.0'; |  | ||||||
| 	const ML_ADDFAVORITE = 'MLID_UnitedPlugin.AddFavorite'; |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Private properties |  | ||||||
| 	 */ |  | ||||||
| 	private $mc = null; |  | ||||||
|  |  | ||||||
| 	private $config = null; |  | ||||||
|  |  | ||||||
| 	private $settings = null; |  | ||||||
|  |  | ||||||
| 	private $gameServer = array(); |  | ||||||
|  |  | ||||||
| 	private $lobbies = array(); |  | ||||||
|  |  | ||||||
| 	private $currentClientIndex = 0; |  | ||||||
|  |  | ||||||
| 	private $lastStatusCheck = 0; |  | ||||||
|  |  | ||||||
| 	private $finishedBegin = -1; |  | ||||||
|  |  | ||||||
| 	private $switchServerRequested = -1; |  | ||||||
|  |  | ||||||
| 	private $manialinks = array(); |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Constuct plugin |  | ||||||
| 	 */ |  | ||||||
| 	public function __construct($mc) { |  | ||||||
| 		$this->mc = $mc; |  | ||||||
| 		 |  | ||||||
| 		// Load config |  | ||||||
| 		$this->config = Tools::loadConfig('united.plugin.xml'); |  | ||||||
| 		$this->loadSettings(); |  | ||||||
| 		 |  | ||||||
| 		// Check for enabled setting |  | ||||||
| 		if (!$this->settings->enabled) return; |  | ||||||
| 		 |  | ||||||
| 		// Load clients |  | ||||||
| 		$this->loadClients(); |  | ||||||
| 		 |  | ||||||
| 		// Register for callbacks |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_ONINIT, $this, 'handleOnInitCallback'); |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_5_SECOND, $this, 'handle5Seconds'); |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCONNECT, $this, 'handlePlayerConnect'); |  | ||||||
| 		$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERMANIALINKPAGEANSWER, $this,  |  | ||||||
| 				'handleManialinkPageAnswer'); |  | ||||||
| 		 |  | ||||||
| 		// Register for commands |  | ||||||
| 		$this->mc->commands->registerCommandHandler('nextserver', $this, 'handleNextServerCommand'); |  | ||||||
| 		 |  | ||||||
| 		if ($this->settings->widgets_enabled) { |  | ||||||
| 			// Build addfavorite manialink |  | ||||||
| 			$this->buildFavoriteManialink(); |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		error_log('United Pugin v' . self::VERSION . ' ready!'); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle ManiaControl OnInit callback |  | ||||||
| 	 * |  | ||||||
| 	 * @param array $callback        	 |  | ||||||
| 	 */ |  | ||||||
| 	public function handleOnInitCallback($callback) { |  | ||||||
| 		if ($this->settings->widgets_enabled) { |  | ||||||
| 			// Send widgets to all players |  | ||||||
| 			 |  | ||||||
| 			if (Tools::toBool($this->config->widgets->addfavorite->enabled)) { |  | ||||||
| 				// Send favorite widget |  | ||||||
| 				if (!$this->mc->client->query('SendDisplayManialinkPage', $this->manialinks[self::ML_ADDFAVORITE]->asXml(), 0,  |  | ||||||
| 						false)) { |  | ||||||
| 					trigger_error("Couldn't send favorite widget! " . $this->mc->getClientErrorText()); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Load settings from config |  | ||||||
| 	 */ |  | ||||||
| 	private function loadSettings() { |  | ||||||
| 		$this->settings = new \stdClass(); |  | ||||||
| 		 |  | ||||||
| 		// Enabled |  | ||||||
| 		$this->settings->enabled = Tools::toBool($this->config->enabled); |  | ||||||
| 		 |  | ||||||
| 		// Timeout |  | ||||||
| 		$timeout = $this->mc->server->config->xpath('timeout'); |  | ||||||
| 		if ($timeout) { |  | ||||||
| 			$this->settings->timeout = (int) $timeout[0]; |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			$this->settings->timeout = 30; |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Game mode |  | ||||||
| 		$mode = $this->config->xpath('mode'); |  | ||||||
| 		if ($mode) { |  | ||||||
| 			$mode = (int) $mode[0]; |  | ||||||
| 			if ($mode < 1 || $mode > 6) { |  | ||||||
| 				$this->settings->gamemode = 2; |  | ||||||
| 			} |  | ||||||
| 			else { |  | ||||||
| 				$this->settings->gamemode = $mode; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Server status |  | ||||||
| 		$hide_game_server = $this->config->xpath('hide_game_server'); |  | ||||||
| 		if ($hide_game_server) { |  | ||||||
| 			$this->settings->hide_game_server = Tools::toBool($hide_game_server[0]); |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			$this->settings->hide_game_server = true; |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Passwords |  | ||||||
| 		$lobbyPassword = $this->config->xpath('lobbies/password'); |  | ||||||
| 		if ($lobbyPassword) { |  | ||||||
| 			$this->settings->lobbyPassword = (string) $lobbyPassword[0]; |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			$this->settings->lobbyPassword = ''; |  | ||||||
| 		} |  | ||||||
| 		$gamePassword = $this->config->xpath('gameserver/password'); |  | ||||||
| 		if ($gamePassword) { |  | ||||||
| 			$this->settings->gamePassword = (string) $gamePassword[0]; |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			$this->settings->gamePassword = ''; |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Widgets |  | ||||||
| 		$this->settings->widgets_enabled = Tools::toBool($this->config->widgets->enabled); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Loop events on clients |  | ||||||
| 	 */ |  | ||||||
| 	public function loop() { |  | ||||||
| 		if (!$this->settings->enabled) return; |  | ||||||
| 		 |  | ||||||
| 		// Check callbacks all clients |  | ||||||
| 		$clients = array_merge($this->gameServer, $this->lobbies); |  | ||||||
| 		$currentServer = $this->gameServer[$this->currentClientIndex]; |  | ||||||
| 		foreach ($clients as $index => $client) { |  | ||||||
| 			$client->resetError(); |  | ||||||
| 			$client->readCB(); |  | ||||||
| 			$callbacks = $client->getCBResponses(); |  | ||||||
| 			if (!is_array($callbacks) || $client->isError()) { |  | ||||||
| 				trigger_error("Error reading server callbacks! " . $this->mc->getClientErrorText($client)); |  | ||||||
| 			} |  | ||||||
| 			else { |  | ||||||
| 				if ($client == $currentServer) { |  | ||||||
| 					// Currently active game server |  | ||||||
| 					foreach ($callbacks as $index => $callback) { |  | ||||||
| 						$callbackName = $callback[0]; |  | ||||||
| 						switch ($callbackName) { |  | ||||||
| 							case Callbacks::CB_MP_ENDMAP: |  | ||||||
| 								{ |  | ||||||
| 									$this->switchToNextServer(false); |  | ||||||
| 									break; |  | ||||||
| 								} |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 					 |  | ||||||
| 					if ($this->lastStatusCheck + 2 > time()) continue; |  | ||||||
| 					$this->lastStatusCheck = time(); |  | ||||||
| 					 |  | ||||||
| 					if (!$client->query('CheckEndMatchCondition')) { |  | ||||||
| 						trigger_error("Couldn't get game server status. " . $this->mc->getClientErrorText($client)); |  | ||||||
| 					} |  | ||||||
| 					else { |  | ||||||
| 						$response = $client->getResponse(); |  | ||||||
| 						switch ($response) { |  | ||||||
| 							case 'Finished': |  | ||||||
| 								{ |  | ||||||
| 									if ($this->finishedBegin < 0) { |  | ||||||
| 										$this->finishedBegin = time(); |  | ||||||
| 									} |  | ||||||
| 									else if ($this->finishedBegin + 13 <= time()) { |  | ||||||
| 										$this->switchToNextServer(true); |  | ||||||
| 									} |  | ||||||
| 									break; |  | ||||||
| 								} |  | ||||||
| 							default: |  | ||||||
| 								{ |  | ||||||
| 									$this->finishedBegin = -1; |  | ||||||
| 									break; |  | ||||||
| 								} |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 				else { |  | ||||||
| 					// Lobby or inactive game server -> Redirect players |  | ||||||
| 					foreach ($callbacks as $callback) { |  | ||||||
| 						switch ($callback[0]) { |  | ||||||
| 							case Callbacks::CB_MP_PLAYERCONNECT: |  | ||||||
| 								{ |  | ||||||
| 									$this->playerJoinedLobby($client, $callback); |  | ||||||
| 									break; |  | ||||||
| 								} |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Check for switch server request |  | ||||||
| 		if ($this->switchServerRequested > 0 && $this->switchServerRequested <= time()) { |  | ||||||
| 			$this->switchServerRequested = -1; |  | ||||||
| 			 |  | ||||||
| 			// Switch server |  | ||||||
| 			$this->switchToNextServer(true); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle 5 seconds callback |  | ||||||
| 	 */ |  | ||||||
| 	public function handle5Seconds($callback = null) { |  | ||||||
| 		// Update lobby infos |  | ||||||
| 		$players = $this->mc->server->getPlayers(); |  | ||||||
| 		if (is_array($players)) { |  | ||||||
| 			$playerCount = count($players); |  | ||||||
| 			$playerLevel = 0.; |  | ||||||
| 			if ($playerCount > 0) { |  | ||||||
| 				foreach ($players as $player) { |  | ||||||
| 					$playerLevel += $player['LadderRanking']; |  | ||||||
| 				} |  | ||||||
| 				$playerLevel /= $playerCount; |  | ||||||
| 			} |  | ||||||
| 			foreach ($this->lobbies as $lobby) { |  | ||||||
| 				if (!$lobby->query('SetLobbyInfo', true, $playerCount, 255, $playerLevel)) { |  | ||||||
| 					trigger_error("Couldn't update lobby info. " . $this->mc->getClientErrorText($lobby)); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Check for not-redirected players |  | ||||||
| 		$clients = array_merge($this->gameServer, $this->lobbies); |  | ||||||
| 		$joinLink = $this->getJoinLink(); |  | ||||||
| 		foreach ($clients as $client) { |  | ||||||
| 			if ($client == $this->gameServer[$this->currentClientIndex]) continue; |  | ||||||
| 			$players = $this->mc->server->getPlayers($client); |  | ||||||
| 			if (!is_array($players)) continue; |  | ||||||
| 			foreach ($players as $player) { |  | ||||||
| 				$login = $player['Login']; |  | ||||||
| 				if (!$client->query('SendOpenLinkToLogin', $login, $joinLink, 1)) { |  | ||||||
| 					trigger_error( |  | ||||||
| 							"Couldn't redirect player '" . $login . "' to active game server. " . |  | ||||||
| 									 $this->mc->getClientErrorText($client)); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle player manialink page answer callback |  | ||||||
| 	 */ |  | ||||||
| 	public function handleManialinkPageAnswer($callback) { |  | ||||||
| 		$login = $callback[1][1]; |  | ||||||
| 		$action = $callback[1][2]; |  | ||||||
| 		switch ($action) { |  | ||||||
| 			case self::ML_ADDFAVORITE: |  | ||||||
| 				{ |  | ||||||
| 					// Open manialink to add server logins to favorite |  | ||||||
| 					$serverLogins = array(); |  | ||||||
| 					$add_all = Tools::toBool($this->config->widgets->addfavorite->add_all); |  | ||||||
| 					if ($add_all) { |  | ||||||
| 						// Add all server |  | ||||||
| 						foreach ($this->gameServer as $serverClient) { |  | ||||||
| 							array_push($serverLogins, $this->mc->server->getLogin($serverClient)); |  | ||||||
| 						} |  | ||||||
| 						foreach ($this->lobbies as $serverClient) { |  | ||||||
| 							array_push($serverLogins, $this->mc->server->getLogin($serverClient)); |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 					else { |  | ||||||
| 						// Add only current server |  | ||||||
| 						array_push($serverLogins, $this->mc->server->getLogin()); |  | ||||||
| 					} |  | ||||||
| 					 |  | ||||||
| 					// Build manialink url |  | ||||||
| 					$manialink = 'mc?favorite'; |  | ||||||
| 					foreach ($serverLogins as $serverLogin) { |  | ||||||
| 						$manialink .= '&' . $serverLogin; |  | ||||||
| 					} |  | ||||||
| 					 |  | ||||||
| 					// Send url to player |  | ||||||
| 					if (!$this->mc->client->query('SendOpenLinkToLogin', $login, $manialink, 1)) { |  | ||||||
| 						trigger_error( |  | ||||||
| 								"Couldn't open manialink to add server to favorite for '" . $login . "'! " . |  | ||||||
| 										 $this->mc->getClientErrorText()); |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Switch to the next server |  | ||||||
| 	 * |  | ||||||
| 	 * @param bool $simulateMapEnd |  | ||||||
| 	 *        	Simulate end of the map by sending callbacks |  | ||||||
| 	 */ |  | ||||||
| 	private function switchToNextServer($simulateMapEnd) { |  | ||||||
| 		$this->finishedBegin = -1; |  | ||||||
| 		$oldClient = $this->gameServer[$this->currentClientIndex]; |  | ||||||
| 		 |  | ||||||
| 		$random_order = Tools::toBool($this->config->random_order); |  | ||||||
| 		if ($random_order) { |  | ||||||
| 			// Random next server |  | ||||||
| 			$this->currentClientIndex = rand(0, count($this->gameServer) - 1); |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			// Next server in list |  | ||||||
| 			$this->currentClientIndex++; |  | ||||||
| 		} |  | ||||||
| 		if ($this->currentClientIndex >= count($this->gameServer)) $this->currentClientIndex = 0; |  | ||||||
| 		 |  | ||||||
| 		$newClient = $this->gameServer[$this->currentClientIndex]; |  | ||||||
| 		if ($newClient == $oldClient) return; |  | ||||||
| 		 |  | ||||||
| 		// Restart map on next game server |  | ||||||
| 		if (!$newClient->query('RestartMap')) { |  | ||||||
| 			trigger_error("Couldn't restart map on next game server. " . $this->mc->getClientErrorText($newClient)); |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		if ($simulateMapEnd) { |  | ||||||
| 			// Simulate EndMap on old client |  | ||||||
| 			$this->mc->callbacks->triggerCallback(Callbacks::CB_IC_ENDMAP, array(Callbacks::CB_IC_ENDMAP)); |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Transfer players to next server |  | ||||||
| 		$joinLink = $this->getJoinLink($newClient); |  | ||||||
| 		if (!$oldClient->query('GetPlayerList', 255, 0)) { |  | ||||||
| 			trigger_error("Couldn't get player list. " . $this->mc->getClientErrorText($oldClient)); |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			$playerList = $oldClient->getResponse(); |  | ||||||
| 			foreach ($playerList as $player) { |  | ||||||
| 				$login = $player['Login']; |  | ||||||
| 				if (!$oldClient->query('SendOpenLinkToLogin', $login, $joinLink, 1)) { |  | ||||||
| 					trigger_error("Couldn't redirect player to next game server. " . $this->mc->getClientErrorText($oldClient)); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			 |  | ||||||
| 			$this->mc->client = $newClient; |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Trigger client updated callback |  | ||||||
| 		$this->mc->callbacks->triggerCallback(Callbacks::CB_IC_CLIENTUPDATED, "Plugin_United.SwitchedServer"); |  | ||||||
| 		 |  | ||||||
| 		if ($simulateMapEnd) { |  | ||||||
| 			// Simulate BeginMap on new client |  | ||||||
| 			$map = $this->mc->server->getMap(); |  | ||||||
| 			if ($map) { |  | ||||||
| 				$this->mc->callbacks->triggerCallback(Callbacks::CB_IC_BEGINMAP, array(Callbacks::CB_IC_BEGINMAP, array($map))); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle nextserver command |  | ||||||
| 	 * |  | ||||||
| 	 * @param mixed $command        	 |  | ||||||
| 	 */ |  | ||||||
| 	public function handleNextServerCommand($command) { |  | ||||||
| 		if (!$command) return; |  | ||||||
| 		$login = $command[1][1]; |  | ||||||
| 		 |  | ||||||
| 		if (!$this->mc->authentication->checkRight($login, 'operator')) { |  | ||||||
| 			// Not allowed |  | ||||||
| 			$this->mc->authentication->sendNotAllowed($login); |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Request skip to next server |  | ||||||
| 		$this->switchServerRequested = time() + 3; |  | ||||||
| 		 |  | ||||||
| 		// Send chat message |  | ||||||
| 		$this->mc->chat->sendInformation("Switching to next server in 3 seconds..."); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle PlayerConnect callback |  | ||||||
| 	 */ |  | ||||||
| 	public function playerJoinedLobby($client, $callback) { |  | ||||||
| 		if (!$client) return; |  | ||||||
| 		 |  | ||||||
| 		$data = $callback[1]; |  | ||||||
| 		$login = $data[0]; |  | ||||||
| 		 |  | ||||||
| 		// Redirect player to current game server |  | ||||||
| 		$gameserver = $this->gameServer[$this->currentClientIndex]; |  | ||||||
| 		$joinLink = $this->getJoinLink($gameserver, !$data[1]); |  | ||||||
| 		if (!$client->query('SendOpenLinkToLogin', $login, $joinLink, 1)) { |  | ||||||
| 			trigger_error( |  | ||||||
| 					"United Plugin: Couldn't redirect player to current game server. " . $this->mc->getClientErrorText($client)); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Connect to the game server defined in the config |  | ||||||
| 	 */ |  | ||||||
| 	private function loadClients() { |  | ||||||
| 		$gameserver = $this->config->xpath('gameserver/server'); |  | ||||||
| 		$lobbies = $this->config->xpath('lobbies/server'); |  | ||||||
| 		 |  | ||||||
| 		$clientsConfig = array_merge($gameserver, $lobbies); |  | ||||||
| 		foreach ($clientsConfig as $index => $serv) { |  | ||||||
| 			$isGameServer = (in_array($serv, $gameserver)); |  | ||||||
| 			 |  | ||||||
| 			$host = $serv->xpath('host'); |  | ||||||
| 			$port = $serv->xpath('port'); |  | ||||||
| 			if (!$host || !$port) { |  | ||||||
| 				trigger_error("Invalid configuration!", E_USER_ERROR); |  | ||||||
| 			} |  | ||||||
| 			$host = (string) $host[0]; |  | ||||||
| 			$port = (string) $port[0]; |  | ||||||
| 			 |  | ||||||
| 			error_log("Connecting to united " . ($isGameServer ? 'game' : 'lobby') . " server at " . $host . ":" . $port . "..."); |  | ||||||
| 			$client = new \IXR_ClientMulticall_Gbx(); |  | ||||||
| 			 |  | ||||||
| 			// Connect |  | ||||||
| 			if (!$client->InitWithIp($host, $port, $this->settings->timeout)) { |  | ||||||
| 				trigger_error( |  | ||||||
| 						"Couldn't connect to united " . ($isGameServer ? 'game' : lobby) . " server! " . $client->getErrorMessage() . |  | ||||||
| 								 "(" . $client->getErrorCode() . ")", E_USER_ERROR); |  | ||||||
| 			} |  | ||||||
| 			 |  | ||||||
| 			$login = $serv->xpath('login'); |  | ||||||
| 			$pass = $serv->xpath('pass'); |  | ||||||
| 			if (!$login || !$pass) { |  | ||||||
| 				trigger_error("Invalid configuration!", E_USER_ERROR); |  | ||||||
| 			} |  | ||||||
| 			$login = (string) $login[0]; |  | ||||||
| 			$pass = (string) $pass[0]; |  | ||||||
| 			 |  | ||||||
| 			// Authenticate |  | ||||||
| 			if (!$client->query('Authenticate', $login, $pass)) { |  | ||||||
| 				trigger_error( |  | ||||||
| 						"Couldn't authenticate on united " . ($isGameServer ? 'game' : 'lobby') . " server with user '" . $login . "'! " . |  | ||||||
| 								 $client->getErrorMessage() . "(" . $client->getErrorCode() . ")", E_USER_ERROR); |  | ||||||
| 			} |  | ||||||
| 			 |  | ||||||
| 			// Enable callback system |  | ||||||
| 			if (!$client->query('EnableCallbacks', true)) { |  | ||||||
| 				trigger_error("Couldn't enable callbacks! " . $client->getErrorMessage() . "(" . $client->getErrorCode() . ")",  |  | ||||||
| 						E_USER_ERROR); |  | ||||||
| 			} |  | ||||||
| 			 |  | ||||||
| 			// Wait for server to be ready |  | ||||||
| 			if (!$this->mc->server->waitForStatus($client, 4)) { |  | ||||||
| 				trigger_error("Server couldn't get ready!", E_USER_ERROR); |  | ||||||
| 			} |  | ||||||
| 			 |  | ||||||
| 			// Set api version |  | ||||||
| 			if (!$client->query('SetApiVersion', ManiaControl::API_VERSION)) { |  | ||||||
| 				trigger_error( |  | ||||||
| 						"Couldn't set API version '" . ManiaControl::API_VERSION . "'! This might cause problems. " . |  | ||||||
| 								 $this->mc->getClientErrorText($client)); |  | ||||||
| 			} |  | ||||||
| 			 |  | ||||||
| 			// Set server settings |  | ||||||
| 			$password = ($isGameServer ? $this->settings->gamePassword : $this->settings->lobbyPassword); |  | ||||||
| 			$hideServer = ($isGameServer && $this->settings->hide_game_server ? 1 : 0); |  | ||||||
| 			// Passwords |  | ||||||
| 			if (!$client->query('SetServerPassword', $password)) { |  | ||||||
| 				trigger_error("Couldn't set server join password. " . $this->mc->getClientErrorText($client)); |  | ||||||
| 			} |  | ||||||
| 			if (!$client->query('SetServerPasswordForSpectator', $password)) { |  | ||||||
| 				trigger_error("Couldn't set server spec password. " . $this->mc->getClientErrorText($client)); |  | ||||||
| 			} |  | ||||||
| 			// Show/Hide server |  | ||||||
| 			if (!$client->query('SetHideServer', $hideServer)) { |  | ||||||
| 				trigger_error( |  | ||||||
| 						"Couldn't set server '" . ($hideServer == 0 ? 'shown' : 'hidden') . "'. " . |  | ||||||
| 								 $this->mc->getClientErrorText($client)); |  | ||||||
| 			} |  | ||||||
| 			 |  | ||||||
| 			// Enable service announces |  | ||||||
| 			if (!$client->query("DisableServiceAnnounces", false)) { |  | ||||||
| 				trigger_error("Couldn't enable service announces. " . $this->mc->getClientErrorText($client)); |  | ||||||
| 			} |  | ||||||
| 			 |  | ||||||
| 			// Set game mode |  | ||||||
| 			if (!$client->query('SetGameMode', $this->settings->gamemode)) { |  | ||||||
| 				trigger_error( |  | ||||||
| 						"Couldn't set game mode (" . $this->settings->gamemode . "). " . $this->mc->getClientErrorText($client)); |  | ||||||
| 			} |  | ||||||
| 			else if (!$client->query('RestartMap')) { |  | ||||||
| 				trigger_error("Couldn't restart map to change game mode. " . $this->mc->getClientErrorText($client)); |  | ||||||
| 			} |  | ||||||
| 			 |  | ||||||
| 			// Save client |  | ||||||
| 			$client->index = $index; |  | ||||||
| 			if ($isGameServer) { |  | ||||||
| 				array_push($this->gameServer, $client); |  | ||||||
| 				if (count($this->gameServer) === 1) { |  | ||||||
| 					$this->mc->client = $client; |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			else { |  | ||||||
| 				array_push($this->lobbies, $client); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		error_log("United Plugin: Connected to all game and lobby server!"); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Handle PlayerConnect callback |  | ||||||
| 	 * |  | ||||||
| 	 * @param array $callback        	 |  | ||||||
| 	 */ |  | ||||||
| 	public function handlePlayerConnect($callback) { |  | ||||||
| 		if ($this->settings->widgets_enabled) { |  | ||||||
| 			// Send manialinks to the client |  | ||||||
| 			$login = $callback[1][0]; |  | ||||||
| 			 |  | ||||||
| 			if (Tools::toBool($this->config->widgets->addfavorite->enabled)) { |  | ||||||
| 				// Send favorite widget |  | ||||||
| 				if (!$this->mc->client->query('SendDisplayManialinkPageToLogin', $login,  |  | ||||||
| 						$this->manialinks[self::ML_ADDFAVORITE]->asXml(), 0, false)) { |  | ||||||
| 					trigger_error("Couldn't send favorite widget to player '" . $login . "'! " . $this->mc->getClientErrorText()); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Build join link for the given client |  | ||||||
| 	 */ |  | ||||||
| 	private function getJoinLink(&$client = null, $play = true) { |  | ||||||
| 		if (!$client) { |  | ||||||
| 			$client = $this->gameServer[$this->currentClientIndex]; |  | ||||||
| 		} |  | ||||||
| 		if (!$client->query('GetSystemInfo')) { |  | ||||||
| 			trigger_error("Couldn't fetch server system info. " . $this->mc->getClientErrorText($client)); |  | ||||||
| 			return null; |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			$systemInfo = $client->getResponse(); |  | ||||||
| 			$password = ''; |  | ||||||
| 			if (!$client->query('GetServerPassword')) { |  | ||||||
| 				trigger_error("Couldn't get server password. " . $this->mc->getClientErrorText($client)); |  | ||||||
| 			} |  | ||||||
| 			else { |  | ||||||
| 				$password = $client->getResponse(); |  | ||||||
| 			} |  | ||||||
| 			return '#q' . ($play ? 'join' : 'spectate') . '=' . $systemInfo['ServerLogin'] . |  | ||||||
| 					 (strlen($password) > 0 ? ':' . $password : '') . '@' . $systemInfo['TitleId']; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Build manialink for addfavorite button |  | ||||||
| 	 */ |  | ||||||
| 	private function buildFavoriteManialink() { |  | ||||||
| 		// Load configs |  | ||||||
| 		$config = $this->config->widgets->addfavorite; |  | ||||||
| 		if (!Tools::toBool($config->enabled)) return; |  | ||||||
| 		 |  | ||||||
| 		$pos_x = (float) $config->pos_x; |  | ||||||
| 		$pos_y = (float) $config->pos_y; |  | ||||||
| 		$height = (float) $config->height; |  | ||||||
| 		$width = (float) $config->width; |  | ||||||
| 		$add_all = Tools::toBool($config->add_all); |  | ||||||
| 		 |  | ||||||
| 		// Build manialink |  | ||||||
| 		$xml = Tools::newManialinkXml(self::ML_ADDFAVORITE); |  | ||||||
| 		 |  | ||||||
| 		$frameXml = $xml->addChild('frame'); |  | ||||||
| 		$frameXml->addAttribute('posn', $pos_x . ' ' . $pos_y); |  | ||||||
| 		 |  | ||||||
| 		// Background |  | ||||||
| 		$quadXml = $frameXml->addChild('quad'); |  | ||||||
| 		Tools::addAlignment($quadXml); |  | ||||||
| 		$quadXml->addAttribute('posn', '0 0 0'); |  | ||||||
| 		$quadXml->addAttribute('sizen', $width . ' ' . $height); |  | ||||||
| 		$quadXml->addAttribute('style', 'Bgs1InRace'); |  | ||||||
| 		$quadXml->addAttribute('substyle', 'BgTitleShadow'); |  | ||||||
| 		$quadXml->addAttribute('action', self::ML_ADDFAVORITE); |  | ||||||
| 		 |  | ||||||
| 		// Heart |  | ||||||
| 		$quadXml = $frameXml->addChild('quad'); |  | ||||||
| 		Tools::addAlignment($quadXml); |  | ||||||
| 		$quadXml->addAttribute('id', 'Quad_AddFavorite'); |  | ||||||
| 		$quadXml->addAttribute('posn', '0 0 1'); |  | ||||||
| 		$quadXml->addAttribute('sizen', ($width - 1.) . ' ' . ($height - 0.8)); |  | ||||||
| 		$quadXml->addAttribute('style', 'Icons64x64_1'); |  | ||||||
| 		$quadXml->addAttribute('substyle', 'StateFavourite'); |  | ||||||
| 		$quadXml->addAttribute('scriptevents', '1'); |  | ||||||
| 		 |  | ||||||
| 		// Tooltip |  | ||||||
| 		$tooltipFrameXml = $frameXml->addChild('frame'); |  | ||||||
| 		$tooltipFrameXml->addAttribute('id', 'Frame_FavoriteTooltip'); |  | ||||||
| 		$tooltipFrameXml->addAttribute('posn', '0 ' . ($pos_y >= 0 ? '-' : '') . '13'); |  | ||||||
| 		$tooltipFrameXml->addAttribute('hidden', '1'); |  | ||||||
| 		 |  | ||||||
| 		$quadXml = $tooltipFrameXml->addChild('quad'); |  | ||||||
| 		Tools::addAlignment($quadXml); |  | ||||||
| 		$quadXml->addAttribute('posn', '0 0 2'); |  | ||||||
| 		$quadXml->addAttribute('sizen', '28 16'); |  | ||||||
| 		$quadXml->addAttribute('style', 'Bgs1InRace'); |  | ||||||
| 		$quadXml->addAttribute('substyle', 'BgTitleShadow'); |  | ||||||
| 		 |  | ||||||
| 		$labelXml = $tooltipFrameXml->addChild('label'); |  | ||||||
| 		Tools::addAlignment($labelXml); |  | ||||||
| 		Tools::addTranslate($labelXml); |  | ||||||
| 		$labelXml->addAttribute('posn', '0 0 3'); |  | ||||||
| 		$labelXml->addAttribute('sizen', '26 0'); |  | ||||||
| 		$labelXml->addAttribute('style', 'TextTitle1'); |  | ||||||
| 		$labelXml->addAttribute('textsize', '2'); |  | ||||||
| 		$labelXml->addAttribute('autonewline', '1'); |  | ||||||
| 		$countText = ''; |  | ||||||
| 		if ($add_all) { |  | ||||||
| 			$count = count($this->gameServer) + count($this->lobbies); |  | ||||||
| 			$countText = 'all ' . $count . ' '; |  | ||||||
| 		} |  | ||||||
| 		$labelXml->addAttribute('text', 'Add ' . $countText . 'server to Favorite!'); |  | ||||||
| 		 |  | ||||||
| 		// Script for tooltip |  | ||||||
| 		$script = ' |  | ||||||
| declare Frame_FavoriteTooltip <=> (Page.GetFirstChild("Frame_FavoriteTooltip") as CMlFrame); |  | ||||||
| while (True) { |  | ||||||
| 	yield; |  | ||||||
| 	foreach (Event in PendingEvents) { |  | ||||||
| 		switch (Event.Type) { |  | ||||||
| 			case CMlEvent::Type::MouseOver: { |  | ||||||
| 				switch (Event.ControlId) { |  | ||||||
| 					case "Quad_AddFavorite": { |  | ||||||
| 						Frame_FavoriteTooltip.Visible = True; |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			case CMlEvent::Type::MouseOut: { |  | ||||||
| 				switch (Event.ControlId) { |  | ||||||
| 					case "Quad_AddFavorite": { |  | ||||||
| 						Frame_FavoriteTooltip.Visible = False; |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| }'; |  | ||||||
| 		$xml->addChild('script', $script); |  | ||||||
| 		 |  | ||||||
| 		$this->manialinks[self::ML_ADDFAVORITE] = $xml; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ?> |  | ||||||
| 	 |  | ||||||
							
								
								
									
										28
									
								
								application/plugins/testPlugin.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								application/plugins/testPlugin.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | namespace ManiaControl; | ||||||
|  |  | ||||||
|  | class TestPlugin extends Plugin { | ||||||
|  |  | ||||||
|  | 	public function __construct(ManiaControl $maniaControl) { | ||||||
|  | 		$this->maniaControl = $maniaControl; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function getAuthor() { | ||||||
|  | 		return 'steeffeen'; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function getName() { | ||||||
|  | 		return 'Test Plugin'; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function getVersion() { | ||||||
|  | 		return '1.0'; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public function getDescription() { | ||||||
|  | 		return 'Dummy plugin for testing plugin handling'; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ?> | ||||||
| @@ -1,11 +1,9 @@ | |||||||
| <?php | <?php | ||||||
| 
 | 
 | ||||||
| namespace ManiaControl; | use ManiaControl\ManiaControl; | ||||||
| 
 | // Define base dir
 | ||||||
| define('ManiaControlDir', __DIR__); | define('ManiaControlDir', __DIR__); | ||||||
| 
 | 
 | ||||||
| require_once __DIR__ . '/core/core.php'; |  | ||||||
| 
 |  | ||||||
| // Set process settings
 | // Set process settings
 | ||||||
| ini_set('memory_limit', '128M'); | ini_set('memory_limit', '128M'); | ||||||
| if (function_exists('date_default_timezone_get') && function_exists('date_default_timezone_set')) { | if (function_exists('date_default_timezone_get') && function_exists('date_default_timezone_set')) { | ||||||
| @@ -17,10 +15,13 @@ ini_set('log_errors', 1); | |||||||
| ini_set('error_reporting', -1); | ini_set('error_reporting', -1); | ||||||
| ini_set('error_log', 'ManiaControl_' . getmypid() . '.log'); | ini_set('error_log', 'ManiaControl_' . getmypid() . '.log'); | ||||||
| 
 | 
 | ||||||
|  | // Load ManiaControl class
 | ||||||
|  | require_once __DIR__ . '/core/maniaControl.php'; | ||||||
|  | 
 | ||||||
| // Start ManiaControl
 | // Start ManiaControl
 | ||||||
| error_log('Loading ManiaControl v' . ManiaControl::VERSION . '!'); | error_log('Loading ManiaControl v' . ManiaControl::VERSION . '...'); | ||||||
| 
 | 
 | ||||||
| $maniaControl = new ManiaControl(); | $maniaControl = new ManiaControl(); | ||||||
| $maniaControl->run(true); | $maniaControl->run(); | ||||||
| 
 | 
 | ||||||
| ?>
 | ?>
 | ||||||
		Reference in New Issue
	
	Block a user