updated playerlist, avoided multiple triggers

This commit is contained in:
kremsy 2017-05-21 18:36:01 +02:00
parent 2ec6fdbed9
commit 5ae7a7c20d
3 changed files with 23 additions and 9 deletions

View File

@ -84,7 +84,7 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer
$this->maniaControl->getCallbackManager()->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); $this->maniaControl->getCallbackManager()->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer');
// Update Widget Events // Update Widget Events
$this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERINFOCHANGED, $this, 'updateWidget'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERINFOSCHANGED, $this, 'updateWidget');
$this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'updateWidget'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'updateWidget');
$this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'updateWidget'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'updateWidget');
$this->maniaControl->getCallbackManager()->registerCallbackListener(AuthenticationManager::CB_AUTH_LEVEL_CHANGED, $this, 'updateWidget'); $this->maniaControl->getCallbackManager()->registerCallbackListener(AuthenticationManager::CB_AUTH_LEVEL_CHANGED, $this, 'updateWidget');
@ -819,9 +819,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer
/** /**
* Reopen the widget on PlayerInfoChanged / Player Connect and Disconnect * Reopen the widget on PlayerInfoChanged / Player Connect and Disconnect
* *
* @param Player $player
*/ */
public function updateWidget(Player $player) { public function updateWidget() {
foreach ($this->playersListShown as $login => $shown) { foreach ($this->playersListShown as $login => $shown) {
if (!$shown) { if (!$shown) {
continue; continue;

View File

@ -33,9 +33,11 @@ class PlayerManager implements CallbackListener, TimerListener, CommunicationLis
/* /*
* Constants * Constants
*/ */
const CB_PLAYERCONNECT = 'PlayerManagerCallback.PlayerConnect'; const CB_PLAYERCONNECT = 'PlayerManagerCallback.PlayerConnect';
const CB_PLAYERDISCONNECT = 'PlayerManagerCallback.PlayerDisconnect'; const CB_PLAYERDISCONNECT = 'PlayerManagerCallback.PlayerDisconnect';
/** @use CB_PlayerInfosChanged in favour to avoid multiple triggers at once */
const CB_PLAYERINFOCHANGED = 'PlayerManagerCallback.PlayerInfoChanged'; const CB_PLAYERINFOCHANGED = 'PlayerManagerCallback.PlayerInfoChanged';
const CB_PLAYERINFOSCHANGED = 'PlayerManagerCallback.PlayerInfosChanged';
const CB_SERVER_EMPTY = 'PlayerManagerCallback.ServerEmpty'; const CB_SERVER_EMPTY = 'PlayerManagerCallback.ServerEmpty';
const TABLE_PLAYERS = 'mc_players'; const TABLE_PLAYERS = 'mc_players';
const SETTING_JOIN_LEAVE_MESSAGES = 'Enable Join & Leave Messages'; const SETTING_JOIN_LEAVE_MESSAGES = 'Enable Join & Leave Messages';
@ -70,6 +72,8 @@ class PlayerManager implements CallbackListener, TimerListener, CommunicationLis
/** @var AdminLists $adminLists */ /** @var AdminLists $adminLists */
private $adminLists = null; private $adminLists = null;
private $playerInfosChangedTime = 0;
/** /**
* Construct a new Player Manager * Construct a new Player Manager
* *
@ -505,6 +509,16 @@ class PlayerManager implements CallbackListener, TimerListener, CommunicationLis
// Trigger own callback // Trigger own callback
$this->maniaControl->getCallbackManager()->triggerCallback(self::CB_PLAYERINFOCHANGED, $player); $this->maniaControl->getCallbackManager()->triggerCallback(self::CB_PLAYERINFOCHANGED, $player);
//Avoid Multiple Triggers
if ((microtime(true) - 0.5) > $this->playerInfosChangedTime) {
//Delay Callback by a short Time (200ms) to be sure that different changes get submitted the same time
$this->maniaControl->getTimerManager()->registerOneTimeListening($this, function () {
$this->maniaControl->getCallbackManager()->triggerCallback(self::CB_PLAYERINFOSCHANGED);
}, 200);
}
$this->playerInfosChangedTime = microtime(true);
} }
/** /**
@ -571,10 +585,10 @@ class PlayerManager implements CallbackListener, TimerListener, CommunicationLis
* @return \ManiaControl\Players\Player[] * @return \ManiaControl\Players\Player[]
*/ */
public function getPlayers($withoutSpectators = false) { public function getPlayers($withoutSpectators = false) {
if($withoutSpectators){ if ($withoutSpectators) {
$players = array(); $players = array();
foreach($this->players as $player){ foreach ($this->players as $player) {
if(!$player->isSpectator){ if (!$player->isSpectator) {
$players[] = $players; $players[] = $players;
} }
} }

View File

@ -130,7 +130,7 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin {
$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::MP_PODIUMSTART, $this, 'handleOnEndMap'); $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::MP_PODIUMSTART, $this, 'handleOnEndMap');
$this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerConnect'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerConnect');
$this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'updateWidgets'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'updateWidgets');
$this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERINFOCHANGED, $this, 'updateWidgets'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERINFOSCHANGED, $this, 'updateWidgets');
$this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'updateSettings'); $this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'updateSettings');
// Settings // Settings
@ -559,6 +559,7 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin {
if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_SERVERINFO_WIDGET_ACTIVATED)) { if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_SERVERINFO_WIDGET_ACTIVATED)) {
$time = time(); $time = time();
//Update Max once per second //Update Max once per second
//TODO the one time can be removed due the new PlayerInfosChanged Callback
if ($this->lastWidgetUpdateTime < ($time - 1)) { if ($this->lastWidgetUpdateTime < ($time - 1)) {
$this->displayServerInfoWidget(); $this->displayServerInfoWidget();
$this->lastWidgetUpdateTime = $time; $this->lastWidgetUpdateTime = $time;