212 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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;
 | |
|     }
 | |
| }
 |