From e557978923d7caa6c25fcc97f07dca636bd4c5ec Mon Sep 17 00:00:00 2001 From: Colby Pham <61342696+NopeNotDark@users.noreply.github.com> Date: Mon, 2 Mar 2026 01:27:45 -0500 Subject: [PATCH] refactor(core): remove unused code --- src/Oomph.php | 234 ++++++++++++--------------- src/session/OomphNetworkSession.php | 153 ------------------ src/session/OomphRakLibInterface.php | 44 ----- src/session/OomphSession.php | 22 --- src/utils/ReflectionUtils.php | 4 +- 5 files changed, 105 insertions(+), 352 deletions(-) delete mode 100644 src/session/OomphNetworkSession.php delete mode 100644 src/session/OomphRakLibInterface.php diff --git a/src/Oomph.php b/src/Oomph.php index b6d6345..62260ec 100644 --- a/src/Oomph.php +++ b/src/Oomph.php @@ -5,40 +5,31 @@ use cooldogedev\Spectrum\Spectrum; use ethaniccc\Oomph\event\OomphPunishmentEvent; use ethaniccc\Oomph\event\OomphViolationEvent; -use ethaniccc\Oomph\session\OomphRakLibInterface; -use ethaniccc\Oomph\session\OomphSession; use ethaniccc\Oomph\session\LoggedData; +use ethaniccc\Oomph\session\OomphSession; use pocketmine\command\Command; use pocketmine\command\CommandSender; -use pocketmine\event\EventPriority; use pocketmine\event\Listener; use pocketmine\event\player\PlayerJoinEvent; use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\player\PlayerToggleFlightEvent; use pocketmine\event\server\DataPacketDecodeEvent; use pocketmine\event\server\DataPacketReceiveEvent; -use pocketmine\event\server\DataPacketSendEvent; -use pocketmine\event\server\NetworkInterfaceRegisterEvent; use pocketmine\network\mcpe\protocol\PlayerAuthInputPacket; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\ScriptMessagePacket; use pocketmine\network\mcpe\protocol\types\PlayerAuthInputFlags; -use pocketmine\network\mcpe\raklib\RakLibInterface; -use pocketmine\network\query\DedicatedQueryNetworkInterface; use pocketmine\player\GameMode; use pocketmine\player\Player; use pocketmine\plugin\PluginBase; use pocketmine\scheduler\ClosureTask; use pocketmine\utils\TextFormat; -use ReflectionClass; -use ReflectionException; class Oomph extends PluginBase implements Listener { - private const VALID_EVENTS = [ - "oomph:latency_report", - "oomph:flagged", - ]; + private const VALID_EVENTS = [ + "oomph:flagged" => true, + ]; private const DEFAULT_CHECK_SETTINGS = [ "enabled" => true, @@ -130,28 +121,12 @@ public function onEnable(): void { if (!$spectrum instanceof Spectrum) { throw new \RuntimeException("Oomph-PM requires Spectrum to run."); } - - /* foreach (self::OOMPH_PACKET_DECODE as $pkID) { - $spectrum->interface->setShouldDecodePacket($pkID, true); - } - foreach (self::MULTIVERSION_PACKET_DECODE as $pkID) { - $spectrum->interface->setShouldDecodePacket($pkID, true); - } */ for ($pkId = 0; $pkId <= 1000; $pkId++) { $spectrum->registerPacketDecode($pkId, true); } self::$instance = $this; - /* $this->getServer()->getNetwork()->registerInterface(new OomphRakLibInterface($this->getServer(), $this->getServer()->getIp(), $this->getServer()->getPort(), false)); // do we want upstream connection to use ipv6 (tip: we could load balance by having some upstream connections on ipv4 and some on ipv6) - $this->getServer()->getPluginManager()->registerEvent(NetworkInterfaceRegisterEvent::class, function(NetworkInterfaceRegisterEvent $event) : void{ - $interface = $event->getInterface(); - if($interface instanceof OomphRakLibInterface || (!$interface instanceof RakLibInterface && !$interface instanceof DedicatedQueryNetworkInterface)){ - return; - } - $this->getLogger()->debug("Prevented network interface " . get_class($interface) . " from being registered"); - $event->cancel(); - }, EventPriority::NORMAL, $this); */ if ($this->getConfig()->get("Version", "n/a") !== "1.0.1") { @unlink($this->getDataFolder() . "config.yml"); @@ -167,28 +142,6 @@ public function onEnable(): void { return; } - /* $this->getScheduler()->scheduleDelayedTask(new ClosureTask(function(): void { - if ($this->netInterface === null) { - foreach ($this->getServer()->getNetwork()->getInterfaces() as $interface) { - if ($interface instanceof RakLibInterface) { - $this->netInterface = $interface; - break; - } - } - - if ($this->netInterface === null) { - throw new AssumptionFailedError("raklib interface not found"); - } - - // TODO: not use PHP_INT_MAX here... - $this->netInterface->setPacketLimit(PHP_INT_MAX); // TODO: not set this to PHP_INT_MAX. - } - - $this->getServer()->getCommandMap()->getCommand("oalerts")?->setPermission($this->alertPermission); - $this->getServer()->getCommandMap()->getCommand("odelay")?->setPermission($this->alertPermission); - $this->getServer()->getCommandMap()->getCommand("ologs")?->setPermission($this->logPermission); - }), 1); */ - $this->getScheduler()->scheduleRepeatingTask(new ClosureTask(function(): void { $this->alerted = []; foreach ($this->getServer()->getOnlinePlayers() as $player) { @@ -215,90 +168,90 @@ public function onEnable(): void { $this->getServer()->getPluginManager()->registerEvents($this, $this); } - public function onCommand(CommandSender $sender, Command $command, string $label, array $args): bool { - switch ($command->getName()) { - case "oalerts": - case "odelay": - if (!$sender instanceof Player) { - return false; - } + public function onCommand(CommandSender $sender, Command $command, string $label, array $args): bool { + switch ($command->getName()) { + case "oalerts": + case "odelay": + if (!$sender instanceof Player) { + return false; + } - if (!$sender->hasPermission($this->alertPermission)) { - $sender->sendMessage(TextFormat::RED . "Insufficient permissions"); - return true; - } + if (!$sender->hasPermission($this->alertPermission)) { + $sender->sendMessage(TextFormat::RED . "Insufficient permissions"); + return true; + } - $session = OomphSession::get($sender); - if ($session === null) { - $sender->sendMessage(TextFormat::RED . "Unexpected null session."); - return true; - } + $session = OomphSession::get($sender); + if ($session === null) { + $sender->sendMessage(TextFormat::RED . "Unexpected null session."); + return true; + } - if ($command->getName() === "oalerts") { - $session->alertsEnabled = !$session->alertsEnabled; - if ($session->alertsEnabled) { - $sender->sendMessage(TextFormat::GREEN . "Alerts enabled."); - } else { - $sender->sendMessage(TextFormat::RED . "Alerts disabled."); - } - } else { - $delay = max((float) ($args[0] ?? 3), 0.0001); - $session->alertDelay = $delay; - $sender->sendMessage(TextFormat::GREEN . "Alert delay set to $delay seconds"); - } + if ($command->getName() === "oalerts") { + $session->alertsEnabled = !$session->alertsEnabled; + if ($session->alertsEnabled) { + $sender->sendMessage(TextFormat::GREEN . "Alerts enabled."); + } else { + $sender->sendMessage(TextFormat::RED . "Alerts disabled."); + } + } else { + $delay = max((float) ($args[0] ?? 3), 0.0001); + $session->alertDelay = $delay; + $sender->sendMessage(TextFormat::GREEN . "Alert delay set to $delay seconds"); + } - return true; - case "ologs": - if (!$sender->hasPermission($this->logPermission)) { - $sender->sendMessage(TextFormat::RED . "Insufficient permissions."); - return true; - } + return true; + case "ologs": + if (!$sender->hasPermission($this->logPermission)) { + $sender->sendMessage(TextFormat::RED . "Insufficient permissions."); + return true; + } - $arg = $args[0] ?? null; - if ($arg === null) { - $sender->sendMessage(TextFormat::RED . "Please specify a player to obtain their logs."); - return true; - } + $arg = $args[0] ?? null; + if ($arg === null) { + $sender->sendMessage(TextFormat::RED . "Please specify a player to obtain their logs."); + return true; + } - $target = $this->getServer()->getPlayerByPrefix($arg); - if ($target === null) { - $sender->sendMessage(TextFormat::RED . "Player not found."); - return true; - } + $target = $this->getServer()->getPlayerByPrefix($arg); + if ($target === null) { + $sender->sendMessage(TextFormat::RED . "Player not found."); + return true; + } - $data = LoggedData::getInstance()->get($target->getName()); - if (count($data) === 0) { - $sender->sendMessage(str_replace( - ["{prefix}", "{player}"], - [$this->getConfig()->get("Prefix", "§7§l[§eoomph§7]§r"), $target->getName()], - $this->getConfig()->get("NoLogMessage", "{prefix} §a{player} has no existing logs.") - )); - return true; - } + $data = LoggedData::getInstance()->get($target->getName()); + if (count($data) === 0) { + $sender->sendMessage(str_replace( + ["{prefix}", "{player}"], + [$this->getConfig()->get("Prefix", "§7§l[§eoomph§7]§r"), $target->getName()], + $this->getConfig()->get("NoLogMessage", "{prefix} §a{player} has no existing logs.") + )); + return true; + } - $message = str_replace( - ["{prefix}", "{player}"], - [$this->getConfig()->get("Prefix", "§7§l[§eoomph§7]§r"), $target->getName()], - $this->getConfig()->get("StartLogMessage", "{prefix} §5Log summary for §d{player}:") - ) . PHP_EOL; - foreach ($data as $k => $datum) { - $message .= str_replace( - ["{check_main}", "{check_sub}", "{violations}"], - [$datum["check_main"], $datum["check_sub"], var_export((float) $datum["violations"], true)], - $this->getConfig()->get("LogMessage", "§5{check_main}§7<§d{check_main}§7> §cx{violations}") - ); - - if ($k !== count($data) - 1) { - $message .= PHP_EOL; - } - } - $sender->sendMessage($message); + $message = str_replace( + ["{prefix}", "{player}"], + [$this->getConfig()->get("Prefix", "§7§l[§eoomph§7]§r"), $target->getName()], + $this->getConfig()->get("StartLogMessage", "{prefix} §5Log summary for §d{player}:") + ) . PHP_EOL; + foreach ($data as $k => $datum) { + $message .= str_replace( + ["{check_main}", "{check_sub}", "{violations}"], + [$datum["check_main"], $datum["check_sub"], var_export((float) $datum["violations"], true)], + $this->getConfig()->get("LogMessage", "§5{check_main}§7<§d{check_main}§7> §cx{violations}") + ); + + if ($k !== count($data) - 1) { + $message .= PHP_EOL; + } + } + $sender->sendMessage($message); - return true; - } + return true; + } - return false; - } + return false; + } public static function getInstance(): Oomph { return self::$instance; @@ -316,15 +269,24 @@ public function onToggleFlight(PlayerToggleFlightEvent $event): void { } } + /** + * @param PlayerJoinEvent $event + * @return void + */ public function onJoin(PlayerJoinEvent $event): void { OomphSession::register($event->getPlayer()); } + /** + * @param PlayerQuitEvent $event + * @return void + */ public function onQuit(PlayerQuitEvent $event): void { OomphSession::unregister($event->getPlayer()); } /** + * @param DataPacketDecodeEvent $event * @priority LOWEST * @handleCancelled */ @@ -335,8 +297,8 @@ public function onPacketDecode(DataPacketDecodeEvent $event): void { } /** + * @param DataPacketReceiveEvent $event * @priority HIGHEST - * @throws ReflectionException */ public function onClientPacket(DataPacketReceiveEvent $event): void { $packet = $event->getPacket(); @@ -356,7 +318,11 @@ public function onClientPacket(DataPacketReceiveEvent $event): void { $eventType = $packet->getMessageId(); $data = json_decode($packet->getValue(), true); if ($data === null) { - $this->getLogger()->debug("JSON decode failed [{$eventType}]: " . var_export($packet->getValue(), true)); + $this->getLogger()->debug("JSON decode failed [$eventType]: " . var_export($packet->getValue(), true)); + return; + } + + if (!isset(self::VALID_EVENTS[$eventType])) { return; } @@ -381,7 +347,9 @@ public function onClientPacket(DataPacketReceiveEvent $event): void { } $ev->call(); - if ($ev->isCancelled()) return; + if ($ev->isCancelled()) { + return; + } $message = str_replace( ["{prefix}", "{player}", "{check_main}", "{check_sub}", "{violations}", "{extra_data}"], @@ -415,14 +383,18 @@ public function onClientPacket(DataPacketReceiveEvent $event): void { private function checkForPunishments(Player $player, string $check, string $type, float $violations): void { $settings = $this->getConfig()->getNested("$check.$type", self::DEFAULT_CHECK_SETTINGS); - $punishment = $settings["punishment"] ?? "none"; - if ($punishment === "none" || $violations < ($settings["max_violations"] ?? 10)) return; + $punishment = $settings["punishment"] ?? "none"; + if ($punishment === "none" || $violations < ($settings["max_violations"] ?? 10)) { + return; + } $ev = new OomphPunishmentEvent($player, OomphPunishmentEvent::punishmentTypeFromString($punishment), $check, $type); $ev->call(); - if ($ev->isCancelled()) return; + if ($ev->isCancelled()) { + return; + } $replacePairs = [ ["{prefix}", "{check_main}", "{check_sub}"], diff --git a/src/session/OomphNetworkSession.php b/src/session/OomphNetworkSession.php deleted file mode 100644 index 7f75e73..0000000 --- a/src/session/OomphNetworkSession.php +++ /dev/null @@ -1,153 +0,0 @@ -refl = new \ReflectionClass(NetworkSession::class); - } - - private function getReflProperty(string $property) { - return $this->refl->getProperty($property)->getValue($this); - } - - private function onSessionStartSuccess() : void{ - $this->getLogger()->debug("Session start handshake completed, awaiting login packet"); - ReflectionUtils::invoke(NetworkSession::class, $this, "flushSendBuffer", true); - $this->setHandler(new LoginPacketHandler( - Server::getInstance(), - $this, - function(PlayerInfo $info) : void{ - ReflectionUtils::setProperty(NetworkSession::class, $this, "info", $info); - $this->getLogger()->info(Server::getInstance()->getLanguage()->translate(KnownTranslationFactory::pocketmine_network_session_playerName(TextFormat::AQUA . $info->getUsername() . TextFormat::RESET))); - $this->getLogger()->setPrefix("NetworkSession: " . $this->getDisplayName()); - ReflectionUtils::getProperty(NetworkSession::class, $this, "manager")->markLoginReceived($this); - }, - function(bool $authenticated, bool $authRequired, Translatable|string|null $error, ?string $clientPubKey) : void{ - ReflectionUtils::invoke(NetworkSession::class, $this, "setAuthenticationStatus", $authenticated, $authRequired, $error, $clientPubKey); - }, - )); - } - - public function handleEncoded(string $payload) : void{ - if(!parent::isConnected()){ - return; - } - - $packetBatchLimiter = $this->getReflProperty("packetBatchLimiter"); - $gamePacketLimiter = $this->getReflProperty("gamePacketLimiter"); - $cipher = $this->getReflProperty("cipher"); - $enableCompression = $this->getReflProperty("enableCompression"); - $packetPool = $this->getReflProperty("packetPool"); - $compressor = $this->getCompressor(); - - Timings::$playerNetworkReceive->startTiming(); - try{ - $packetBatchLimiter->decrement(); - - if($cipher !== null){ - Timings::$playerNetworkReceiveDecrypt->startTiming(); - try{ - $payload = $cipher->decrypt($payload); - }catch(DecryptionException $e){ - $this->getLogger()->debug("Encrypted packet: " . base64_encode($payload)); - throw PacketHandlingException::wrap($e, "Packet decryption error"); - }finally{ - Timings::$playerNetworkReceiveDecrypt->stopTiming(); - } - } - - if (strlen($payload) < 1) { - throw new PacketHandlingException("No bytes in payload"); - } - - $decompressed = ""; - if($enableCompression){ - Timings::$playerNetworkReceiveDecompress->startTiming(); - $compressionType = ord($payload[0]); - $compressed = substr($payload, 1); - if($compressionType === CompressionAlgorithm::NONE){ - $decompressed = $compressed; - }elseif($compressionType === $compressor->getNetworkId()){ - try{ - $decompressed = $compressor->decompress($compressed); - }catch(DecompressionException $e){ - $this->getLogger()->debug("Failed to decompress packet: " . base64_encode($compressed)); - throw PacketHandlingException::wrap($e, "Compressed packet batch decode error"); - }finally{ - Timings::$playerNetworkReceiveDecompress->stopTiming(); - } - }else{ - throw new PacketHandlingException("Packet compressed with unexpected compression type $compressionType"); - } - }else{ - $decompressed = $payload; - } - - try{ - $stream = new BinaryStream($decompressed); - $count = 0; - foreach(PacketBatch::decodeRaw($stream) as $buffer){ - $gamePacketLimiter->decrement(); - if(++$count > 2048){ // TODO: Adjustments? - throw new PacketHandlingException("Too many packets in batch"); - } - $packet = $packetPool->getPacket($buffer); - if($packet === null){ - $this->getLogger()->debug("Unknown packet: " . base64_encode($buffer)); - throw new PacketHandlingException("Unknown packet received"); - } - try{ - $this->handleDataPacket($packet, $buffer); - }catch(PacketHandlingException $e){ - $this->getLogger()->debug($packet->getName() . ": " . base64_encode($buffer)); - throw PacketHandlingException::wrap($e, "Error processing " . $packet->getName()); - } - } - }catch(PacketDecodeException|BinaryDataException $e){ - $this->getLogger()->logException($e); - throw PacketHandlingException::wrap($e, "Packet batch decode error"); - } - }finally{ - Timings::$playerNetworkReceive->stopTiming(); - } - } - -} \ No newline at end of file diff --git a/src/session/OomphRakLibInterface.php b/src/session/OomphRakLibInterface.php deleted file mode 100644 index 12d8785..0000000 --- a/src/session/OomphRakLibInterface.php +++ /dev/null @@ -1,44 +0,0 @@ -getSessionManager(), - PacketPool::getInstance(), - new RakLibPacketSender($sessionId, $this), - ReflectionUtils::getProperty(RakLibInterface::class, $this, "packetBroadcaster"), - ReflectionUtils::getProperty(RakLibInterface::class, $this, "entityEventBroadcaster"), - ZlibCompressor::getInstance(), - ReflectionUtils::getProperty(RakLibInterface::class, $this, "typeConverter"), - $address, - $port - ); - $sessions = ReflectionUtils::getProperty(RakLibInterface::class, $this, "sessions"); - $sessions[$sessionId] = $session; - ReflectionUtils::setProperty(RakLibInterface::class, $this, "sessions", $sessions); - } -} \ No newline at end of file diff --git a/src/session/OomphSession.php b/src/session/OomphSession.php index 8a4d79b..659bb29 100644 --- a/src/session/OomphSession.php +++ b/src/session/OomphSession.php @@ -3,13 +3,7 @@ namespace ethaniccc\Oomph\session; use ethaniccc\Oomph\Oomph; -use pocketmine\network\mcpe\PacketRateLimiter; -use pocketmine\network\mcpe\protocol\AnimatePacket; -use pocketmine\network\mcpe\protocol\InventoryTransactionPacket; -use pocketmine\network\mcpe\protocol\ServerboundPacket; -use pocketmine\network\PacketHandlingException; use pocketmine\player\Player; -use pocketmine\scheduler\ClosureTask; class OomphSession { @@ -21,13 +15,11 @@ class OomphSession { public float $lastAlert = 0; private Player $player; - private PacketRateLimiter $rateLimiter; public function __construct(Player $player) { $this->player = $player; $this->alertsEnabled = $player->hasPermission(Oomph::getInstance()->alertPermission); $this->authorized = $this->alertsEnabled; - $this->rateLimiter = new PacketRateLimiter("Game Packet Limiter", 2, 100); } public static function register(Player $player): OomphSession { @@ -48,18 +40,4 @@ public function getPlayer(): Player { return $this->player; } - public function handlePacket(ServerboundPacket $packet): void { - if ($packet instanceof InventoryTransactionPacket || $packet instanceof AnimatePacket) { - return; - } - - try { - $this->rateLimiter->decrement(); - } catch (PacketHandlingException $err) { - Oomph::getInstance()->getScheduler()->scheduleDelayedTask(new ClosureTask(function(): void { - $this->player->kick("Exceeded packet rate limit"); - }), 1); - } - } - } \ No newline at end of file diff --git a/src/utils/ReflectionUtils.php b/src/utils/ReflectionUtils.php index 2abb491..4b3d7ec 100644 --- a/src/utils/ReflectionUtils.php +++ b/src/utils/ReflectionUtils.php @@ -8,8 +8,8 @@ use ReflectionException; final class ReflectionUtils{ - private static $propCache = []; - private static $methCache = []; + private static array $propCache = []; + private static array $methCache = []; /** * @param string $className