Multiple Features to improve ManiaControl usability (#234)

* ServerUIPropertiesMenu for Configurator to edit builtin UIProperties of MP

* fixed unregister-functions of CallbackManager

* Reducing menuItemHeight in Configurator to avoid overlapping of the menu items

* Fully rebuild the admins menu after a player rights changed

* Added function to FileUtil to improve realpath, so symbolic links can be resolved

* Fixed indentation

* Update FileUtil.php

Fixed error in case of an absolute path on Unix-like systems.

* New CallQueue which runs once inbetween the MC-loops

* Added important queued call to be executed earlier

* ErrorMethod made optional, as in some cases, there might be nothing to fail

* Clean up repository from unnecessary files

* Added easy installation script for DB on Unix-like systems

* Replaced deprecated is_real by is_float

* Add milliseconds with dot instead of double colon

* Resolved deprecated curly braces error

* gitignore all hidden files (except git and gitignore)

* Update MC-update-check-interval, so that a restart is not required

* Update gitignore to not ignore changes in MCTeam-Plugins

* Update gitignore again

* And another try

* fixed MasterAdmin //delrec, added personal /delrec-command with permission-setting

* Increase version number of local records plugin

* Add Permission to delete any record

* Reworked notifications of locals, removed private only, added private at rank

* Fix formatting

* Allow AuthenticationManager to store Plugin Permissions

* Method to check, if a named function call is already queued

* Added command disable feature

* Reset timer if DeltaTime updated, so it does not try to catch up missed timings

* Added private notification setting

* To reduce load of multiple records (especially in rounds), queue call chat notifications

* Added internal function to plugin manager to return plugin menu

* restore .idea codestyle files

* Update MC-Version number to 0.250
This commit is contained in:
axelalex2
2020-02-24 17:20:51 +01:00
committed by GitHub
parent 9252605be0
commit fa7ea9f4f3
18 changed files with 700 additions and 91 deletions

View File

@ -14,6 +14,7 @@ use ManiaControl\Logger;
use ManiaControl\ManiaControl;
use ManiaControl\Players\Player;
use ManiaControl\Players\PlayerManager;
use ManiaControl\Plugins\Plugin;
use ManiaControl\Settings\Setting;
/**
@ -133,8 +134,10 @@ class AuthenticationManager implements CallbackListener, EchoListener, Communica
return self::AUTH_NAME_ADMIN;
case self::AUTH_LEVEL_MODERATOR:
return self::AUTH_NAME_MODERATOR;
case self::AUTH_LEVEL_PLAYER:
return self::AUTH_NAME_PLAYER;
}
return self::AUTH_NAME_PLAYER;
return '-';
}
/**
@ -172,8 +175,10 @@ class AuthenticationManager implements CallbackListener, EchoListener, Communica
return self::AUTH_LEVEL_ADMIN;
case self::AUTH_NAME_MODERATOR:
return self::AUTH_LEVEL_MODERATOR;
case self::AUTH_NAME_PLAYER:
return self::AUTH_LEVEL_PLAYER;
}
return self::AUTH_LEVEL_PLAYER;
return -1;
}
/**
@ -420,7 +425,21 @@ class AuthenticationManager implements CallbackListener, EchoListener, Communica
*/
public function checkPermission(Player $player, $rightName) {
$right = $this->maniaControl->getSettingManager()->getSettingValue($this, $rightName);
return $this->checkRight($player, $this->getAuthLevel($right));
return self::checkRight($player, self::getAuthLevel($right));
}
/**
* Checks the permission by a right name
*
* @api
* @param Plugin $plugin
* @param Player $player
* @param $rightName
* @return bool
*/
public function checkPluginPermission(Plugin $plugin, Player $player, $rightName) {
$right = $this->maniaControl->getSettingManager()->getSettingValue($plugin, $rightName);
return self::checkRight($player, self::getAuthLevel($right));
}
/**
@ -429,9 +448,23 @@ class AuthenticationManager implements CallbackListener, EchoListener, Communica
* @api
* @param string $rightName
* @param int $authLevelNeeded
* @param string $authLevelsAllowed
*/
public function definePermissionLevel($rightName, $authLevelNeeded) {
$this->maniaControl->getSettingManager()->initSetting($this, $rightName, self::getPermissionLevelNameArray($authLevelNeeded));
public function definePermissionLevel($rightName, $authLevelNeeded, $authLevelsAllowed = self::AUTH_LEVEL_MODERATOR) {
$this->maniaControl->getSettingManager()->initSetting($this, $rightName, self::getPermissionLevelNameArray($authLevelNeeded, $authLevelsAllowed));
}
/**
* Define a Minimum Right Level needed for an Action
*
* @api
* @param Plugin $plugin
* @param string $rightName
* @param int $authLevelNeeded
* @param string $authLevelsAllowed
*/
public function definePluginPermissionLevel(Plugin $plugin, $rightName, $authLevelNeeded, $authLevelsAllowed = self::AUTH_LEVEL_MODERATOR) {
$this->maniaControl->getSettingManager()->initSetting($plugin, $rightName, self::getPermissionLevelNameArray($authLevelNeeded, $authLevelsAllowed));
}
/**
@ -439,19 +472,70 @@ class AuthenticationManager implements CallbackListener, EchoListener, Communica
*
* @api
* @param $authLevelNeeded
* @param $authLevelsAllowed
* @return array[]
*/
public static function getPermissionLevelNameArray($authLevelNeeded) {
switch ($authLevelNeeded) {
public static function getPermissionLevelNameArray($authLevelNeeded, $authLevelsAllowed = self::AUTH_LEVEL_MODERATOR) {
assert($authLevelNeeded >= $authLevelsAllowed);
switch ($authLevelsAllowed) {
case self::AUTH_LEVEL_PLAYER:
switch ($authLevelNeeded) {
case self::AUTH_LEVEL_PLAYER:
return array(self::AUTH_NAME_PLAYER, self::AUTH_NAME_MODERATOR, self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN);
case self::AUTH_LEVEL_MODERATOR:
return array(self::AUTH_NAME_MODERATOR, self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_PLAYER);
case self::AUTH_LEVEL_ADMIN:
return array(self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_PLAYER, self::AUTH_NAME_MODERATOR);
case self::AUTH_LEVEL_SUPERADMIN:
return array(self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_PLAYER, self::AUTH_NAME_MODERATOR, self::AUTH_NAME_ADMIN);
case self::AUTH_LEVEL_MASTERADMIN:
return array(self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_PLAYER, self::AUTH_NAME_MODERATOR, self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN);
}
break;
case self::AUTH_LEVEL_MODERATOR:
return array(self::AUTH_NAME_MODERATOR, self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN);
switch ($authLevelNeeded) {
case self::AUTH_LEVEL_MODERATOR:
return array(self::AUTH_NAME_MODERATOR, self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN);
case self::AUTH_LEVEL_ADMIN:
return array(self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_MODERATOR);
case self::AUTH_LEVEL_SUPERADMIN:
return array(self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_MODERATOR, self::AUTH_NAME_ADMIN);
case self::AUTH_LEVEL_MASTERADMIN:
return array(self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_MODERATOR, self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN);
}
break;
case self::AUTH_LEVEL_ADMIN:
return array(self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_MODERATOR);
switch ($authLevelNeeded) {
case self::AUTH_LEVEL_ADMIN:
return array(self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN);
case self::AUTH_LEVEL_SUPERADMIN:
return array(self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_ADMIN);
case self::AUTH_LEVEL_MASTERADMIN:
return array(self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN);
}
break;
case self::AUTH_LEVEL_SUPERADMIN:
return array(self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_MODERATOR, self::AUTH_NAME_ADMIN);
switch ($authLevelNeeded) {
case self::AUTH_LEVEL_SUPERADMIN:
return array(self::AUTH_NAME_SUPERADMIN, self::AUTH_NAME_MASTERADMIN);
case self::AUTH_LEVEL_MASTERADMIN:
return array(self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_SUPERADMIN);
}
break;
// just for completeness, should not be used this way
case self::AUTH_LEVEL_MASTERADMIN:
return array(self::AUTH_NAME_MASTERADMIN, self::AUTH_NAME_MODERATOR, self::AUTH_NAME_ADMIN, self::AUTH_NAME_SUPERADMIN);
switch ($authLevelNeeded) {
case self::AUTH_LEVEL_MASTERADMIN:
return array(self::AUTH_NAME_MASTERADMIN);
}
break;
}
return array("-");
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace ManiaControl\Callbacks;
/**
* Interface for CallQueueListener
*
* @author ManiaControl Team <mail@maniacontrol.com>
* @copyright 2014-2019 ManiaControl Team
* @license http://www.gnu.org/licenses/ GNU General Public License, Version 3
*/
interface CallQueueListener {
}

View File

@ -0,0 +1,69 @@
<?php
namespace ManiaControl\Callbacks;
use ManiaControl\General\UsageInformationAble;
use ManiaControl\General\UsageInformationTrait;
/**
* Model Class for a Call Queue Listening
*
* @author ManiaControl Team <mail@maniacontrol.com>
* @copyright 2014-2019 ManiaControl Team
* @license http://www.gnu.org/licenses/ GNU General Public License, Version 3
*/
class CallQueueListening extends Listening implements UsageInformationAble {
use UsageInformationTrait;
private $errorMethod = null;
/**
* Construct a new Call Queue Listening
*
* @param CallQueueListener $listener
* @param mixed $method
* @param mixed $errorMethod
*/
public function __construct(CallQueueListener $listener, $method, $errorMethod) {
parent::__construct($listener, $method);
if ($errorMethod != null) {
$this->errorMethod = array($listener, $errorMethod);
}
}
/**
* Trigger the Listener's Method
* @return bool
*/
public function triggerCallback() {
$params = func_get_args();
if ($this->triggerCallbackWithParams($params, false) === false) {
if ($this->$errorMethod != null) {
call_user_func($this->errorMethod, $this->method);
}
return false;
}
return true;
}
/**
* Trigger the Listener's Method with the given Array of Params
*
* @param array $params
* @return mixed
*/
public function triggerCallbackWithParams(array $params, bool $callErrorMethod = true) {
$result = call_user_func_array($this->getUserFunction(), $params);
if ($callErrorMethod && $result === false) {
if ($this->errorMethod != null) {
call_user_func($this->errorMethod, $this->getUserFunction());
}
return false;
}
return $result;
}
}

View File

@ -0,0 +1,117 @@
<?php
namespace ManiaControl\Callbacks;
use ManiaControl\General\UsageInformationAble;
use ManiaControl\General\UsageInformationTrait;
use ManiaControl\ManiaControl;
/**
* Class for managing queued calls.
*
* @author ManiaControl Team <mail@maniacontrol.com>
* @copyright 2014-2019 ManiaControl Team
* @license http://www.gnu.org/licenses/ GNU General Public License, Version 3
*/
class CallQueueManager implements UsageInformationAble {
use UsageInformationTrait;
/*
* Private properties
*/
/** @var ManiaControl $maniaControl */
private $maniaControl = null;
/** @var CallQueueListening[] $queueListenings */
private $queueListenings = array();
/**
* Construct a new Call Queue Manager
*
* @param ManiaControl $maniaControl
*/
public function __construct(ManiaControl $maniaControl) {
$this->maniaControl = $maniaControl;
}
/**
* Register a Call Queue Listening
*
* @param CallQueueListener $listener
* @param mixed $methods
* @param mixed $errorMethod
* @return bool
*/
public function registerListening(CallQueueListener $listener, $methods, $errorMethod = null, bool $important = false) {
if ($errorMethod != null && !CallQueueListening::checkValidCallback($listener, $errorMethod)) {
trigger_error("Given Listener (" . get_class($listener) . ") can't handle Queue Call Callback (No Error Method '{$errorMethod}')!");
return false;
}
if (!is_array($methods)) {
$methods = array($methods);
}
foreach ($methods as $method) {
if (!CallQueueListening::checkValidCallback($listener, $method)) {
trigger_error("Given Listener (" . get_class($listener) . ") can't handle Queue Call Callback (No Method '{$method}')!");
return false;
}
}
foreach ($methods as $method) {
// Build Call Queue Listening
$listening = new CallQueueListening($listener, $method, $errorMethod);
if ($important) {
$this->addImportantListening($listening);
} else {
$this->addListening($listening);
}
}
return true;
}
/**
* Adds an important Listening to the current list of managed queue calls at the front
*
* @param CallQueueListening $queueListening
*/
public function addImportantListening(CallQueueListening $queueListening) {
array_unshift($this->queueListenings, $queueListening);
}
/**
* Adds a Listening to the current list of managed queue calls at the end
*
* @param CallQueueListening $queueListening
*/
public function addListening(CallQueueListening $queueListening) {
array_push($this->queueListenings, $queueListening);
}
/**
* Checks, if one specific listening already has been queued for a call.
* Can only check for named functions.
* @param CallQueueListener $listener
* @param string $method
* @return bool
*/
public function hasListening(CallQueueListener $listener, string $method) {
foreach ($this->queueListenings as $listening) {
if ($listening->listener === $listener && $listening->method === $method) {
return true;
}
}
return false;
}
/**
* Manage one of the queued calls
*/
public function manageCallQueue() {
if (!empty($this->queueListenings)) {
$listening = array_shift($this->queueListenings);
$listening->triggerCallback();
}
}
}

View File

@ -57,6 +57,16 @@ class TimerListening extends Listening implements UsageInformationAble {
}
}
/**
* Set the deltaTime
*
* @param float $milliSeconds
*/
public function setDeltaTime($milliSeconds) {
$this->deltaTime = $milliSeconds / 1000.;
$this->lastTrigger = null;
}
/**
* Check if the desired Time is reached
*

View File

@ -75,6 +75,24 @@ class TimerManager implements UsageInformationAble {
array_push($this->timerListenings, $timerListening);
}
/**
* Update the deltaTime of a Timer Listening
*
* @param TimerListener $listener
* @param string|callable $method
* @param float $milliSeconds
*/
public function updateTimerListening(TimerListener $listener, $method, $milliSeconds) {
$updated = false;
foreach ($this->timerListenings as $key => &$listening) {
if ($listening->listener === $listener && $listening->method === $method) {
$listening->setDeltaTime($milliSeconds);
$updated = true;
}
}
return $updated;
}
/**
* Unregister a Timer Listening
*

View File

@ -28,8 +28,12 @@ class CommandManager implements CallbackListener, UsageInformationAble {
private $helpManager = array();
/** @var Listening[][] $commandListenings */
private $commandListenings = array();
/** @var CommandListener[][] $disabledCommands */
private $disabledCommands = array();
/** @var Listening[][] $adminCommandListenings */
private $adminCommandListenings = array();
/** @var CommandListener[][] $disabledAdminCommands */
private $disabledAdminCommands = array();
/**
* Construct a new Commands Manager
@ -116,6 +120,138 @@ class CommandManager implements CallbackListener, UsageInformationAble {
array_push($listeningsArray[$command], $listening);
}
/**
* Disable the command(s) by the given listener.
* The specific listener has to also manually reenable the commands, before the command can be used again.
* @param mixed $commandName
* @param bool $adminCommand
* @param CommandListener $listener
*/
public function disableCommand($commandName, bool $adminCommand, CommandListener $listener) {
if (is_array($commandName)) {
foreach ($commandName as $command) {
$this->disableCommand($command, $adminCommand, $listener);
}
return;
}
$command = strtolower(trim($commandName));
// first, check if the command actually exists
if (!array_key_exists($command, $this->commandListenings) && !array_key_exists($command, $this->adminCommandListenings)) {
return;
}
$disabledCommands = null;
if ($adminCommand) {
$disabledCommands = &$this->disabledAdminCommands;
} else {
$disabledCommands = &$this->disabledCommands;
}
if (!array_key_exists($command, $disabledCommands)) {
$disabledCommands[$command] = array();
}
if (!in_array($listener, $disabledCommands[$command])) {
array_push($disabledCommands[$command], $listener);
}
}
/**
* Enable the command(s) by the given listener.
* @param mixed $commandName
* @param bool $adminCommand
* @param CommandListener $listener
*/
public function enableCommand($commandName, bool $adminCommand, CommandListener $listener) {
if (is_array($commandName)) {
foreach ($commandName as $command) {
$this->enableCommand($command, $adminCommand, $listener);
}
return;
}
$command = strtolower(trim($commandName));
$disabledCommands = null;
if ($adminCommand) {
$disabledCommands = &$this->disabledAdminCommands;
} else {
$disabledCommands = &$this->disabledCommands;
}
if (!array_key_exists($command, $disabledCommands)) {
return;
}
if (($key = array_search($listener, $disabledCommands[$command])) !== false) {
unset($disabledCommands[$command][$key]);
if (empty($disabledCommands[$command])) {
unset($disabledCommands[$command]);
}
}
}
/**
* Checks if a command is enabled.
* @param mixed $commandName
* @param bool $adminCommand
* @return bool|array
*/
public function isCommandEnabled($commandName, bool $adminCommand) {
if (is_array($commandName)) {
$results = array();
foreach ($commandName as $command) {
array_push($results, $this->isCommandEnabled($command, $adminCommand));
}
$resultsUnique = array_unique($results);
if (count($resultsUnique) === 1) {
return $resultsUnique[0];
}
return $results;
}
$command = strtolower(trim($commandName));
$disabledCommands = null;
if ($adminCommand) {
$disabledCommands = &$this->disabledAdminCommands;
} else {
$disabledCommands = &$this->disabledCommands;
}
if (!array_key_exists($command, $disabledCommands)) {
return true;
}
// if the command is disabled, there should be at least one listener in the array
assert(!empty($disabledCommands[$command]));
return false;
}
/**
* Removes the given CommandListener blocking commands.
*
* @param array &$disabledCommands
* @param CommandListener $listener
* @return bool
*/
private function removeDisabledCommandListener(array &$disabledCommands, CommandListener $listener) {
$removed = false;
foreach ($disabledCommands as $command => $disableListeners) {
if (($key = array_search($listener, $disableListeners)) !== false) {
unset($disabledCommands[$command][$key]);
$removed = true;
if (empty($disabledCommands[$command])) {
unset($disabledCommands[$command]);
}
}
}
return $removed;
}
/**
* Unregister a Command Listener
*
@ -130,6 +266,12 @@ class CommandManager implements CallbackListener, UsageInformationAble {
if ($this->removeCommandListener($this->adminCommandListenings, $listener)) {
$removed = true;
}
if ($this->removeDisabledCommandListener($this->disabledCommands, $listener)) {
$removed = true;
}
if ($this->removeDisabledCommandListener($this->disabledAdminCommands, $listener)) {
$removed = true;
}
return $removed;
}
@ -178,9 +320,11 @@ class CommandManager implements CallbackListener, UsageInformationAble {
if (!$command) {
return;
}
$isAdminCommand = null;
if (substr($message, 0, 2) === '//' || $command === 'admin') {
// Admin command
$isAdminCommand = true;
$commandListenings = $this->adminCommandListenings;
if ($command === 'admin') {
@ -197,6 +341,7 @@ class CommandManager implements CallbackListener, UsageInformationAble {
$callback[1][2] = $message;
} else {
// User command
$isAdminCommand = false;
$commandListenings = $this->commandListenings;
}
@ -205,6 +350,12 @@ class CommandManager implements CallbackListener, UsageInformationAble {
return;
}
if (!$this->isCommandEnabled($command, $isAdminCommand)) {
$prefix = $isAdminCommand ? '//' : '/';
$this->maniaControl->getChat()->sendError('The command $<$fff'.$prefix.$command.'$> is currently disabled!', $player);
return;
}
// Inform command listeners
foreach ($commandListenings[$command] as $listening) {
/** @var Listening $listening */

View File

@ -8,6 +8,7 @@ use ManiaControl\Bills\BillManager;
use ManiaControl\Callbacks\CallbackListener;
use ManiaControl\Callbacks\CallbackManager;
use ManiaControl\Callbacks\Callbacks;
use ManiaControl\Callbacks\CallQueueManager;
use ManiaControl\Callbacks\EchoManager;
use ManiaControl\Callbacks\TimerListener;
use ManiaControl\Callbacks\TimerManager;
@ -52,7 +53,7 @@ class ManiaControl implements CallbackListener, CommandListener, TimerListener,
/*
* Constants
*/
const VERSION = '0.240';
const VERSION = '0.250';
const API_VERSION = '2013-04-16';
const MIN_DEDIVERSION = '2017-05-03_21_00';
const SCRIPT_TIMEOUT = 40;
@ -84,6 +85,10 @@ class ManiaControl implements CallbackListener, CommandListener, TimerListener,
* @see getCallbackManager()
*/
private $callbackManager = null;
/** @var CallQueueManager $callQueueManager
* @see getCallQueueManager()
*/
private $callQueueManager = null;
/** @var Chat $chat
* @see getChat()
*/
@ -180,6 +185,7 @@ class ManiaControl implements CallbackListener, CommandListener, TimerListener,
// Load ManiaControl Modules
$this->callbackManager = new CallbackManager($this);
$this->callQueueManager = new CallQueueManager($this);
$this->modeScriptEventManager = new ModeScriptEventManager($this);
$this->echoManager = new EchoManager($this);
$this->communicationManager = new CommunicationManager($this);
@ -298,6 +304,15 @@ class ManiaControl implements CallbackListener, CommandListener, TimerListener,
return $this->callbackManager;
}
/**
* Return the call queue manager
*
* @return CallQueueManager
*/
public function getCallQueueManager() {
return $this->callQueueManager;
}
/**
* Return the echo manager
*
@ -705,6 +720,9 @@ class ManiaControl implements CallbackListener, CommandListener, TimerListener,
// Manage callbacks
$this->getCallbackManager()->manageCallbacks();
// Manage queued calls
$this->getCallQueueManager()->manageCallQueue();
// Manage async file reader
$this->getFileReader()->appendData();

View File

@ -561,6 +561,14 @@ class PluginManager {
$asyncHttpRequest->getData();
}
/**
* @internal
* @return \ManiaControl\Plugins\PluginMenu
*/
public function getPluginMenu() {
return $this->pluginMenu;
}
/**
* @internal
* @return \ManiaControl\Plugins\InstallMenu

View File

@ -111,7 +111,7 @@ class Setting implements UsageInformationAble {
if (is_int($value)) {
return self::TYPE_INT;
}
if (is_real($value)) {
if (is_float($value)) {
return self::TYPE_REAL;
}
if (is_bool($value)) {

View File

@ -237,7 +237,7 @@ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener,
}
//Slice Array to chunk length
$statRankings[$order] = array_slice($statRankings{$order}, $playerBeginIndex, self::MAX_PAGES_PER_CHUNK * self::MAX_PLAYERS_PER_PAGE, true);
$statRankings[$order] = array_slice($statRankings[$order], $playerBeginIndex, self::MAX_PAGES_PER_CHUNK * self::MAX_PLAYERS_PER_PAGE, true);
$pageNumber = 1 + $chunkIndex * self::MAX_PAGES_PER_CHUNK;
foreach ($statRankings[$order] as $playerId => $value) {
if ($index % self::MAX_PLAYERS_PER_PAGE === 1) {

View File

@ -16,6 +16,8 @@ use ManiaControl\Logger;
use ManiaControl\ManiaControl;
use ManiaControl\Players\Player;
use ManiaControl\Players\PlayerManager;
use ManiaControl\Settings\Setting;
use ManiaControl\Settings\SettingManager;
/**
* Manager checking for ManiaControl Core Updates
@ -72,6 +74,7 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener,
$this->maniaControl->getTimerManager()->registerTimerListening($this, 'hourlyUpdateCheck', 1000 * 60 * 60 * $updateInterval);
$this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerJoined');
$this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'handlePlayerDisconnect');
$this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'handleSettingChanged');
// Permissions
$this->maniaControl->getAuthenticationManager()->definePermissionLevel(self::SETTING_PERMISSION_UPDATE, AuthenticationManager::AUTH_LEVEL_ADMIN);
@ -455,6 +458,15 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener,
$this->checkAutoUpdate();
}
public function handleSettingChanged(Setting $setting) {
if (!$setting->setting != self::SETTING_UPDATECHECK_INTERVAL) {
return;
}
$updateInterval = $setting->value;
$this->maniaControl->getTimerManager()->updateTimerListening($this, 'hourlyUpdateCheck', 1000 * 60 * 60, $updateInterval);
}
/**
* Handle //checkupdate command
*

View File

@ -43,7 +43,7 @@ abstract class Formatter implements UsageInformationAble {
$seconds -= ($hours * 60 + $minutes) * 60;
$format = ($hours > 0 ? $hours . ':' : '');
$format .= ($hours > 0 && $minutes < 10 ? '0' : '') . $minutes . ':';
$format .= ($seconds < 10 ? '0' : '') . $seconds . ':';
$format .= ($seconds < 10 ? '0' : '') . $seconds . '.';
$format .= ($milliseconds < 100 ? '0' : '') . ($milliseconds < 10 ? '0' : '') . $milliseconds;
return $format;
}