121 lines
4.2 KiB
PHP
121 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace BitGoblin\MCST\Controllers;
|
|
|
|
use DiDom\Document;
|
|
use Psr\Http\Message\ResponseInterface as Response;
|
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
|
use Slim\Views\Twig;
|
|
|
|
use BitGoblin\MCST\Minecraft\Server;
|
|
|
|
class ServerController extends Controller {
|
|
|
|
// GET create server route
|
|
public function getCreate(Request $request, Response $response, $args): Response {
|
|
$view = Twig::fromRequest($request);
|
|
return $view->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);
|
|
}
|
|
|
|
}
|