setPermission("pocketmine.command.timings"); } public function execute(CommandSender $sender, string $commandLabel, array $args){ if(!$this->testPermission($sender)){ return true; } if(count($args) !== 1){ throw new InvalidCommandSyntaxException(); } $mode = strtolower($args[0]); if($mode === "on"){ $sender->getServer()->getPluginManager()->setUseTimings(true); TimingsHandler::reload(); $sender->sendMessage(new TranslationContainer("pocketmine.command.timings.enable")); return true; }elseif($mode === "off"){ $sender->getServer()->getPluginManager()->setUseTimings(false); $sender->sendMessage(new TranslationContainer("pocketmine.command.timings.disable")); return true; } if(!$sender->getServer()->getPluginManager()->useTimings()){ $sender->sendMessage(new TranslationContainer("pocketmine.command.timings.timingsDisabled")); return true; } $paste = $mode === "paste"; if($mode === "reset"){ TimingsHandler::reload(); $sender->sendMessage(new TranslationContainer("pocketmine.command.timings.reset")); }elseif($mode === "merged" or $mode === "report" or $paste){ $sampleTime = microtime(true) - self::$timingStart; $index = 0; $timingFolder = $sender->getServer()->getDataPath() . "timings/"; if(!file_exists($timingFolder)){ mkdir($timingFolder, 0777); } $timings = $timingFolder . "timings.txt"; while(file_exists($timings)){ $timings = $timingFolder . "timings" . (++$index) . ".txt"; } $fileTimings = $paste ? fopen("php://temp", "r+b") : fopen($timings, "a+b"); TimingsHandler::printTimings($fileTimings); fwrite($fileTimings, "Sample time " . round($sampleTime * 1000000000) . " (" . $sampleTime . "s)" . PHP_EOL); if($paste){ fseek($fileTimings, 0); $data = [ "syntax" => "text", "poster" => $sender->getServer()->getName(), "content" => stream_get_contents($fileTimings) ]; fclose($fileTimings); $sender->getServer()->getScheduler()->scheduleAsyncTask(new class([ ["page" => "http://paste.ubuntu.com", "extraOpts" => [ CURLOPT_HTTPHEADER => ["User-Agent: " . $sender->getServer()->getName() . " " . $sender->getServer()->getPocketMineVersion()], CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $data ]] ], $sender) extends BulkCurlTask{ public function onCompletion(Server $server){ $sender = $this->fetchLocal($server); if($sender instanceof Player and !$sender->isOnline()){ // TODO replace with a more generic API method for checking availability of CommandSender return; } $result = $this->getResult()[0]; if($result instanceof \RuntimeException){ $server->getLogger()->logException($result); return; } list(, $headers) = $result; foreach($headers as $headerGroup){ if(isset($headerGroup["location"]) and preg_match('#^http://paste\\.ubuntu\\.com/([0-9]{1,})/#', trim($headerGroup["location"]), $match)){ $pasteId = $match[1]; break; } } if(isset($pasteId)){ $sender->sendMessage(new TranslationContainer("pocketmine.command.timings.timingsUpload", ["http://paste.ubuntu.com/" . $pasteId . "/"])); $sender->sendMessage(new TranslationContainer("pocketmine.command.timings.timingsRead", ["http://" . $sender->getServer()->getProperty("timings.host", "timings.pmmp.io") . "/?url=$pasteId"])); }else{ $sender->sendMessage(new TranslationContainer("pocketmine.command.timings.pasteError")); } } }); }else{ fclose($fileTimings); $sender->sendMessage(new TranslationContainer("pocketmine.command.timings.timingsWrite", [$timings])); } } return true; } }