144 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Beu;
 | |
| 
 | |
| use ManiaControl\ManiaControl;
 | |
| use ManiaControl\Callbacks\CallbackListener;
 | |
| use ManiaControl\Callbacks\TimerListener;
 | |
| use ManiaControl\Logger;
 | |
| use ManiaControl\Plugins\Plugin;
 | |
| 
 | |
| /**
 | |
|  * GSheetRecords
 | |
|  *
 | |
|  * @author		Beu
 | |
|  * @license		http://www.gnu.org/licenses/ GNU General Public License, Version 3
 | |
|  */
 | |
| class AutomaticMapSwitcher implements TimerListener, CallbackListener, Plugin {
 | |
| 	/*
 | |
| 	 * Constants
 | |
| 	 */
 | |
| 	const PLUGIN_ID											= 208;
 | |
| 	const PLUGIN_VERSION									= 1;
 | |
| 	const PLUGIN_NAME										= 'AutomaticMapSwitcher';
 | |
| 	const PLUGIN_AUTHOR										= 'Beu';
 | |
| 
 | |
|     const SETTING_SCHEDULE                                  = 'Map schedule';
 | |
|     const SETTING_DEBOUCEMAPCHANGEDELAY                     = 'Debounce map change delay';
 | |
| 
 | |
| 	/*
 | |
| 	 * Private properties
 | |
| 	 */
 | |
| 	private ManiaControl $maniaControl;
 | |
|     private int $debounceMapChangeTime = 0;
 | |
| 
 | |
| 	/**
 | |
| 	 * @param \ManiaControl\ManiaControl $maniaControl
 | |
| 	 * @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 'Automatic change map based on timestamp';
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param \ManiaControl\ManiaControl $maniaControl
 | |
| 	 * @return bool
 | |
| 	 * @see \ManiaControl\Plugins\Plugin::load()
 | |
| 	 */
 | |
| 	public function load(ManiaControl $maniaControl) {
 | |
| 		$this->maniaControl = $maniaControl;
 | |
| 
 | |
|         $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_SCHEDULE, '', 'format: "timestamp:mapuid,timestamp:mapuid"');
 | |
|         $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_DEBOUCEMAPCHANGEDELAY, 30, 'delay between 2 map change requests', 110);
 | |
| 
 | |
|         $this->maniaControl->getTimerManager()->registerTimerListening($this, 'handle1Second', 1000);
 | |
|     }
 | |
| 
 | |
| 	/**
 | |
| 	 * @see \ManiaControl\Plugins\Plugin::unload()
 | |
| 	 */
 | |
| 	public function unload() {
 | |
| 	}
 | |
| 
 | |
|     /**
 | |
|      * handle1Second
 | |
|      * @return void 
 | |
|      */
 | |
|     public function handle1Second() {
 | |
|         $now = time();
 | |
|         if ($this->debounceMapChangeTime > $now) return;
 | |
| 
 | |
|         $schedule = trim($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_SCHEDULE));
 | |
|         if ($schedule === '') return;
 | |
|         
 | |
|         
 | |
|         $matchingTimestamp = -1;
 | |
|         $matchingMapUid = '';
 | |
|         foreach (explode(',', $schedule) as $pair) {
 | |
|             list($timestampText, $mapuid) = explode(':', $pair);
 | |
| 
 | |
|             if (!is_numeric($timestampText)) {
 | |
|                 $this->maniaControl->getChat()->sendErrorToAdmins('invalid timestamp in pair: '. $pair);
 | |
|                 Logger::logWarning('invalid timestamp in pair: '. $pair);
 | |
|                 continue;
 | |
|             }
 | |
|             $timestamp = intval($timestampText);
 | |
| 
 | |
|             if ($this->maniaControl->getMapManager()->getMapByUid($mapuid) === null) {
 | |
|                 $this->maniaControl->getChat()->sendErrorToAdmins('map not loaded in pair: '. $pair);
 | |
|                 Logger::logWarning('map not loaded in pair: '. $pair);
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             if ($matchingTimestamp < $timestamp && $now > $timestamp) {
 | |
|                 $matchingTimestamp = $timestamp;
 | |
|                 $matchingMapUid = $mapuid;
 | |
|             }
 | |
|             
 | |
|         }
 | |
| 
 | |
|         if ($matchingMapUid !== '' && $matchingMapUid !== $this->maniaControl->getMapManager()->getCurrentMap()->uid) {
 | |
|             $this->debounceMapChangeTime = time() + $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_DEBOUCEMAPCHANGEDELAY);
 | |
| 
 | |
|             $nextmap = $this->maniaControl->getMapManager()->getMapByUid($matchingMapUid);
 | |
| 
 | |
|             $this->maniaControl->getChat()->sendSuccess('Automatic switching to map: $z'. $nextmap->name);
 | |
|             Logger::logWarning('Automatic switching to map: '. $matchingMapUid);
 | |
|             $this->maniaControl->getMapManager()->getMapActions()->skipToMapByUid($matchingMapUid);
 | |
|         }
 | |
|     }
 | |
| } |