ManiacontrolPlugins/MatchManagerSuite/MatchManagerAutomaticLauncher.php
2022-04-03 21:09:26 +02:00

175 lines
5.2 KiB
PHP

<?php
namespace MatchManagerSuite;
use ManiaControl\Callbacks\CallbackListener;
use ManiaControl\Logger;
use ManiaControl\ManiaControl;
use ManiaControl\Plugins\Plugin;
use ManiaControl\Plugins\PluginManager;
use ManiaControl\Settings\Setting;
use ManiaControl\Settings\SettingManager;
use ManiaControl\Callbacks\TimerListener;
if (!class_exists('MatchManagerSuite\MatchManagerCore')) {
$this->maniaControl->getChat()->sendErrorToAdmins('MatchManager Core is required to use one of MatchManager plugin. Install it and restart Maniacontrol');
Logger::logError('MatchManager Core is required to use one of MatchManager plugin. Install it and restart Maniacontrol');
return false;
}
/**
* MatchManager Automatic Launcher
*
* @author Beu
* @license http://www.gnu.org/licenses/ GNU General Public License, Version 3
*/
class MatchManagerAutomaticLauncher implements CallbackListener, TimerListener, Plugin {
/*
* Constants
*/
const PLUGIN_ID = 172;
const PLUGIN_VERSION = 1.1;
const PLUGIN_NAME = 'MatchManager Automatic Launcher';
const PLUGIN_AUTHOR = 'Beu';
// MatchManagerWidget Properties
const MATCHMANAGERCORE_PLUGIN = 'MatchManagerSuite\MatchManagerCore';
const SETTING_TIMESTAMPS_START_MATCHES = 'Timestamps of the start of the matches:';
/*
* Private properties
*/
/** @var ManiaControl $maniaControl */
private $maniaControl = null;
private $MatchManagerCore = null;
/**
* @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 launch matches with timestamps';
}
/**
* @param \ManiaControl\ManiaControl $maniaControl
* @return bool
* @see \ManiaControl\Plugins\Plugin::load()
*/
public function load(ManiaControl $maniaControl) {
// Init plugin
$this->maniaControl = $maniaControl;
if ($this->maniaControl->getPluginManager()->getSavedPluginStatus(self::MATCHMANAGERCORE_PLUGIN)) {
// plugin are loaded in alphabetic order, just wait 1 sec before trying to load MatchManager Core
$this->maniaControl->getTimerManager()->registerOneTimeListening($this, function () {
$this->MatchManagerCore = $this->maniaControl->getPluginManager()->getPlugin(self::MATCHMANAGERCORE_PLUGIN);
if ($this->MatchManagerCore == null) {
$this->maniaControl->getChat()->sendErrorToAdmins('MatchManager Core is needed to use ' . self::PLUGIN_NAME . ' plugin.');
$this->maniaControl->getPluginManager()->deactivatePlugin((get_class()));
} else {
$this->createTimers();
}
}, 1000);
} else {
throw new \Exception('MatchManager Core is needed to use ' . self::PLUGIN_NAME);
}
$this->maniaControl->getCallbackManager()->registerCallbackListener(PluginManager::CB_PLUGIN_UNLOADED, $this, 'handlePluginUnloaded');
$this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'updateSettings');
$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_TIMESTAMPS_START_MATCHES, "", "Comma separated of the start of the matches");
return true;
}
/**
* @see \ManiaControl\Plugins\Plugin::unload()
*/
public function unload() {
}
/**
* Update Widgets on Setting Changes
*
* @param Setting $setting
*/
public function updateSettings(Setting $setting) {
if ($setting->belongsToClass($this)) {
$this->createTimers();
}
}
/**
* handlePluginUnloaded
*
* @param string $pluginClass
* @param Plugin $plugin
* @return void
*/
public function handlePluginUnloaded(string $pluginClass, Plugin $plugin) {
if ($pluginClass == self::MATCHMANAGERCORE_PLUGIN) {
$this->maniaControl->getChat()->sendErrorToAdmins(self::PLUGIN_NAME . " disabled because MatchManager Core is now disabled");
$this->maniaControl->getPluginManager()->deactivatePlugin((get_class()));
}
}
/**
* createTimers
*
* @return void
*/
private function createTimers() {
$this->maniaControl->getTimerManager()->unregisterTimerListenings($this);
$timestamps = explode(",", $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_TIMESTAMPS_START_MATCHES));
$now = time();
$newtimers = 0;
foreach ($timestamps as $timestamp) {
if ($now < $timestamp) {
$delta = ($timestamp - $now) * 1000;
$this->maniaControl->getTimerManager()->registerOneTimeListening($this, function () {
$this->MatchManagerCore->MatchStart();
}, $delta);
$newtimers++;
}
}
$this->maniaControl->getChat()->sendSuccessToAdmins($newtimers . " matches are planned");
}
}