add OpenplanetDetector
This commit is contained in:
		
							
								
								
									
										211
									
								
								Beu/OpenplanetDetector.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										211
									
								
								Beu/OpenplanetDetector.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,211 @@ | ||||
| <?php | ||||
| namespace Beu; | ||||
|  | ||||
| use Exception; | ||||
| use ManiaControl\ManiaControl; | ||||
| use ManiaControl\Plugins\Plugin; | ||||
| use ManiaControl\Logger; | ||||
| use ManiaControl\Callbacks\CallbackListener; | ||||
| use ManiaControl\Manialinks\ManialinkPageAnswerListener; | ||||
| use ManiaControl\Players\Player; | ||||
| use ManiaControl\Players\PlayerManager; | ||||
| use Maniaplanet\DedicatedServer\InvalidArgumentException; | ||||
|  | ||||
| /** | ||||
|  * OpenplanetDetector | ||||
|  * | ||||
|  * @author	Beu | ||||
|  * @license   http://www.gnu.org/licenses/ GNU General Public License, Version 3 | ||||
|  */ | ||||
| class OpenplanetDetector implements ManialinkPageAnswerListener, CallbackListener, Plugin { | ||||
| 	/* | ||||
| 	* Constants | ||||
| 	*/ | ||||
| 	const PLUGIN_ID			= 203; | ||||
| 	const PLUGIN_VERSION	= 1.0; | ||||
| 	const PLUGIN_NAME		= 'Openplanet Detector'; | ||||
| 	const PLUGIN_AUTHOR		= 'Beu'; | ||||
|  | ||||
|     const SETTING_SIGNATURE_BLACKLIST   = 'Openplanet Signature blacklist'; | ||||
|     const SETTING_SIGNATURE_WHITELIST   = 'Openplanet Signature whitelist'; | ||||
|     const SETTING_ACTION                = 'Action for player'; | ||||
|  | ||||
|     const ACTION_KICK                   = 'kick'; | ||||
|     const ACTION_FORCE_AS_SPEC          = 'force as spec'; | ||||
|  | ||||
| 	/* | ||||
| 	 * Private properties | ||||
| 	 */ | ||||
| 	/** @var ManiaControl $maniaControl */ | ||||
| 	private $maniaControl	= null; | ||||
|  | ||||
|     private $manialink = null; | ||||
|  | ||||
| 	/** | ||||
| 	 * @see \ManiaControl\Plugins\Plugin::prepare() | ||||
| 	 */ | ||||
| 	public static function prepare(ManiaControl $maniaControl) { | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @see \ManiaControl\Plugins\Plugin::getId() | ||||
| 	 */ | ||||
| 	public static function getId() { | ||||
| 		return self::PLUGIN_ID; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @see \ManiaControl\Plugins\Plugin::getName() | ||||
| 	 */ | ||||
| 	public static function getName() { | ||||
| 		return self::PLUGIN_NAME; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @see \ManiaControl\Plugins\Plugin::getVersion() | ||||
| 	 */ | ||||
| 	public static function getVersion() { | ||||
| 		return self::PLUGIN_VERSION; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @see \ManiaControl\Plugins\Plugin::getAuthor() | ||||
| 	 */ | ||||
| 	public static function getAuthor() { | ||||
| 		return self::PLUGIN_AUTHOR; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @see \ManiaControl\Plugins\Plugin::getDescription() | ||||
| 	 */ | ||||
| 	public static function getDescription() { | ||||
| 		return "Detect Openplanet and allow to force as spec and kick players"; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @see \ManiaControl\Plugins\Plugin::load() | ||||
| 	 */ | ||||
| 	public function load(ManiaControl $maniaControl) { | ||||
| 		$this->maniaControl = $maniaControl; | ||||
|         $this->manialink = $this->getManialink(); | ||||
|  | ||||
|         $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_SIGNATURE_BLACKLIST, "DEVMODE", "Comma separated signature banned (Only used is whitelist is empty)"); | ||||
|         $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_SIGNATURE_WHITELIST, "", "Comma separated signature allowed."); | ||||
|         $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_ACTION, [self::ACTION_FORCE_AS_SPEC, self::ACTION_KICK], ""); | ||||
|  | ||||
|         $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerConnect'); | ||||
|         $this->maniaControl->getManialinkManager()->registerManialinkPageAnswerRegexListener('/^Maniacontrol.OpenplanetDetector:/', $this, 'handleOpenplanetSignature'); | ||||
|  | ||||
|         $this->maniaControl->getManialinkManager()->sendManialink($this->manialink); | ||||
| 	} | ||||
|  | ||||
|     /** | ||||
|      * handleOpenplanetSignature | ||||
|      *  | ||||
|      * @param array $callback  | ||||
|      * @param Player $player  | ||||
|      * @return void  | ||||
|      */ | ||||
|     public function handleOpenplanetSignature(array $callback, Player $player) { | ||||
|         $whitelist = array_filter(explode(',', $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_SIGNATURE_WHITELIST))); | ||||
|         $signature = explode(':', $callback[1][2])[1]; | ||||
|         if ($signature === "") $signature = "REGULAR"; | ||||
|  | ||||
|         if (count($whitelist) > 0) { | ||||
|             if (!in_array($signature, $whitelist)) { | ||||
|                 $this->triggerAction($player, $signature); | ||||
|             } | ||||
|         } else { | ||||
|             $blacklist = array_filter(explode(',', $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_SIGNATURE_BLACKLIST))); | ||||
|              | ||||
|             if (in_array($signature, $blacklist)) { | ||||
|                 $this->triggerAction($player, $signature); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * triggerAction | ||||
|      *  | ||||
|      * @param Player $player  | ||||
|      * @param string $signature  | ||||
|      * @return void  | ||||
|      * @throws InvalidArgumentException  | ||||
|      */ | ||||
|     private function triggerAction(Player $player, string $signature) { | ||||
|         $this->maniaControl->getChat()->sendInformationToAdmins("Player ". $player->nickname ." has the wrong Openplanet Signature: " . $signature); | ||||
|         Logger::log("Player ". $player->nickname ." has the wrong Openplanet Signature: " . $signature); | ||||
|  | ||||
|         switch ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_ACTION)) { | ||||
|             case self::ACTION_FORCE_AS_SPEC: | ||||
|                 $this->maniaControl->getClient()->forceSpectator($player->login, 1); | ||||
|                 $this->maniaControl->getChat()->sendInformation("Your Openplanet signature is not allowed. Change it and try to re-join the server", $player->login); | ||||
|                 break; | ||||
|             case self::ACTION_KICK: | ||||
|                 $this->maniaControl->getClient()->kick($player->login, "Your Openplanet signature is not allowed. Change it and try to re-join the server"); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| 	 * Handle when a player connects | ||||
| 	 *  | ||||
| 	 * @param Player $player | ||||
| 	 */ | ||||
| 	public function handlePlayerConnect(Player $player) { | ||||
|         $this->maniaControl->getManialinkManager()->sendManialink($this->manialink, $player->login); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Unload the plugin and its Resources | ||||
| 	 */ | ||||
| 	public function unload() {} | ||||
|  | ||||
|     /** | ||||
|      * getManialink | ||||
|      *  | ||||
|      * @return string  | ||||
|      */ | ||||
|     private function getManialink() { | ||||
|         return <<<'EOD' | ||||
| <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||||
| <manialink version="3" id="Maniacontrol.OpenplanetDetector" name="Maniacontrol.OpenplanetDetector"> | ||||
| <script><!-- | ||||
| #Include "TextLib" as TL | ||||
|  | ||||
| Boolean GetOpenplanet() { | ||||
|     return (TL::RegexFind("^Openplanet ", System.ExtraTool_Info, "").count > 0); | ||||
| } | ||||
| Text GetOpenplanetSignature() { | ||||
|     if (GetOpenplanet()) { | ||||
|         declare Text[] SignatureMode = TL::RegexMatch(" \\[([A-Z]*)\\]$", System.ExtraTool_Info, ""); | ||||
|         if (SignatureMode.count >= 2) { | ||||
|             return SignatureMode[1]; | ||||
|         } | ||||
|     }  | ||||
|  | ||||
|     return ""; | ||||
| } | ||||
|  | ||||
| main () { | ||||
|     log("Init Maniacontrol.OpenplanetDetector"); | ||||
|     wait(InputPlayer != Null); | ||||
|  | ||||
|     declare Text Last_ExtraTool_Info; | ||||
|  | ||||
|     while (True) { | ||||
|         yield; | ||||
|         if (Last_ExtraTool_Info != System.ExtraTool_Info) { | ||||
|             Last_ExtraTool_Info = System.ExtraTool_Info; | ||||
|  | ||||
|             if (GetOpenplanet()) { | ||||
|                 TriggerPageAction("Maniacontrol.OpenplanetDetector:" ^ GetOpenplanetSignature()); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| --></script> | ||||
| </manialink> | ||||
| EOD; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user