render($response, 'create.twig'); } // POST create server route public function postCreate(Request $request, Response $response, $args): Response { // set up the POST parameters and grab our config $params = (array)$request->getParsedBody(); $config = $this->get('config'); // create our server directory $serverDir = join('/', array($config->get('server_directory'), $params['serverName'])); mkdir($serverDir); // find the server JAR URL for the version $versionPageLink = 'https://minecraft.fandom.com/wiki/Java_Edition_' . $params['serverVersion']; $dom = new Document($versionPageLink, true); $infobox = $dom->find('.notaninfobox')[0]; $serverLinkElem = $infobox->find("a:contains('Server')"); $serverJarUrl = $serverLinkElem[0]->attr('href'); // grab the server JAR file $serverJarName = "server_" . $params['serverVersion'] . ".jar"; $serverJarPath = join('/', array($serverDir, $serverJarName)); file_put_contents($serverJarPath, file_get_contents($serverJarUrl)); // create the start.sh shell script $scriptFilePath = join('/', array($serverDir, 'start.sh')); $scriptFile = fopen($scriptFilePath, 'w'); $scriptContent = "#!/bin/sh\n\ncd " . $serverDir . "\njava -Xmx2048M -Xms2048M -jar server_" . $params['serverVersion'] . ".jar nogui"; fwrite($scriptFile, $scriptContent); fclose($scriptFile); chmod($scriptFilePath, 0755); // save the current version to a text file - this will hopefully be temporary solution $versionFilePath = join('/', array($serverDir, 'current_version.txt')); $versionFile = fopen($versionFilePath, 'w'); $versionContent = $params['serverVersion']; fwrite($versionFile, $versionContent); fclose($versionFile); chmod($versionFilePath, 0644); // redirect the user back to the home page return $response ->withHeader('Location', '/') ->withStatus(302); } // GET server status route public function getStatus(Request $request, Response $response, $args): Response { $config = $this->get('config'); $serverDir = join('/', array($config->get('server_directory'), $args['serverName'])); // check if the server exists - if not, return a false result if (!is_dir($serverDir)) { $response->getBody()->write(json_encode(array('exists' => false))); return $response ->withHeader('Content-Type', 'application/json'); } // create server object and pass info back to client as JSON data $server = new Server($serverDir); $serverData = [ 'exists' => true, 'name' => $server->getName(), 'version' => $server->getVersion(), 'state' => $server->getState() ? 'Running' : 'Stopped', ]; $response->getBody()->write(json_encode($serverData)); return $response ->withHeader('Content-Type', 'application/json'); } // GET server start route public function getStart(Request $request, Response $response, $args): Response { $config = $this->get('config'); $serverDir = join('/', array($config->get('server_directory'), $args['serverName'])); // create server object and start it $server = new Server($serverDir); $server->start(); // redirect the user back to the home page return $response ->withHeader('Location', '/') ->withStatus(302); } // GET server stop route public function getStop(Request $request, Response $response, $args): Response { $config = $this->get('config'); $serverDir = join('/', array($config->get('server_directory'), $args['serverName'])); // create server object and start it $server = new Server($serverDir); $server->stop(); // redirect the user back to the home page return $response ->withHeader('Location', '/') ->withStatus(302); } }