From 10ba3d635958620fa4e98bcce1f3cbb4b2458b15 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Aug 2018 17:39:09 +0100 Subject: [PATCH] Network: add ability to tick sessions moved responsibility for login timeout checks to NetworkSession instead of Server --- src/pocketmine/Server.php | 16 ++++++++-------- src/pocketmine/network/Network.php | 16 +++++++++++++++- .../network/mcpe/NetworkSession.php | 19 +++++++++++++++++++ 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 4187057f8..3e56fdd83 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -2375,12 +2375,12 @@ class Server{ $p->sendDataPacket($pk); } - private function checkTickUpdates(int $currentTick, float $tickTime) : void{ - foreach($this->players as $p){ - if(!$p->loggedIn and ($tickTime - $p->creationTime) >= 10){ - $p->close("", "Login timeout"); - }elseif($this->alwaysTickPlayers and $p->spawned){ - $p->onUpdate($currentTick); + private function checkTickUpdates(int $currentTick) : void{ + if($this->alwaysTickPlayers){ + foreach($this->players as $p){ + if($p->spawned){ + $p->onUpdate($currentTick); + } } } @@ -2537,7 +2537,7 @@ class Server{ ++$this->tickCounter; Timings::$connectionTimer->startTiming(); - $this->network->tickInterfaces(); + $this->network->tick(); Timings::$connectionTimer->stopTiming(); Timings::$schedulerTimer->startTiming(); @@ -2548,7 +2548,7 @@ class Server{ $this->asyncPool->collectTasks(); Timings::$schedulerAsyncTimer->stopTiming(); - $this->checkTickUpdates($this->tickCounter, $tickTime); + $this->checkTickUpdates($this->tickCounter); if(($this->tickCounter % 20) === 0){ if($this->doTitleTick){ diff --git a/src/pocketmine/network/Network.php b/src/pocketmine/network/Network.php index a1e022c6e..7cc580ffc 100644 --- a/src/pocketmine/network/Network.php +++ b/src/pocketmine/network/Network.php @@ -29,6 +29,7 @@ namespace pocketmine\network; use pocketmine\event\server\NetworkInterfaceCrashEvent; use pocketmine\event\server\NetworkInterfaceRegisterEvent; use pocketmine\event\server\NetworkInterfaceUnregisterEvent; +use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\PacketPool; use pocketmine\Server; @@ -48,6 +49,9 @@ class Network{ /** @var string */ private $name; + /** @var NetworkSession[] */ + private $updateSessions = []; + public function __construct(Server $server){ PacketPool::init(); @@ -80,7 +84,7 @@ class Network{ return $this->interfaces; } - public function tickInterfaces() : void{ + public function tick() : void{ foreach($this->interfaces as $interface){ try{ $interface->tick(); @@ -97,6 +101,12 @@ class Network{ $logger->critical($this->server->getLanguage()->translateString("pocketmine.server.networkError", [get_class($interface), $e->getMessage()])); } } + + foreach($this->updateSessions as $k => $session){ + if(!$session->isConnected() or !$session->tick()){ + unset($this->updateSessions[$k]); + } + } } /** @@ -183,4 +193,8 @@ class Network{ $interface->unblockAddress($address); } } + + public function scheduleSessionTick(NetworkSession $session) : void{ + $this->updateSessions[spl_object_hash($session)] = $session; + } } diff --git a/src/pocketmine/network/mcpe/NetworkSession.php b/src/pocketmine/network/mcpe/NetworkSession.php index 8f7557749..a00916c71 100644 --- a/src/pocketmine/network/mcpe/NetworkSession.php +++ b/src/pocketmine/network/mcpe/NetworkSession.php @@ -62,6 +62,8 @@ class NetworkSession{ /** @var bool */ private $connected = true; + /** @var int */ + private $connectTime; /** @var NetworkCipher */ private $cipher; @@ -72,6 +74,9 @@ class NetworkSession{ $this->ip = $ip; $this->port = $port; + $this->connectTime = time(); + $this->server->getNetwork()->scheduleSessionTick($this); + //TODO: this should happen later in the login sequence $this->createPlayer(); @@ -328,4 +333,18 @@ class NetworkSession{ public function onRespawn() : void{ $this->setHandler(new SimpleSessionHandler($this->player)); } + + public function tick() : bool{ + if($this->handler instanceof LoginSessionHandler){ + if(time() >= $this->connectTime + 10){ + $this->disconnect("Login timeout"); + return false; + } + + return true; //keep ticking until timeout + } + + //TODO: more stuff on tick + return false; + } }