diff --git a/Beu/GuestlistManager.php b/Beu/GuestlistManager.php index aa99981..94d9967 100644 --- a/Beu/GuestlistManager.php +++ b/Beu/GuestlistManager.php @@ -23,7 +23,7 @@ class GuestlistManager implements CommandListener, CallbackListener, TimerListen * Constants */ const PLUGIN_ID = 154; - const PLUGIN_VERSION = 2.0; + const PLUGIN_VERSION = 2.1; const PLUGIN_NAME = 'Guestlist Manager'; const PLUGIN_AUTHOR = 'Beu'; @@ -100,6 +100,9 @@ class GuestlistManager implements CommandListener, CallbackListener, TimerListen $this->maniaControl->getCommandManager()->registerCommandListener(['glload', 'loadgl'], $this, 'handleLoad', true, 'Load the guestlist file'); $this->maniaControl->getCommandManager()->registerCommandListener(['glclear', 'glclean', 'cleangl'], $this, 'handleClear', true, 'Clear the guestlist'); $this->maniaControl->getCommandManager()->registerCommandListener(['glkickall'], $this, 'handleKickAll', true, 'Kick non-guestlisted players'); + $this->maniaControl->getCommandManager()->registerCommandListener(['glinfo'], $this, 'handleInfo', true, 'Get guestlist info'); + $this->maniaControl->getCommandManager()->registerCommandListener(['gllist'], $this, 'handleList', true, 'List all guestlisted players'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(AuthenticationManager::CB_AUTH_LEVEL_CHANGED, $this, 'handleAuthLevelChanged'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerConnect'); @@ -409,6 +412,121 @@ class GuestlistManager implements CommandListener, CallbackListener, TimerListen $this->maniaControl->getChat()->sendSuccess($kicked . ' players kicked', $player); } + /** + * handle Info command + * + * @param array $chat + * @param \ManiaControl\Players\Player $player + */ + public function handleInfo(Array $chat, Player $player) { + $guests = array_column($this->maniaControl->getClient()->getGuestList(), 'login'); + $players = $this->maniaControl->getPlayerManager()->getPlayers(true); + $spectators = $this->maniaControl->getPlayerManager()->getSpectators(); + + $nbPlayersConnected = 0; + $nbSpectatorsConnected = 0; + $nbSpectatorsConnected = 0; + $nbPerRole[0] = 0; + $nbPerRoleConnected[0] = 0; + + foreach ($guests as $login) { + $player = $this->maniaControl->getPlayerManager()->getPlayer($login); + + if ($player === null) { + $nbPerRole[0]++; + } else { + $players = array_filter($players, function($obj) use ($player) { + return $obj !== $player; + }); + + $spectators = array_filter($spectators, function($obj) use ($player) { + return $obj !== $player; + }); + + + if (!array_key_exists($player->authLevel, $nbPerRole)) { + $nbPerRole[$player->authLevel] = 0; + $nbPerRoleConnected[$player->authLevel] = 0; + } + $nbPerRole[$player->authLevel]++; + if ($player->isConnected) { + $nbPerRoleConnected[$player->authLevel]++; + if ($player->isSpectator) $nbSpectatorsConnected++; + else $nbPlayersConnected++; + } + } + } + + $message = '================ Guestlist info ================'; + $message .= PHP_EOL . '$<$ee0' . count($guests) . '$> guests in the guestlist. Type //gllist to get the list'; + $message .= PHP_EOL . '====== Connected on the server:'; + $message .= PHP_EOL . 'Guestlisted: $<$ee0'. $nbPlayersConnected . '$> players - $<$ee0'. $nbSpectatorsConnected .'$> spectators'; + $message .= PHP_EOL . 'Not guestlisted: $<$ee0'. count($players) . '$> players - $<$ee0'. count($spectators) .'$> spectators'; + + $message .= PHP_EOL . '====== Per role:'; + ksort($nbPerRole); + ksort($nbPerRoleConnected); + $part1 = PHP_EOL . 'Connected: '; + $part2 = PHP_EOL . 'Disconnected: '; + foreach ($nbPerRole as $authLevel => $count) { + $part1 .= '$<$ee0'. $nbPerRoleConnected[$authLevel] .'$> '. $this->maniaControl->getAuthenticationManager()->getAuthLevelName($authLevel) .'s - '; + $part2 .= '$<$ee0'. $count - $nbPerRoleConnected[$authLevel] .'$> '. $this->maniaControl->getAuthenticationManager()->getAuthLevelName($authLevel) .'s - '; + } + + $message .= substr($part1, 0, -3) . substr($part2, 0, -3); + + + $this->maniaControl->getChat()->sendSuccess($message, $player); + } + + /** + * handle List command + * + * @param array $chat + * @param \ManiaControl\Players\Player $player + */ + public function handleList(Array $chat, Player $player) { + $guests = array_column($this->maniaControl->getClient()->getGuestList(), 'login'); + + $logins = []; + $names = []; + $connectedNames = []; + + foreach ($guests as $login) { + $player = $this->maniaControl->getPlayerManager()->getPlayer($login); + + if ($player === null || $player->nickname === '') { + $logins[] = $login; + } else { + $names[] = $player->nickname; + if ($player->isConnected) { + $connectedNames[] = $player->nickname; + } + } + } + + natcasesort($logins); + natcasesort($names); + + $message = '================ Guestlist list ================'. PHP_EOL; + $message .= '====== Known players:'. PHP_EOL; + foreach ($names as $name) { + if (in_array($name, $connectedNames)) { + $message .= '$<$1c0' . $name . '$> '; + } else { + $message .= '$<$c00' . $name . '$> '; + } + } + + $message .= PHP_EOL .'====== Unknown players:'. PHP_EOL; + + foreach ($logins as $login) { + $message .= '$<$c00' . $login . '$> '; + } + + $this->maniaControl->getChat()->sendSuccess($message, $player); + } + /** * Kick non-guestlist players from the server *