2024-05-15 01:34:30 +02:00
< ? 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 ;
2025-02-17 11:29:04 +01:00
const PLUGIN_VERSION = 1.1 ;
2024-05-15 01:34:30 +02:00
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 );
2025-02-17 11:29:04 +01:00
try {
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 ;
}
} catch ( \Throwable $th ) {
$this -> maniaControl -> getChat () -> sendErrorToAdmins ( " Can't apply action on " . $player -> nickname . " : " . $th -> getMessage ());
Logger :: logError ( " Can't apply action on " . $player -> nickname . " : " . $th -> getMessage ());
2024-05-15 01:34:30 +02:00
}
}
/**
* 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 ;
}
}