mcst/src/routes.php

118 lines
4.2 KiB
PHP

<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Views\Twig;
use BitGoblin\MCST\Minecraft\Server;
// index GET route - this page should welcome the user and direct them to the available actions
$app->get('/', function (Request $request, Response $response, $args) {
$config = $this->get('config');
// find servers
$minecraftDir = $config->get('server_directory');
$serverDirs = glob($minecraftDir . "/*", GLOB_ONLYDIR);
$minecraftServers = array();
foreach ($serverDirs as $i => $m) {
array_push($minecraftServers, new Server($m));
}
$view = Twig::fromRequest($request);
return $view->render($response, 'index.twig', [
'servers' => $minecraftServers,
]);
})->setName('index');
// create GET route - this page allows a user to create a new server instance
$app->get('/create', function (Request $request, Response $response, $args) {
$view = Twig::fromRequest($request);
return $view->render($response, 'create.twig');
})->setName('create');
// create POST route - processes the new server creation
$app->post('/create', function (Request $request, Response $response, $args) {
// 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);
// grab the server JAR file
$serverJarUrl = "https://piston-data.mojang.com/v1/objects/f69c284232d7c7580bd89a5a4931c3581eae1378/server.jar";
$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_1.19.2.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);
});
// server status route
$app->get('/server/{serverName}/status', function (Request $request, Response $response, $args) {
$config = $this->get('config');
$serverDir = join('/', array($config->get('server_directory'), $args['serverName']));
// create server object and pass info back to client as JSON data
$server = new Server($serverDir);
$serverData = [
'name' => $server->getName(),
'version' => $server->getVersion(),
'state' => $server->getState() ? 'Running' : 'Stopped',
];
$response->getBody()->write(json_encode($serverData));
return $response
->withHeader('Content-Type', 'application/json');
})->setName('server.status');
// server start route
$app->get('/server/{serverName}/start', function (Request $request, Response $response, $args) {
$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);
})->setName('server.start');
// server stop route
$app->get('/server/{serverName}/stop', function (Request $request, Response $response, $args) {
$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);
})->setName('server.stop');