diff --git a/src/Controllers/ServerController.php b/src/Controllers/ServerController.php index 49ec284..c16827c 100644 --- a/src/Controllers/ServerController.php +++ b/src/Controllers/ServerController.php @@ -117,4 +117,36 @@ class ServerController extends Controller { ->withStatus(302); } + // GET edit server properties route + public function getEdit(Request $request, Response $response, $args): Response { + $config = $this->get('config'); + $serverDir = join('/', array($config->get('server_directory'), $args['serverName'])); + + $server = new Server($serverDir); + $data = array( + 'serverName' => $args['serverName'], + 'serverPort' => $server->getProperty('server-port'), + ); + + $view = Twig::fromRequest($request); + return $view->render($response, 'edit.twig', $data); + } + + // POST edit server properties route + public function postEdit(Request $request, Response $response, $args): Response { + // set up the POST parameters and grab our config + $params = (array)$request->getParsedBody(); + $config = $this->get('config'); + $serverDir = join('/', array($config->get('server_directory'), $args['serverName'])); + + // create server object and save new value + $server = new Server($serverDir); + $server->updateProperty('server-port', $params['serverPort']); + + // redirect the user back to the home page + return $response + ->withHeader('Location', '/') + ->withStatus(302); + } + } diff --git a/src/Minecraft/Server.php b/src/Minecraft/Server.php index 23dada3..a5f5632 100644 --- a/src/Minecraft/Server.php +++ b/src/Minecraft/Server.php @@ -84,11 +84,16 @@ class Server { return -1; } - // get parameter from server properties file + // get property from server properties file public function getProperty(string $param) { return $this->properties->get($param); } + // update property in server properties file + public function updateProperty(string $paramName, $paramValue) { + $this->properties->update($paramName, $paramValue); + } + // getters & setters public function getDirectory(): string { return $this->rootDir; diff --git a/src/Minecraft/ServerConfig.php b/src/Minecraft/ServerConfig.php index 94dcbaf..d1d89ac 100644 --- a/src/Minecraft/ServerConfig.php +++ b/src/Minecraft/ServerConfig.php @@ -4,9 +4,13 @@ namespace BitGoblin\MCST\Minecraft; class ServerConfig { + // path to the server.properties file + protected string $propertiesFile; + // loaded properties protected array $config; public function __construct($propertiesFile) { + $this->propertiesFile = $propertiesFile; // save the properties file $this->config = array(); // initialize array // parse config file @@ -15,7 +19,7 @@ class ServerConfig { $line = fgets($fh); $eqpos = strpos($line, '='); $parameterName = substr($line, 0, $eqpos); - $parameterValue = substr($line, ($eqpos + 1)); + $parameterValue = trim(substr($line, ($eqpos + 1))); // assign parameter values to the config array $this->config[$parameterName] = $parameterValue; @@ -26,4 +30,35 @@ class ServerConfig { return $this->config[$param]; } + public function update(string $paramName, $paramValue) { + // update the local variable value + $this->config[$paramName] = $paramValue; + + // update and save the server.properties file + $newFileContent = ''; + $fh = fopen($this->propertiesFile, 'r+'); + while (!feof($fh)) { + $line = fgets($fh); + + if (!str_starts_with($line, '#')) { + $eqpos = strpos($line, '='); + $parameterName = substr($line, 0, $eqpos); + $parameterValue = substr($line, ($eqpos + 1)); + + // use the new value if it's being updated + if ($parameterName == $paramName) { + $parameterValue = $paramValue . "\n"; + } + + $newFileContent .= $parameterName . '=' . $parameterValue; + } else { + $newFileContent .= $line; + } + } + + // save the new properties file + file_put_contents($this->propertiesFile, $newFileContent); + fclose($fh); + } + } diff --git a/src/routes.php b/src/routes.php index 45f4b97..5291ce3 100644 --- a/src/routes.php +++ b/src/routes.php @@ -21,3 +21,8 @@ $app->get('/server/{serverName}/status', '\\BitGoblin\\MCST\\Controllers\\Server $app->get('/server/{serverName}/start', '\\BitGoblin\\MCST\\Controllers\\ServerController:getStart')->setName('server.start'); // server stop route $app->get('/server/{serverName}/stop', '\\BitGoblin\\MCST\\Controllers\\ServerController:getStop')->setName('server.stop'); + +// edit GET route - this page allows a user to edit a server's properties +$app->get('/server/{serverName}/edit', '\\BitGoblin\\MCST\\Controllers\\ServerController:getEdit')->setName('edit'); +// edit POST route - processes the edits a server's properties file +$app->post('/server/{serverName}/edit', '\\BitGoblin\\MCST\\Controllers\\ServerController:postEdit'); diff --git a/views/edit.twig b/views/edit.twig new file mode 100644 index 0000000..32a6a6e --- /dev/null +++ b/views/edit.twig @@ -0,0 +1,35 @@ +{% extends 'layout.twig' %} + +{% block content %} + + +
+
+

Edit server: {{ serverName }}

+
+
+ + +
+
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+

Back

+
+
+ +{% endblock %} diff --git a/views/index.twig b/views/index.twig index f386735..cd02ba8 100644 --- a/views/index.twig +++ b/views/index.twig @@ -37,6 +37,7 @@ + {% endfor %}