From e86c243db5f5eb74e147f0421f42061e70bf1e8a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 16 Apr 2020 01:55:52 +0100 Subject: [PATCH] NetworkSession: do not expose setPlayerInfo() --- src/network/mcpe/NetworkSession.php | 20 +++++-------------- .../mcpe/handler/LoginPacketHandler.php | 13 ++++++++++-- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index e32f8f3b3..6add54900 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -162,7 +162,11 @@ class NetworkSession{ $this->connectTime = time(); - $this->setHandler(new LoginPacketHandler($this->server, $this)); + $this->setHandler(new LoginPacketHandler($this->server, $this, function(PlayerInfo $info) : void{ + $this->info = $info; + $this->logger->info("Player: " . TextFormat::AQUA . $info->getUsername() . TextFormat::RESET); + $this->logger->setPrefix($this->getLogPrefix()); + })); $this->manager->add($this); $this->logger->info("Session opened"); @@ -204,20 +208,6 @@ class NetworkSession{ return $this->info; } - /** - * TODO: this shouldn't be accessible after the initial login phase - * - * @throws \InvalidStateException - */ - public function setPlayerInfo(PlayerInfo $info) : void{ - if($this->info !== null){ - throw new \InvalidStateException("Player info has already been set"); - } - $this->info = $info; - $this->logger->info("Player: " . TextFormat::AQUA . $info->getUsername() . TextFormat::RESET); - $this->logger->setPrefix($this->getLogPrefix()); - } - public function isConnected() : bool{ return $this->connected; } diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 6df832e05..3c020ec75 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -50,10 +50,19 @@ class LoginPacketHandler extends PacketHandler{ private $server; /** @var NetworkSession */ private $session; + /** + * @var \Closure + * @phpstan-var \Closure(PlayerInfo) : void + */ + private $playerInfoConsumer; - public function __construct(Server $server, NetworkSession $session){ + /** + * @phpstan-param \Closure(PlayerInfo) : void $playerInfoConsumer + */ + public function __construct(Server $server, NetworkSession $session, \Closure $playerInfoConsumer){ $this->session = $session; $this->server = $server; + $this->playerInfoConsumer = $playerInfoConsumer; } public function handleLogin(LoginPacket $packet) : bool{ @@ -117,7 +126,7 @@ class LoginPacketHandler extends PacketHandler{ }catch(\InvalidArgumentException $e){ throw BadPacketException::wrap($e, "Failed to parse login UUID"); } - $this->session->setPlayerInfo(new PlayerInfo( + ($this->playerInfoConsumer)(new PlayerInfo( $packet->extraData->displayName, $uuid, $skin,