NetworkSession: add a dedicated PrefixedLogger, clean up some boilerplate code

This commit is contained in:
Dylan K. Taylor
2019-05-06 16:32:34 +01:00
parent 7ae84944ca
commit 5250a432d1
4 changed files with 33 additions and 26 deletions

View File

@ -83,6 +83,8 @@ use function time;
use function ucfirst;
class NetworkSession{
/** @var \PrefixedLogger */
private $logger;
/** @var Server */
private $server;
/** @var Player|null */
@ -130,6 +132,8 @@ class NetworkSession{
$this->ip = $ip;
$this->port = $port;
$this->logger = new \PrefixedLogger($this->server->getLogger(), $this->getLogPrefix());
$this->compressedQueue = new \SplQueue();
$this->connectTime = time();
@ -139,6 +143,14 @@ class NetworkSession{
$this->manager->add($this);
}
private function getLogPrefix() : string{
return "NetworkSession: " . $this->getDisplayName();
}
public function getLogger() : \Logger{
return $this->logger;
}
protected function createPlayer() : void{
$ev = new PlayerCreationEvent($this);
$ev->call();
@ -170,6 +182,7 @@ class NetworkSession{
throw new \InvalidStateException("Player info has already been set");
}
$this->info = $info;
$this->logger->setPrefix($this->getLogPrefix());
}
public function isConnected() : bool{
@ -242,7 +255,7 @@ class NetworkSession{
try{
$payload = $this->cipher->decrypt($payload);
}catch(\UnexpectedValueException $e){
$this->server->getLogger()->debug("Encrypted packet from " . $this->getDisplayName() . ": " . bin2hex($payload));
$this->logger->debug("Encrypted packet: " . bin2hex($payload));
throw new BadPacketException("Packet decryption error: " . $e->getMessage(), 0, $e);
}finally{
Timings::$playerNetworkReceiveDecryptTimer->stopTiming();
@ -253,7 +266,7 @@ class NetworkSession{
try{
$stream = new PacketStream(NetworkCompression::decompress($payload));
}catch(\ErrorException $e){
$this->server->getLogger()->debug("Failed to decompress packet from " . $this->getDisplayName() . ": " . bin2hex($payload));
$this->logger->debug("Failed to decompress packet: " . bin2hex($payload));
//TODO: this isn't incompatible game version if we already established protocol version
throw new BadPacketException("Compressed packet batch decode error (incompatible game version?)", 0, $e);
}finally{
@ -268,14 +281,14 @@ class NetworkSession{
try{
$pk = PacketPool::getPacket($stream->getString());
}catch(BinaryDataException $e){
$this->server->getLogger()->debug("Packet batch from " . $this->getDisplayName() . ": " . bin2hex($stream->getBuffer()));
$this->logger->debug("Packet batch: " . bin2hex($stream->getBuffer()));
throw new BadPacketException("Packet batch decode error: " . $e->getMessage(), 0, $e);
}
try{
$this->handleDataPacket($pk);
}catch(BadPacketException $e){
$this->server->getLogger()->debug($pk->getName() . " from " . $this->getDisplayName() . ": " . bin2hex($pk->getBuffer()));
$this->logger->debug($pk->getName() . ": " . bin2hex($pk->getBuffer()));
throw new BadPacketException("Error processing " . $pk->getName() . ": " . $e->getMessage(), 0, $e);
}
}
@ -298,13 +311,13 @@ class NetworkSession{
$packet->decode();
if(!$packet->feof() and !$packet->mayHaveUnreadBytes()){
$remains = substr($packet->getBuffer(), $packet->getOffset());
$this->server->getLogger()->debug("Still " . strlen($remains) . " bytes unread in " . $packet->getName() . ": " . bin2hex($remains));
$this->logger->debug("Still " . strlen($remains) . " bytes unread in " . $packet->getName() . ": " . bin2hex($remains));
}
$ev = new DataPacketReceiveEvent($this, $packet);
$ev->call();
if(!$ev->isCancelled() and !$packet->handle($this->handler)){
$this->server->getLogger()->debug("Unhandled " . $packet->getName() . " received from " . $this->getDisplayName() . ": " . bin2hex($packet->getBuffer()));
$this->logger->debug("Unhandled " . $packet->getName() . ": " . bin2hex($packet->getBuffer()));
}
}finally{
$timings->stopTiming();
@ -511,13 +524,11 @@ class NetworkSession{
return false;
}
$this->server->getLogger()->debug($this->getDisplayName() . " is NOT logged into Xbox Live");
if($this->info->getXuid() !== ""){
$this->server->getLogger()->warning($this->getDisplayName() . " has an XUID, but their login keychain is not signed by Mojang");
$this->logger->warning("Found XUID, but login keychain is not signed by Mojang");
}
}else{
$this->server->getLogger()->debug($this->getDisplayName() . " is logged into Xbox Live");
}
$this->logger->debug("Xbox Live authenticated: " . ($this->authenticated ? "YES" : "NO"));
return $this->manager->kickDuplicates($this);
}
@ -530,7 +541,7 @@ class NetworkSession{
$this->cipher = new NetworkCipher($encryptionKey);
$this->setHandler(new HandshakeSessionHandler($this));
$this->server->getLogger()->debug("Enabled encryption for " . $this->getDisplayName());
$this->logger->debug("Enabled encryption");
}
public function onLoginSuccess() : void{
@ -540,7 +551,7 @@ class NetworkSession{
$pk->status = PlayStatusPacket::LOGIN_SUCCESS;
$this->sendDataPacket($pk);
$this->setHandler(new ResourcePacksSessionHandler($this->server, $this, $this->server->getResourcePackManager()));
$this->setHandler(new ResourcePacksSessionHandler($this, $this->server->getResourcePackManager()));
}
public function onResourcePacksDone() : void{