From e32a27d4e14c1a562b402a6fd94efe7545205c75 Mon Sep 17 00:00:00 2001 From: rattatwinko Date: Mon, 14 Jul 2025 00:50:47 +0200 Subject: [PATCH] first shit --- .vscode/settings.json | 3 + README.md | 138 +++++++- pom.xml | 69 ++++ server_instances.json | 1 + .../mcmanage/EnhancedServerManagerUI.java | 313 ++++++++++++++++++ src/main/java/mcmanage/JSONManager.java | 76 +++++ src/main/java/mcmanage/Main.java | 11 + src/main/java/mcmanage/PaperAPIClient.java | 47 +++ src/main/java/mcmanage/ServerLocation.java | 18 + src/main/java/mcmanage/ServerManager.java | 226 +++++++++++++ src/main/java/mcmanage/ServerManagerUI.java | 141 ++++++++ src/test/java/mcmanage/AppTest.java | 38 +++ steps.md | 272 +++++++++++++++ .../mcmanage/EnhancedServerManagerUI$1.class | Bin 0 -> 834 bytes .../mcmanage/EnhancedServerManagerUI$2.class | Bin 0 -> 3011 bytes .../mcmanage/EnhancedServerManagerUI$3.class | Bin 0 -> 2571 bytes .../mcmanage/EnhancedServerManagerUI$4.class | Bin 0 -> 2282 bytes .../mcmanage/EnhancedServerManagerUI.class | Bin 0 -> 11751 bytes target/classes/mcmanage/JSONManager$1.class | Bin 0 -> 537 bytes target/classes/mcmanage/JSONManager$2.class | Bin 0 -> 662 bytes target/classes/mcmanage/JSONManager.class | Bin 0 -> 3810 bytes target/classes/mcmanage/Main.class | Bin 0 -> 1062 bytes target/classes/mcmanage/PaperAPIClient.class | Bin 0 -> 3767 bytes target/classes/mcmanage/ServerLocation.class | Bin 0 -> 1067 bytes .../ServerManager$ServerInstance.class | Bin 0 -> 1521 bytes target/classes/mcmanage/ServerManager.class | Bin 0 -> 11885 bytes .../classes/mcmanage/ServerManagerUI$1.class | Bin 0 -> 3675 bytes target/classes/mcmanage/ServerManagerUI.class | Bin 0 -> 6511 bytes .../compile/default-compile/createdFiles.lst | 15 + .../compile/default-compile/inputFiles.lst | 7 + 30 files changed, 1374 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json create mode 100644 pom.xml create mode 100644 server_instances.json create mode 100644 src/main/java/mcmanage/EnhancedServerManagerUI.java create mode 100644 src/main/java/mcmanage/JSONManager.java create mode 100644 src/main/java/mcmanage/Main.java create mode 100644 src/main/java/mcmanage/PaperAPIClient.java create mode 100644 src/main/java/mcmanage/ServerLocation.java create mode 100644 src/main/java/mcmanage/ServerManager.java create mode 100644 src/main/java/mcmanage/ServerManagerUI.java create mode 100644 src/test/java/mcmanage/AppTest.java create mode 100644 steps.md create mode 100644 target/classes/mcmanage/EnhancedServerManagerUI$1.class create mode 100644 target/classes/mcmanage/EnhancedServerManagerUI$2.class create mode 100644 target/classes/mcmanage/EnhancedServerManagerUI$3.class create mode 100644 target/classes/mcmanage/EnhancedServerManagerUI$4.class create mode 100644 target/classes/mcmanage/EnhancedServerManagerUI.class create mode 100644 target/classes/mcmanage/JSONManager$1.class create mode 100644 target/classes/mcmanage/JSONManager$2.class create mode 100644 target/classes/mcmanage/JSONManager.class create mode 100644 target/classes/mcmanage/Main.class create mode 100644 target/classes/mcmanage/PaperAPIClient.class create mode 100644 target/classes/mcmanage/ServerLocation.class create mode 100644 target/classes/mcmanage/ServerManager$ServerInstance.class create mode 100644 target/classes/mcmanage/ServerManager.class create mode 100644 target/classes/mcmanage/ServerManagerUI$1.class create mode 100644 target/classes/mcmanage/ServerManagerUI.class create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e0f15db --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "automatic" +} \ No newline at end of file diff --git a/README.md b/README.md index 1bf0069..534b75f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,139 @@ +<<<<<<< HEAD # mvn_MCMANAGE -manage mc servers with java \ No newline at end of file +manage mc servers with java +======= +# Enhanced Minecraft Server Manager + +A comprehensive Java Swing application for managing Minecraft Paper servers with automatic JAR downloading, server launching, and console management. + +## Features + +- **Server Management**: Create and manage multiple Minecraft server instances +- **Paper Integration**: Fetch and download Paper versions automatically from the official API +- **JAR Management**: Automatic downloading of Paper JAR files with latest builds +- **Server Launching**: Start servers with custom RAM allocation and port configuration +- **Console Integration**: Real-time server console output and command input +- **EULA Handling**: Automatic EULA acceptance and server.properties generation +- **Persistent Storage**: JSON-based configuration saving in the root directory +- **Multi-Server Support**: Manage multiple servers simultaneously + +## Requirements + +- Java 11 or higher +- Maven 3.6 or higher +- Internet connection (for JAR downloads) + +## Building the Project + +```bash +mvn clean compile +``` + +## Running the Application + +### Option 1: Using Maven +```bash +mvn exec:java +``` + +### Option 2: Using JAR file +```bash +mvn clean package +java -jar target/minecraft-server-manager-1.0-SNAPSHOT.jar +``` + +## Usage Guide + +### 1. Creating a Server +1. **Fetch Versions**: Click "Fetch Paper Versions" to load available Paper versions +2. **Add Server**: Fill in the server details: + - **Name**: Server instance name + - **Port**: Server port (default: 25565) + - **RAM**: Memory allocation in GB + - **Version**: Select a Paper version from the dropdown +3. **Save**: Click "Save Servers" to persist your configuration + +### 2. Setting Up a Server +1. **Select Server**: Choose a server from the list +2. **Download JAR**: Click "Download JAR" to fetch the Paper server JAR +3. **Automatic Setup**: The system will: + - Create server directory structure + - Generate `eula.txt` (automatically accepted) + - Create `server.properties` with your port + - Copy the JAR to the server directory + +### 3. Running a Server +1. **Select Server**: Choose the server you want to start +2. **Start Server**: Click "Start Server" to launch the Minecraft server +3. **Monitor Console**: Watch real-time output in the console area +4. **Send Commands**: Use the command field to send server commands +5. **Stop Server**: Click "Stop Server" to shut down the server + +## Project Structure + +- `Main.java` - Application entry point +- `EnhancedServerManagerUI.java` - Main GUI interface with server management +- `ServerManager.java` - Core server management and JAR downloading logic +- `ServerLocation.java` - Legacy server location model +- `JSONManager.java` - JSON persistence utilities +- `PaperAPIClient.java` - API client for fetching Paper versions + +## Directory Structure + +``` +minecraft-server-manager/ +├── servers.json # Legacy server locations +├── server_instances.json # Enhanced server configurations +├── servers/ # Server instance directories +│ ├── server1/ +│ │ ├── paper-1.20.1-123.jar +│ │ ├── eula.txt +│ │ ├── server.properties +│ │ └── world/ +│ └── server2/ +└── jars/ # Downloaded JAR files + ├── paper-1.20.1-123.jar + └── paper-1.21.1-456.jar +``` + +## Server Configuration + +### Automatic Files Generated +- **eula.txt**: Automatically set to `eula=true` +- **server.properties**: Basic configuration with your specified port +- **JAR files**: Downloaded from Paper API with latest builds + +### Memory Configuration +- **Xmx**: Maximum heap size (RAM GB × 1024 MB) +- **Xms**: Initial heap size (RAM GB × 512 MB) + +## API Integration + +The application integrates with the official Paper API: +- **Versions**: Fetches available Paper versions +- **Builds**: Downloads latest builds for selected versions +- **JARs**: Automatic JAR file management + +## Troubleshooting + +### Common Issues +1. **Port Already in Use**: Change the port number in server configuration +2. **Insufficient Memory**: Reduce RAM allocation or close other applications +3. **JAR Download Fails**: Check internet connection and try again +4. **Server Won't Start**: Check console output for specific error messages + +### Console Commands +Use the command field to send server commands: +- `stop` - Stop the server gracefully +- `save-all` - Save all worlds +- `list` - List online players +- `op ` - Give operator status +- `whitelist add ` - Add player to whitelist + +## Data Storage + +- **Server Configurations**: Stored in `server_instances.json` in the root directory +- **Server Files**: Each server has its own directory under `servers/` +- **JAR Files**: Cached in `jars/` directory to avoid re-downloading +>>>>>>> df9ed6a (first shit) diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f4a08ac --- /dev/null +++ b/pom.xml @@ -0,0 +1,69 @@ + + 4.0.0 + mcmanage + minecraft-server-manager + jar + 1.0-SNAPSHOT + minecraft-server-manager + http://maven.apache.org + + + 11 + 11 + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + com.google.code.gson + gson + 2.13.1 + + + com.formdev + flatlaf + 3.2 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 11 + 11 + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + + mcmanage.Main + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.0.0 + + mcmanage.Main + + + + + diff --git a/server_instances.json b/server_instances.json new file mode 100644 index 0000000..0bd8e64 --- /dev/null +++ b/server_instances.json @@ -0,0 +1 @@ +[{"name":"shit","version":"1.12.2","port":25565,"ramGB":8}] \ No newline at end of file diff --git a/src/main/java/mcmanage/EnhancedServerManagerUI.java b/src/main/java/mcmanage/EnhancedServerManagerUI.java new file mode 100644 index 0000000..0f78335 --- /dev/null +++ b/src/main/java/mcmanage/EnhancedServerManagerUI.java @@ -0,0 +1,313 @@ +package mcmanage; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.List; +import java.util.ArrayList; +import java.util.concurrent.ExecutionException; +import com.formdev.flatlaf.FlatLightLaf; + +public class EnhancedServerManagerUI extends JFrame { + static { + try { + UIManager.setLookAndFeel(new FlatLightLaf()); + } catch (Exception e) { + System.err.println("Failed to initialize FlatLaf"); + } + } + + private DefaultListModel serverListModel = new DefaultListModel<>(); + private JList serverList = new JList<>(serverListModel); + private JTextField nameField = new JTextField(15); + private JTextField portField = new JTextField(5); + private JTextField ramField = new JTextField(3); + private JComboBox versionsComboBox = new JComboBox<>(); + private JButton addButton = new JButton("Add Server"); + private JButton saveButton = new JButton("Save Servers"); + private JButton fetchVersionsButton = new JButton("Fetch Paper Versions"); + private JButton downloadJarButton = new JButton("Download JAR"); + private JButton startServerButton = new JButton("Start Server"); + private JButton stopServerButton = new JButton("Stop Server"); + private JButton sendCommandButton = new JButton("Send Command"); + private JTextField commandField = new JTextField(20); + private JTextArea consoleOutput = new JTextArea(20, 60); + private JScrollPane consoleScrollPane = new JScrollPane(consoleOutput); + + public EnhancedServerManagerUI() { + super("Enhanced Minecraft Server Manager"); + + setLayout(new BorderLayout()); + + // Initialize directories + ServerManager.initializeDirectories(); + + // Left panel - server list and controls + JPanel leftPanel = new JPanel(new BorderLayout()); + + // Server list + leftPanel.add(new JLabel("Server Instances:"), BorderLayout.NORTH); + leftPanel.add(new JScrollPane(serverList), BorderLayout.CENTER); + + // Control buttons + JPanel controlPanel = new JPanel(new GridLayout(2, 2, 5, 5)); + controlPanel.add(startServerButton); + controlPanel.add(stopServerButton); + controlPanel.add(downloadJarButton); + controlPanel.add(sendCommandButton); + leftPanel.add(controlPanel, BorderLayout.SOUTH); + + // Right panel - input and console + JPanel rightPanel = new JPanel(new BorderLayout()); + + // Input panel + JPanel inputPanel = new JPanel(); + inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.Y_AXIS)); + inputPanel.add(new JLabel("Server Name:")); + inputPanel.add(nameField); + inputPanel.add(new JLabel("Port:")); + inputPanel.add(portField); + inputPanel.add(new JLabel("RAM (GB):")); + inputPanel.add(ramField); + inputPanel.add(new JLabel("Paper Version:")); + inputPanel.add(versionsComboBox); + + JPanel buttonPanel = new JPanel(new GridLayout(3, 1, 5, 5)); + buttonPanel.add(addButton); + buttonPanel.add(saveButton); + buttonPanel.add(fetchVersionsButton); + inputPanel.add(buttonPanel); + + rightPanel.add(inputPanel, BorderLayout.NORTH); + + // Console panel + JPanel consolePanel = new JPanel(new BorderLayout()); + consolePanel.add(new JLabel("Server Console:"), BorderLayout.NORTH); + consolePanel.add(consoleScrollPane, BorderLayout.CENTER); + + JPanel commandPanel = new JPanel(new BorderLayout()); + commandPanel.add(new JLabel("Command:"), BorderLayout.WEST); + commandPanel.add(commandField, BorderLayout.CENTER); + consolePanel.add(commandPanel, BorderLayout.SOUTH); + + rightPanel.add(consolePanel, BorderLayout.CENTER); + + add(leftPanel, BorderLayout.WEST); + add(rightPanel, BorderLayout.CENTER); + + // Load saved servers + List savedServers = JSONManager.loadServerInstances(); + savedServers.forEach(serverListModel::addElement); + + // Button listeners + addButton.addActionListener(e -> addServer()); + saveButton.addActionListener(e -> saveServers()); + fetchVersionsButton.addActionListener(e -> fetchVersions()); + downloadJarButton.addActionListener(e -> downloadJar()); + startServerButton.addActionListener(e -> startServer()); + stopServerButton.addActionListener(e -> stopServer()); + sendCommandButton.addActionListener(e -> sendCommand()); + + // Enter key in command field + commandField.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + sendCommand(); + } + } + }); + + // Add tooltips and padding to buttons and fields + addButton.setToolTipText("Add a new server instance"); + saveButton.setToolTipText("Save all server configurations"); + fetchVersionsButton.setToolTipText("Fetch available PaperMC versions"); + downloadJarButton.setToolTipText("Download the selected PaperMC JAR"); + startServerButton.setToolTipText("Start the selected server"); + stopServerButton.setToolTipText("Send 'stop' command to the selected server"); + sendCommandButton.setToolTipText("Send a command to the server console"); + nameField.setToolTipText("Server name (used as directory)"); + portField.setToolTipText("Server port (default 25565)"); + ramField.setToolTipText("RAM in GB (e.g. 2, 4, 8)"); + versionsComboBox.setToolTipText("Select PaperMC version"); + consoleOutput.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); + inputPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + + setDefaultCloseOperation(EXIT_ON_CLOSE); + setSize(1200, 800); + setLocationRelativeTo(null); + setVisible(true); + } + + private void addServer() { + String name = nameField.getText().trim(); + String portStr = portField.getText().trim(); + String ramStr = ramField.getText().trim(); + String version = (String) versionsComboBox.getSelectedItem(); + + if (name.isEmpty() || portStr.isEmpty() || ramStr.isEmpty() || version == null) { + JOptionPane.showMessageDialog(this, "Please fill all fields and select a version", "Input Error", JOptionPane.ERROR_MESSAGE); + return; + } + + int port, ram; + try { + port = Integer.parseInt(portStr); + ram = Integer.parseInt(ramStr); + } catch (NumberFormatException ex) { + JOptionPane.showMessageDialog(this, "Invalid port or RAM number", "Input Error", JOptionPane.ERROR_MESSAGE); + return; + } + + ServerManager.ServerInstance server = new ServerManager.ServerInstance(name, version, port, ram); + serverListModel.addElement(server); + + nameField.setText(""); + portField.setText(""); + ramField.setText(""); + } + + private void saveServers() { + List servers = new ArrayList<>(); + for (int i = 0; i < serverListModel.size(); i++) { + servers.add(serverListModel.getElementAt(i)); + } + JSONManager.saveServerInstances(servers); + JOptionPane.showMessageDialog(this, "Servers saved!"); + } + + private void fetchVersions() { + fetchVersionsButton.setEnabled(false); + versionsComboBox.removeAllItems(); + + SwingWorker, Void> worker = new SwingWorker, Void>() { + @Override + protected List doInBackground() throws Exception { + return PaperAPIClient.fetchPaperVersions(); + } + + @Override + protected void done() { + try { + List versions = get(); + versions.forEach(versionsComboBox::addItem); + } catch (InterruptedException | ExecutionException e) { + JOptionPane.showMessageDialog(EnhancedServerManagerUI.this, "Failed to fetch versions: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } finally { + fetchVersionsButton.setEnabled(true); + } + } + }; + + worker.execute(); + } + + private void downloadJar() { + ServerManager.ServerInstance selected = serverList.getSelectedValue(); + if (selected == null) { + JOptionPane.showMessageDialog(this, "Please select a server first", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + + downloadJarButton.setEnabled(false); + consoleOutput.append("Downloading JAR for version " + selected.version + "...\n"); + + SwingWorker worker = new SwingWorker() { + @Override + protected String doInBackground() throws Exception { + return ServerManager.downloadPaperJar(selected.version); + } + + @Override + protected void done() { + try { + String jarPath = get(); + selected.jarPath = jarPath; + consoleOutput.append("JAR downloaded successfully: " + jarPath + "\n"); + + // Setup server directory + ServerManager.setupServerDirectory(selected); + consoleOutput.append("Server directory setup complete for: " + selected.name + "\n"); + + } catch (Exception e) { + consoleOutput.append("Error downloading JAR: " + e.getMessage() + "\n"); + e.printStackTrace(); + } finally { + downloadJarButton.setEnabled(true); + } + } + }; + + worker.execute(); + } + + private void startServer() { + ServerManager.ServerInstance selected = serverList.getSelectedValue(); + if (selected == null) { + JOptionPane.showMessageDialog(this, "Please select a server first", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + + if (selected.jarPath == null || selected.jarPath.isEmpty()) { + JOptionPane.showMessageDialog(this, "Please download the JAR first", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + + startServerButton.setEnabled(false); + consoleOutput.append("Starting server: " + selected.name + "\n"); + + SwingWorker worker = new SwingWorker() { + @Override + protected Void doInBackground() throws Exception { + ServerManager.startServer(selected, consoleOutput); + return null; + } + + @Override + protected void done() { + try { + get(); + } catch (Exception e) { + consoleOutput.append("Error starting server: " + e.getMessage() + "\n"); + e.printStackTrace(); + } finally { + startServerButton.setEnabled(true); + } + } + }; + + worker.execute(); + } + + private void stopServer() { + ServerManager.ServerInstance selected = serverList.getSelectedValue(); + if (selected == null) { + JOptionPane.showMessageDialog(this, "Please select a server first", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + + ServerManager.stopServer(selected); + consoleOutput.append("Stopping server: " + selected.name + "\n"); + } + + private void sendCommand() { + ServerManager.ServerInstance selected = serverList.getSelectedValue(); + if (selected == null) { + JOptionPane.showMessageDialog(this, "Please select a server first", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + + String command = commandField.getText().trim(); + if (command.isEmpty()) { + return; + } + + ServerManager.sendCommand(selected, command); + consoleOutput.append("> " + command + "\n"); + commandField.setText(""); + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(EnhancedServerManagerUI::new); + } +} \ No newline at end of file diff --git a/src/main/java/mcmanage/JSONManager.java b/src/main/java/mcmanage/JSONManager.java new file mode 100644 index 0000000..c55d684 --- /dev/null +++ b/src/main/java/mcmanage/JSONManager.java @@ -0,0 +1,76 @@ +package mcmanage; + +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.io.File; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +public class JSONManager { + + private static final String FILE = "servers.json"; + + public static List load() { + File file = new File(FILE); + if (!file.exists()) { + return new ArrayList<>(); + } + try (Reader reader = new FileReader(file)) { + Gson gson = new Gson(); + Type listType = new TypeToken>(){}.getType(); + return gson.fromJson(reader, listType); + } catch (IOException e) { + e.printStackTrace(); + return new ArrayList<>(); + } + } + + public static void save(List servers) { + try (Writer writer = new FileWriter(FILE)) { + Gson gson = new Gson(); + gson.toJson(servers, writer); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static List loadServerInstances() { + File file = new File("server_instances.json"); + if (!file.exists() || file.length() == 0) { + return new ArrayList<>(); + } + try (Reader reader = new FileReader(file)) { + Gson gson = new Gson(); + Type listType = new TypeToken>(){}.getType(); + List list = gson.fromJson(reader, listType); + return list != null ? list : new ArrayList<>(); + } catch (Exception e) { + e.printStackTrace(); + // If parsing fails, return an empty list and optionally log a warning + return new ArrayList<>(); + } + } + + public static void saveServerInstances(List servers) { + File tempFile = new File("server_instances.json.tmp"); + File targetFile = new File("server_instances.json"); + try (Writer writer = new FileWriter(tempFile)) { + Gson gson = new Gson(); + gson.toJson(servers != null ? servers : new ArrayList<>(), writer); + } catch (IOException e) { + e.printStackTrace(); + return; + } + // Atomic move to avoid partial/corrupt files + if (!tempFile.renameTo(targetFile)) { + System.err.println("Failed to rename temp file to server_instances.json"); + } + } +} diff --git a/src/main/java/mcmanage/Main.java b/src/main/java/mcmanage/Main.java new file mode 100644 index 0000000..13fc303 --- /dev/null +++ b/src/main/java/mcmanage/Main.java @@ -0,0 +1,11 @@ +package mcmanage; + +import javax.swing.SwingUtilities; + +public class Main +{ + public static void main( String[] args ) + { + SwingUtilities.invokeLater(() -> new EnhancedServerManagerUI()); + } +} diff --git a/src/main/java/mcmanage/PaperAPIClient.java b/src/main/java/mcmanage/PaperAPIClient.java new file mode 100644 index 0000000..24d78ed --- /dev/null +++ b/src/main/java/mcmanage/PaperAPIClient.java @@ -0,0 +1,47 @@ +package mcmanage; + +import com.google.gson.*; +import java.io.IOException; +import java.net.URI; +import java.net.http.*; +import java.util.ArrayList; +import java.util.List; + +public class PaperAPIClient { + + private static final String API_URL = "https://api.papermc.io/v2/projects/paper"; + + public static List fetchPaperVersions() throws IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(API_URL)) + .GET() + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + List versions = new ArrayList<>(); + + if (response.statusCode() == 200) { + try { + JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject(); + + if (json.has("versions")) { + JsonArray versionsJson = json.getAsJsonArray("versions"); + + for (JsonElement v : versionsJson) { + String version = v.getAsString(); + versions.add(version); + } + } + } catch (Exception e) { + System.err.println("Error parsing JSON: " + e.getMessage()); + e.printStackTrace(); + } + } else { + System.err.println("HTTP Error: " + response.statusCode()); + } + + return versions; + } +} diff --git a/src/main/java/mcmanage/ServerLocation.java b/src/main/java/mcmanage/ServerLocation.java new file mode 100644 index 0000000..752f866 --- /dev/null +++ b/src/main/java/mcmanage/ServerLocation.java @@ -0,0 +1,18 @@ +package mcmanage; + +public class ServerLocation { + public String name; + public String ip; + public int port; + + public ServerLocation(String name, String ip, int port) { + this.name = name; + this.ip = ip; + this.port = port; + } + + @Override + public String toString() { + return name + " (" + ip + ":" + port + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/mcmanage/ServerManager.java b/src/main/java/mcmanage/ServerManager.java new file mode 100644 index 0000000..9f6685f --- /dev/null +++ b/src/main/java/mcmanage/ServerManager.java @@ -0,0 +1,226 @@ +package mcmanage; + +import java.io.*; +import java.net.URI; +import java.net.http.*; +import java.nio.file.*; +import java.util.*; +import java.util.concurrent.*; +import javax.swing.*; + +public class ServerManager { + + private static final String PAPER_API_BASE = "https://api.papermc.io/v2/projects/paper"; + private static final String SERVERS_DIR = "servers"; + private static final String JARS_DIR = "jars"; + + public static class ServerInstance { + public String name; + public String version; + public int port; + public int ramGB; + public String jarPath; + + public transient Process process; + public transient BufferedReader consoleReader; + public transient boolean isRunning; + + public ServerInstance(String name, String version, int port, int ramGB) { + this.name = name; + this.version = version; + this.port = port; + this.ramGB = ramGB; + this.isRunning = false; + } + + @Override + public String toString() { + String status = isRunning ? " [RUNNING]" : " [STOPPED]"; + return name + " (" + version + ":" + port + ", " + ramGB + "GB)" + status; + } + } + + public static void initializeDirectories() { + try { + Files.createDirectories(Paths.get(SERVERS_DIR)); + Files.createDirectories(Paths.get(JARS_DIR)); + } catch (IOException e) { + System.err.println("Error creating directories: " + e.getMessage()); + } + } + + public static String downloadPaperJar(String version) throws IOException, InterruptedException { + // First, get the builds for the version + String buildsUrl = PAPER_API_BASE + "/versions/" + version + "/builds"; + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(buildsUrl)) + .GET() + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() != 200) { + throw new IOException("Failed to get builds for version " + version + ": " + response.statusCode()); + } + + // Parse the builds response to get the latest build number + com.google.gson.JsonObject buildsJson = com.google.gson.JsonParser.parseString(response.body()).getAsJsonObject(); + com.google.gson.JsonArray builds = buildsJson.getAsJsonArray("builds"); + + if (builds.size() == 0) { + throw new IOException("No builds found for version " + version); + } + + // Get the latest build (last in the array) + com.google.gson.JsonObject latestBuild = builds.get(builds.size() - 1).getAsJsonObject(); + int buildNumber = latestBuild.get("build").getAsInt(); + + // Download the JAR + String jarName = "paper-" + version + "-" + buildNumber + ".jar"; + String jarUrl = PAPER_API_BASE + "/versions/" + version + "/builds/" + buildNumber + "/downloads/" + jarName; + String jarPath = JARS_DIR + "/" + jarName; + + Path jarFile = Paths.get(jarPath); + if (Files.exists(jarFile)) { + System.out.println("JAR already exists: " + jarPath); + return jarPath; + } + + System.out.println("Downloading JAR: " + jarUrl); + HttpRequest downloadRequest = HttpRequest.newBuilder() + .uri(URI.create(jarUrl)) + .GET() + .build(); + + HttpResponse downloadResponse = client.send(downloadRequest, HttpResponse.BodyHandlers.ofInputStream()); + + if (downloadResponse.statusCode() != 200) { + throw new IOException("Failed to download JAR: " + downloadResponse.statusCode()); + } + + Files.copy(downloadResponse.body(), jarFile, StandardCopyOption.REPLACE_EXISTING); + System.out.println("Downloaded JAR to: " + jarPath); + + return jarPath; + } + + public static void setupServerDirectory(ServerInstance server) throws IOException { + String serverDir = SERVERS_DIR + "/" + server.name; + Path serverPath = Paths.get(serverDir); + Files.createDirectories(serverPath); + + // Copy JAR to server directory + Path jarSource = Paths.get(server.jarPath); + Path jarDest = serverPath.resolve(jarSource.getFileName()); + Files.copy(jarSource, jarDest, StandardCopyOption.REPLACE_EXISTING); + + // Create eula.txt if it doesn't exist + Path eulaFile = serverPath.resolve("eula.txt"); + if (!Files.exists(eulaFile)) { + String eulaContent = "#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).\n" + + "#Generated on " + new Date() + "\n" + + "eula=true\n"; + Files.write(eulaFile, eulaContent.getBytes()); + System.out.println("Created eula.txt for server: " + server.name); + } + + // Create server.properties if it doesn't exist + Path propertiesFile = serverPath.resolve("server.properties"); + if (!Files.exists(propertiesFile)) { + String propertiesContent = "#Minecraft server properties\n" + + "#Generated on " + new Date() + "\n" + + "server-port=" + server.port + "\n" + + "gamemode=survival\n" + + "difficulty=easy\n" + + "max-players=20\n" + + "online-mode=false\n" + + "enable-command-block=false\n" + + "spawn-protection=16\n"; + Files.write(propertiesFile, propertiesContent.getBytes()); + System.out.println("Created server.properties for server: " + server.name); + } + } + + public static void startServer(ServerInstance server, JTextArea consoleOutput) throws IOException { + if (server.isRunning) { + consoleOutput.append("Server " + server.name + " is already running!\n"); + return; + } + + String serverDir = SERVERS_DIR + "/" + server.name; + Path jarFile = Paths.get(serverDir).resolve(Paths.get(server.jarPath).getFileName()); + + if (!Files.exists(jarFile)) { + throw new IOException("Server JAR not found: " + jarFile); + } + + // Build the command + List command = new ArrayList<>(); + command.add("java"); + command.add("-Xmx" + (server.ramGB * 1024) + "M"); + command.add("-Xms" + (server.ramGB * 512) + "M"); + command.add("-jar"); + command.add(jarFile.toAbsolutePath().toString()); + command.add("nogui"); + + ProcessBuilder pb = new ProcessBuilder(command); + pb.directory(new File(serverDir)); + pb.redirectErrorStream(true); + + consoleOutput.append("Starting server " + server.name + " with " + server.ramGB + "GB RAM...\n"); + consoleOutput.append("Command: " + String.join(" ", command) + "\n"); + + server.process = pb.start(); + server.isRunning = true; + + // Start console reader + server.consoleReader = new BufferedReader(new InputStreamReader(server.process.getInputStream())); + + // Start a thread to read console output + CompletableFuture.runAsync(() -> { + try { + String line; + while ((line = server.consoleReader.readLine()) != null) { + final String outputLine = line; + SwingUtilities.invokeLater(() -> { + consoleOutput.append(outputLine + "\n"); + consoleOutput.setCaretPosition(consoleOutput.getDocument().getLength()); + }); + } + } catch (IOException e) { + System.err.println("Error reading console output: " + e.getMessage()); + } finally { + server.isRunning = false; + SwingUtilities.invokeLater(() -> { + consoleOutput.append("Server " + server.name + " has stopped.\n"); + }); + } + }); + } + + public static void stopServer(ServerInstance server) { + if (server.process != null && server.isRunning) { + try { + PrintWriter writer = new PrintWriter(server.process.getOutputStream(), true); + writer.println("stop"); + writer.flush(); + System.out.println("Sent 'stop' command to server: " + server.name); + } catch (Exception e) { + System.err.println("Error sending 'stop' command: " + e.getMessage()); + } + } + } + + public static void sendCommand(ServerInstance server, String command) { + if (server.process != null && server.isRunning) { + try { + PrintWriter writer = new PrintWriter(server.process.getOutputStream()); + writer.println(command); + writer.flush(); + } catch (Exception e) { + System.err.println("Error sending command: " + e.getMessage()); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/mcmanage/ServerManagerUI.java b/src/main/java/mcmanage/ServerManagerUI.java new file mode 100644 index 0000000..9225c89 --- /dev/null +++ b/src/main/java/mcmanage/ServerManagerUI.java @@ -0,0 +1,141 @@ +package mcmanage; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.List; +import java.util.ArrayList; +import java.util.concurrent.ExecutionException; + +public class ServerManagerUI extends JFrame { + + private DefaultListModel serverListModel = new DefaultListModel<>(); + private JList serverList = new JList<>(serverListModel); + private JTextField nameField = new JTextField(15); + private JTextField ipField = new JTextField(15); + private JTextField portField = new JTextField(5); + private JButton addButton = new JButton("Add Server"); + private JButton saveButton = new JButton("Save Servers"); + private JButton fetchVersionsButton = new JButton("Fetch Paper Versions"); + private JComboBox versionsComboBox = new JComboBox<>(); + + public ServerManagerUI() { + super("Minecraft Server Manager"); + + setLayout(new BorderLayout()); + + // Left panel - list of servers + JPanel leftPanel = new JPanel(new BorderLayout()); + leftPanel.add(new JLabel("Saved Servers:"), BorderLayout.NORTH); + leftPanel.add(new JScrollPane(serverList), BorderLayout.CENTER); + + // Right panel - input and buttons + JPanel rightPanel = new JPanel(); + rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); + rightPanel.add(new JLabel("Name:")); + rightPanel.add(nameField); + rightPanel.add(new JLabel("IP Address:")); + rightPanel.add(ipField); + rightPanel.add(new JLabel("Port:")); + rightPanel.add(portField); + + rightPanel.add(addButton); + rightPanel.add(saveButton); + rightPanel.add(new JLabel("Paper Versions:")); + rightPanel.add(versionsComboBox); + rightPanel.add(fetchVersionsButton); + + add(leftPanel, BorderLayout.CENTER); + add(rightPanel, BorderLayout.EAST); + + // Load saved servers + List savedServers = JSONManager.load(); + savedServers.forEach(serverListModel::addElement); + + // Button listeners + addButton.addActionListener(e -> addServer()); + saveButton.addActionListener(e -> saveServers()); + fetchVersionsButton.addActionListener(e -> fetchVersions()); + + setDefaultCloseOperation(EXIT_ON_CLOSE); + setSize(600, 400); + setLocationRelativeTo(null); + setVisible(true); + } + + private void addServer() { + String name = nameField.getText().trim(); + String ip = ipField.getText().trim(); + String portStr = portField.getText().trim(); + + if (name.isEmpty() || ip.isEmpty() || portStr.isEmpty()) { + JOptionPane.showMessageDialog(this, "Please fill all fields", "Input Error", JOptionPane.ERROR_MESSAGE); + return; + } + + int port; + try { + port = Integer.parseInt(portStr); + } catch (NumberFormatException ex) { + JOptionPane.showMessageDialog(this, "Invalid port number", "Input Error", JOptionPane.ERROR_MESSAGE); + return; + } + + ServerLocation server = new ServerLocation(name, ip, port); + serverListModel.addElement(server); + + nameField.setText(""); + ipField.setText(""); + portField.setText(""); + } + + private void saveServers() { + List servers = new ArrayList<>(); + for (int i = 0; i < serverListModel.size(); i++) { + servers.add(serverListModel.getElementAt(i)); + } + JSONManager.save(servers); + JOptionPane.showMessageDialog(this, "Servers saved!"); + } + + private void fetchVersions() { + System.out.println("Fetch versions button clicked"); + fetchVersionsButton.setEnabled(false); + versionsComboBox.removeAllItems(); + + SwingWorker, Void> worker = new SwingWorker, Void>() { + @Override + protected List doInBackground() throws Exception { + System.out.println("Starting background task to fetch versions"); + List versions = PaperAPIClient.fetchPaperVersions(); + System.out.println("Background task completed, fetched " + versions.size() + " versions"); + return versions; + } + + @Override + protected void done() { + try { + System.out.println("SwingWorker done() called"); + List versions = get(); + System.out.println("Retrieved " + versions.size() + " versions from SwingWorker"); + versions.forEach(versionsComboBox::addItem); + System.out.println("Added " + versions.size() + " items to combo box"); + } catch (InterruptedException | ExecutionException e) { + System.err.println("Error in SwingWorker done(): " + e.getMessage()); + e.printStackTrace(); + JOptionPane.showMessageDialog(ServerManagerUI.this, "Failed to fetch versions: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } finally { + fetchVersionsButton.setEnabled(true); + System.out.println("Fetch versions button re-enabled"); + } + } + }; + + worker.execute(); + System.out.println("SwingWorker executed"); + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(ServerManagerUI::new); + } +} \ No newline at end of file diff --git a/src/test/java/mcmanage/AppTest.java b/src/test/java/mcmanage/AppTest.java new file mode 100644 index 0000000..f950d72 --- /dev/null +++ b/src/test/java/mcmanage/AppTest.java @@ -0,0 +1,38 @@ +package mcmanage; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/steps.md b/steps.md new file mode 100644 index 0000000..8c28575 --- /dev/null +++ b/steps.md @@ -0,0 +1,272 @@ +## Step 1: Set up your project + +* Use Java 11 or higher (for built-in HttpClient) +* Add **Gson** to your build: + + * If using Maven or Gradle, add Gson as explained before. + * If plain, download gson JAR and add it to classpath. +* Create your package, e.g., `mcmanage`. + +--- + +## Step 2: Create ServerLocation class + +```java +package mcmanage; + +public class ServerLocation { + public String name; + public String ip; + public int port; + + public ServerLocation(String name, String ip, int port) { + this.name = name; + this.ip = ip; + this.port = port; + } + + @Override + public String toString() { + return name + " (" + ip + ":" + port + ")"; + } +} +``` + +--- + +## Step 3: Create JSON utility to load/save server locations + +```java +package mcmanage; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.*; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +public class ServerLocationStorage { + + private static final String FILE = "servers.json"; + + public static List load() { + File file = new File(FILE); + if (!file.exists()) { + return new ArrayList<>(); + } + try (Reader reader = new FileReader(file)) { + Gson gson = new Gson(); + Type listType = new TypeToken>(){}.getType(); + return gson.fromJson(reader, listType); + } catch (IOException e) { + e.printStackTrace(); + return new ArrayList<>(); + } + } + + public static void save(List servers) { + try (Writer writer = new FileWriter(FILE)) { + Gson gson = new Gson(); + gson.toJson(servers, writer); + } catch (IOException e) { + e.printStackTrace(); + } + } +} +``` + +--- + +## Step 4: Create PaperAPI client to fetch versions + +```java +package mcmanage; + +import com.google.gson.*; +import java.io.IOException; +import java.net.URI; +import java.net.http.*; +import java.util.ArrayList; +import java.util.List; + +public class PaperAPIClient { + + private static final String API_URL = "https://api.papermc.io/v2/projects/paper"; + + public static List fetchPaperVersions() throws IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(API_URL)) + .GET() + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + List versions = new ArrayList<>(); + + if (response.statusCode() == 200) { + JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject(); + JsonArray versionsJson = json.getAsJsonArray("versions"); + + for (JsonElement v : versionsJson) { + versions.add(v.getAsString()); + } + } + return versions; + } +} +``` + +--- + +## Step 5: Build the Swing GUI + +```java +package mcmanage; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class ServerManagerUI extends JFrame { + + private DefaultListModel serverListModel = new DefaultListModel<>(); + private JList serverList = new JList<>(serverListModel); + private JTextField nameField = new JTextField(15); + private JTextField ipField = new JTextField(15); + private JTextField portField = new JTextField(5); + private JButton addButton = new JButton("Add Server"); + private JButton saveButton = new JButton("Save Servers"); + private JButton fetchVersionsButton = new JButton("Fetch Paper Versions"); + private JComboBox versionsComboBox = new JComboBox<>(); + + public ServerManagerUI() { + super("Minecraft Server Manager"); + + setLayout(new BorderLayout()); + + // Left panel - list of servers + JPanel leftPanel = new JPanel(new BorderLayout()); + leftPanel.add(new JLabel("Saved Servers:"), BorderLayout.NORTH); + leftPanel.add(new JScrollPane(serverList), BorderLayout.CENTER); + + // Right panel - input and buttons + JPanel rightPanel = new JPanel(); + rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); + rightPanel.add(new JLabel("Name:")); + rightPanel.add(nameField); + rightPanel.add(new JLabel("IP Address:")); + rightPanel.add(ipField); + rightPanel.add(new JLabel("Port:")); + rightPanel.add(portField); + + rightPanel.add(addButton); + rightPanel.add(saveButton); + rightPanel.add(new JLabel("Paper Versions:")); + rightPanel.add(versionsComboBox); + rightPanel.add(fetchVersionsButton); + + add(leftPanel, BorderLayout.CENTER); + add(rightPanel, BorderLayout.EAST); + + // Load saved servers + List savedServers = ServerLocationStorage.load(); + savedServers.forEach(serverListModel::addElement); + + // Button listeners + addButton.addActionListener(e -> addServer()); + saveButton.addActionListener(e -> saveServers()); + fetchVersionsButton.addActionListener(e -> fetchVersions()); + + setDefaultCloseOperation(EXIT_ON_CLOSE); + setSize(600, 400); + setLocationRelativeTo(null); + setVisible(true); + } + + private void addServer() { + String name = nameField.getText().trim(); + String ip = ipField.getText().trim(); + String portStr = portField.getText().trim(); + + if (name.isEmpty() || ip.isEmpty() || portStr.isEmpty()) { + JOptionPane.showMessageDialog(this, "Please fill all fields", "Input Error", JOptionPane.ERROR_MESSAGE); + return; + } + + int port; + try { + port = Integer.parseInt(portStr); + } catch (NumberFormatException ex) { + JOptionPane.showMessageDialog(this, "Invalid port number", "Input Error", JOptionPane.ERROR_MESSAGE); + return; + } + + ServerLocation server = new ServerLocation(name, ip, port); + serverListModel.addElement(server); + + nameField.setText(""); + ipField.setText(""); + portField.setText(""); + } + + private void saveServers() { + List servers = serverListModel.elements().asIterator().toList(); + ServerLocationStorage.save(servers); + JOptionPane.showMessageDialog(this, "Servers saved!"); + } + + private void fetchVersions() { + fetchVersionsButton.setEnabled(false); + versionsComboBox.removeAllItems(); + + SwingWorker, Void> worker = new SwingWorker<>() { + @Override + protected List doInBackground() throws Exception { + return PaperAPIClient.fetchPaperVersions(); + } + + @Override + protected void done() { + try { + List versions = get(); + versions.forEach(versionsComboBox::addItem); + } catch (InterruptedException | ExecutionException e) { + JOptionPane.showMessageDialog(ServerManagerUI.this, "Failed to fetch versions", "Error", JOptionPane.ERROR_MESSAGE); + } finally { + fetchVersionsButton.setEnabled(true); + } + } + }; + + worker.execute(); + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(ServerManagerUI::new); + } +} +``` + +--- + +## Step 6: Run & test + +* Launch your `ServerManagerUI` main class. +* Add servers manually and save them. +* Click “Fetch Paper Versions” to load versions from Paper API. +* The versions appear in the combo box dynamically. + +--- + +## Summary + +* You have JSON save/load with Gson. +* You fetch Paper versions dynamically using Java 11 HttpClient. +* You use Swing for a simple GUI to manage your servers and versions. + +--- diff --git a/target/classes/mcmanage/EnhancedServerManagerUI$1.class b/target/classes/mcmanage/EnhancedServerManagerUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f985aa07f14c2bb7473fd079cf628bcf4cc1ceaf GIT binary patch literal 834 zcmaiy-)a*<6vn?v)@-ubHk-D#R-@LswP_2Dz49VbkPtDL6d^VD)7?X|Hkl2((@5XO zS14!&FMI$WN<6a-B1p)>{5yQ}JKvc-zkdJt3E&m#CFGE|VY#@6g23)1m`Eju)M%@b zQ~`y3N@kSwvS9MDCzAwTN|%}D9Sd%AuT z%BiM=v9BW)=~IDx{b1l=6%`wviz?Oxw*J4@HUI%td-dg29Sj7lyOfn~r0DEwazV+tycn~IwQd~9@jxb#InRTZc{2fj zDce73a#5Fb{UM<=B{o#6cNbLOG(H5U++L^d8a}RkNL#kl~*7|2^t<||DdaX(N#A6jFG$9E#bk!bKd6QV~xgBS!4tIygDp4 HHSqTbY0|y{ literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/EnhancedServerManagerUI$2.class b/target/classes/mcmanage/EnhancedServerManagerUI$2.class new file mode 100644 index 0000000000000000000000000000000000000000..f7f1c3c868bdcf33e87cfe742814bbca359e85af GIT binary patch literal 3011 zcmb_e>vt1H6#q?{cH4B@hVqh!P_aNC&?qP>sa0B1NlhP`k_sp~-AtRM$xhgvw8a;` zUw?uBfnVhu1ndVzJ?J?e|0a)jb~jzARE1r^Fpg6!XGe74EbzbkAq|PcXEplI`_BMd;k4;OPX~(P1EA zq7x>=?kjwiucy2<+gVQK_3wgoSA~bn+dy3qMVTXyG*hL#G3)0+C2bDRw zGP`(1SSoGcF^2AD-45)6Kj)wt9MZJ{ZBPNbwfXL;R zC8`wlsX%wDBT>edYL2Cd%G3nWS*r*)-HF{8GBJ!}491dlGu$c>6`>&;uDm>i_hH(=UIIByUuL$DR;%dQGCC#wnj-os_ zr8U%yrZp6`W0IjYi&#j#>A{{&hDbjI^*10S$1X3p!crcV1_c`Zp&nUM_Ig*7Hyp*M|;6|08YppGZ?u8VMquj=a6>a8+~3_K|wq zH_nF9tr3oqg?Nz|VQ8=SGPQL8Y$y_l5h5tzO=UrAyPBi8R;@?Uzsb%+9O%j`B6XTq zeF6+DHWlD}$(3sXU9-NudP_$R)zEOm;RkLMiM}B1Vp_+Z$jh2*iAh^$WB)_Wxe?t& zl)j8(m8C~@J}p#97EP4&LEqKX?!@Da@YFf!(HWE+mr{Ak<<&sL>uEzdfeNTOrHLx8 z(#>+ei*09Bu835QR~Cz$H24y?lyt8#bXKCXzoN%ts1$5)jyuJ&@cMI7uGFg08V@Tv z!azmjA9BZSK(W1TUBKwi4+isBU*gBMNV*!9q_fY6+}j&A_^eYd%o3 zRWE?X(RFZgaleI8#vet$V68I3;4Sb}JsE?_|ws0SygHvm=&i=Pi@0ytT z-}nx_ycEe#orZ{LGk5Lylwsc_r|K>CDcR>&Vqd+FPxmnfGwV3QohWn96P|%D=+N2{ z^n+^0z*kK-%!9(F+cqdPy4qv(`Tq^mopW{n>jXnPWX4E;N literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/EnhancedServerManagerUI$3.class b/target/classes/mcmanage/EnhancedServerManagerUI$3.class new file mode 100644 index 0000000000000000000000000000000000000000..cf3c833a509b82290d61cadb0e540c5832214101 GIT binary patch literal 2571 zcma)7U2_vv7=BJ0x^39fP$(5d2pDLa0!0x~LaS{l{U8M-r6{O)x;eDlZg<1(rY$O? zKf{0Et<03l^g_M%4>;qMI-{cwdh4Czb9U2`^aIIE&N=&@_w#u_&iDVWegohf9yFm2 z^#&3qcA!Dv=)5&AT{*3KhTIwHTB=x3{(|zyBcgv}G;>CvA)K*;%xQAx|BpSV^*5Sm zLQ=q7kWMC0j2TZ((g97`u)+vxGdW){($>KFxQvR5vZ^t_~tLxfKN)oO^CJrObD5g~?u(z|C z?dsGl(aRY)N-G=v(;;U}9Mka{v(mpN!m%X0(IQCG`h zsZ0mjBQMtgADd81VZX0ru9XFJ(!?o^MEks)Q-hvs$?&Ef&hVsj7Y0e3#w!M1HE{;7 z3A9zGZe0@-Crc&evLxEJLTOUN{<_I(eS>fWDlC`c9A312g5ml11+tybSxj+ZoHvov zC?#AuuUa8+QsdNT;w`)_uzM|i%-ldZ40ScM)uIrSSr7vlG;qY6k#QelqEYiP+*rI1yZ#4yH8Tt;3X$@Gt_AYe0Ytb$58wz61GYLTlZ zuIbijDX~n$LMW}d313=DSJQP91+8vZ(HnIKcr)#LWsP;d3bJjAA@|&%GO$6fNJm@p zwyUm`=cklEp+nYv`z(+M`Pt5qyRu!H=;}sQzBVNEBObvKm7=*qo#r#1_ z1Ll%&FmJ%sJ?Ih3r{lnO7rZ%DnObpMUXqng`J%eTDvYtx5$P5k6=d?BH&-s@s$#6v zTNR~7aN>SRZNYxKioY_qsz+Hx#h`SYf*q<{Bkl&W9w`VUlYD8G#>glj}axwD7xlkGno;m24N?{=Cx)&+=PK z?9491SjO(hX#a|z)yjU1l$kMGMcFO#BuE+NdK)R8s7xH8oc8YX>nHcS7_B z?%+?#J%LNwJ?;;l)c=Fa28NY^JI$$! z#9k*`W8Xt&&Ax+hy|WSZIE69lJ2s)-07=0*Owl{N7ooT(7{gu6M3fHL-1pMQSsE!t ds~@c)7I<@jH@ZCZua&RqBI|AmALCQ({}1xjpymJo literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/EnhancedServerManagerUI$4.class b/target/classes/mcmanage/EnhancedServerManagerUI$4.class new file mode 100644 index 0000000000000000000000000000000000000000..791facf527aa18eb48e4ef92904c5cd7feb9830c GIT binary patch literal 2282 zcma)7ZC4vr5PmKRSqKXW;Z16-v4)ZtB)-%l4Wf{SLQOzT8npFo*<6z?VQe=6Po3?%)4D{}aFxTEiGXNJCi1AR-Lc z56lC@Hkv$NvRj62@Lx=(wk$XGK3SJvWnNJJhja`h%Ag+_?Uc*g z+?2e*Fn@NsFG$MYZP~6=85E+>F{)uqM+|X>nMcN~n|mTCr?P zt}=wunffpin9wk(V+zv@$ya5{Flq|h6>YxLm7T7nK;>Yhdo_L}*Bow8K5t-F!xbHG z;wr=Rspmcv3?r1kBYh>qTKYBNUJ^A^j}n#Fbi9ouA#8HWa5A0otn+PyxY*fyM9dQ7 z30&9lE>aBRffUxeQVN@4sy~3QCQvspuOY1?gDk^DAM_VTqb`>v+t_QX@`ck6GIb3L zJ!3zI(vitK(h_zQIV|ePgW4oY$yT`QQd^zRxhfqhU?D-x_@R!EK;1QSVC?gvuuVhm zTCzne)d$jLxRDN^?VSt~&{IWm3riY4(Xou%gtrgMiz-sL7@ZEc3CPq%Zi($2R&;!- zS}xY1EM-+1=6=mFOs*>NnU2q~#xT|pTlPBr({w~vxl8mFr7o;SfuS6z{w0%Dc+LLE z)QS6|Xb_jNvSst_?!g{+YN{#}yev$kT{j#{?R(0wnpcL@S%6DYNZq7Vqo*~bGvS7? z$t|PD@0)XFCi_v3mx|HxqG{OfYlvFQ5s&@chO1W7He}Z!XNA5d3{3G#pu`?`=l82B z#j5B!Cf~3W+20V{&y2c8u{qFvET$o$pcI2VfD5G0pR;`}RGr zn`9RzO^)7Mh|@}W{fEw|G&i#+cx%^p`%d@-bH8G#+>4Ss!F$i~0dRtkXx z0ep$CJoz=MB*XMctKq(ZpD{(bsv88pH%g6SMyTB5y=! literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/EnhancedServerManagerUI.class b/target/classes/mcmanage/EnhancedServerManagerUI.class new file mode 100644 index 0000000000000000000000000000000000000000..37f9585e4d5c6eacaa3368dd4cf6ad5b810c1709 GIT binary patch literal 11751 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 Hk%IpPTgX6% literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/JSONManager$1.class b/target/classes/mcmanage/JSONManager$1.class new file mode 100644 index 0000000000000000000000000000000000000000..4d704eaa2abe52763654f75840343cb3a7c2e994 GIT binary patch literal 537 zcmah`O-lnY5PfN@+tzAptM%)m;Gy;4;>klxFGW#VtFXm;+{QJ!O(e+{{8^p^5B>mu zlsLNziU>}~yqT9|@`ibPe|ZIPh|MYrD0(Q>Fo$`Dok&mpSnD_uer&b!jkrlf@wsrfdg5V)VdXEiHMFrt{U@4F zsM}8WmlFD{JQCKOXzLhir%DMkOt`heVjCU}B{N2w#zI)3$S2I1y=Sl|A_}OI&yImD nERe5#ULahgYz|B03#g-!<1(6rCA6@L^_*#8gRn}kJVLS$kJ*5Y literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/JSONManager$2.class b/target/classes/mcmanage/JSONManager$2.class new file mode 100644 index 0000000000000000000000000000000000000000..6d59b273f65d19ea81e89a6b833e2a79cf68899d GIT binary patch literal 662 zcmah{O-~y!5Pc2_OVTuf4d4BiK!P5+5*#=XaY02;E$JZ<$4X{1-554DvK=IT7AGVQ z`~ZFwVm3gVR1vl1d7kId%o};`A8zje?BG)c1xy7fR#C#Vz?a1Iqtuu*qbPMoN0xqP zl=!G~bwM3-PFi5PskHKY0#h5CCjn*z7W+wGYMD~>qy4jWJiOYqErH^`>5@P_R+?Ia z{wdjxJk6L1W0T12L|T>m&t%c}loMEvC#TyLD7RIrr5{*M@hkqX)@FPrFJ(0FDvM&} zeDiPSHrY$EFH)bpBkjD@3GMFj7O1q%z$SE{a>27Boqfx*a#!DVk{PFTdQ84&x&h_| z<|k>dVi8LMjm*gIcqwi-+}Qj_CfA;6k@JVfd4cMY)@1iH=^VKL?*!KW)Of9n03Sww zW-L^oHm(Do5%47BOYq@YU@Y@3VjMDGZy>IjD4@bNe+IVkhHdpJfblJRCDhm!P{-^L c=MXX$(ZB+hhfD)2j3LJajQLu{dwfLs5vDh(;s5{u literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/JSONManager.class b/target/classes/mcmanage/JSONManager.class new file mode 100644 index 0000000000000000000000000000000000000000..f142d1d324400714c27030f686216cbc7ae6c8cc GIT binary patch literal 3810 zcmb7HTXz%J75>H^dE{ZZ*+4AE1jpfK$+l{ogdn-*VlWtFn?$aOT~ZjNK?o#`G8!95 z+UC-GdP~~0xwJ2N;x**KtQD`-^eGShM_DT??zd+~(um4r70{fSbM`rV@9+EeIfwsz z_vOC;9LGO&bf8m%Y9N9x1-ovWYi6=!Rtm|58@H{TtDtMLSSh+w3ObJtFKLJ>Fg&B8 zot!C_EDgGXJ>^{4te6EWc`>^%Kj*zVQ5dwXS+xy!%JeZ+dvO`>DangthqJM@rs7M3VOX6t8THBJncB<{S3!-?2!ce6!e6{dc`vH zmZRe-^ozr%73>Zi265AwhW!jZXP1)&+b)!>WPvdz&wGIm$fAP^_O;9G;JA(h=#zZ+~?KkzC2Hk-1}aNIk+AZ#ni|^G3}s{@Shbp!SI`%xtuey`^QHP~^fbG0?q1HSxSyp5L&0JRjZPhBs?*l6&TKi z5b&3e;yeZDEAv{hQgh8p&T2|@*1$zvqSKO9DY&;h0bbNFx0M=>>Bxv0GI&nI%XJhy zOhYJKMk)qHN5PeU$y%y~3C?t3ig{*%m|N?OnVk5(n1XZaVC%w!Ps1OW zYx8&t^R6KM{ZwqZGE)&^T0Ii$s1%;aK!NU>4i6Lmqkc4O4eXY#1UEfvuR1x)Uu#$B zY#x*36l|NfYVMpRrN$tP*-FK7rb{Nb`kIE16dY>QmLG9@XBs{sT8b!8omL_sPL;BHmY2R zla+Jm1KM)Wwnx~0DZY+fpJLkv_AEcbzRx%C)G}9&Wi~Ltj%VgJaDeTz>lm6J zNsO-J@V^mHsfl%r#MIB{q}QkxfqLm?n?o_$jA%;Ae#P=XlG97T?jS%Kn!&FzG=%)qrp$PFPOzH~j#; z0vX!|WDgMaPJ`iK1P442h(Bt14ncmVw#6(dxX{pX){c#BbeX~ z>Nvp=SmK=1Ls9s!$c(q~4s)1bzYhi@#k=?gZGXw1FB$3i6~6?YF?4Nmc>)vHh(7bK z10&xJV7`HJhLETMCckEkziG(rpY+znwchsRHdB||CorhG3*8?+S$7%gZhjpLVco^l zuMv%@51Hc(=uYtO6vZ}6SzV=Iud|iaYJ7Kz`aQ}?aGzqn6TDvfxK9yxUyid}?YBf*n=Vj?}d|pyBtV2bke=6Vd-m#g_xd{z%6D zR9CU`8C58Zz3wrVC1X@Ew+i8oTfyXV;t_r{AM6b&HKxYDh8Azq!EN9qe-wCMO7&li zR3xUxBHSNh>Q^FscAt2d7+J>>`TqhdJ=fQ9L*&1ox8XAc^(-N}#C8v>eWf9PpPDIB zbCM&nC!A&xoZ*~lK2OnhhSt-({+-1&oFhdSNcAkmc&S0nVeT?Qjmp_6uOvEYAMr|} zQ_>DfLgyCzXYLgIe-K{7`+VyNm5ErrM{A*`itd0DmIb#A{$p_rNWBbf5=xTQI>3S= zZylS=Lk*7w6&8JbhQ9$tzd?u8S!8EG+Xuw!FZADmzv4r-U3|;1UjN4TevTbrD}OS6 MgTLcre2VV>0zMmU^Z)<= literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/Main.class b/target/classes/mcmanage/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..565746b9895b4f035f24b7e2f305ac9dfdecfb70 GIT binary patch literal 1062 zcma)5T~8B16g^W)mt7WHiWWgdz@jZG>sP`&70$GLW$p5yQMx!|+J>JQkW^xpWa;xnUvCu-l z6x0WM4i-&6*BBQ5rPjD4qUmbb77STmD)DyEYYM$@m@?%3u*HK0*V6ctU^?zfqL%f~ zpi~H^H$p3vJ|$?@V@)kp$_+Z_xD?r10F>pvOo%NofGMzel0v8ENr5@PF{+d*re6)xkIsS+^27cA`V47JjPS3 F`~?(=2e<$L literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/PaperAPIClient.class b/target/classes/mcmanage/PaperAPIClient.class new file mode 100644 index 0000000000000000000000000000000000000000..51fb50a88276880e0ba75828eedba0ce456ac237 GIT binary patch literal 3767 zcmaJ^`(GSa75`pX_AZ-Apd=yPghWCiA+%xBhc;beG$3h~E(C!POH=ExJ6R?yGuxS2 z8hlr6)jqUVZ5yApKBD#2R;7^GTHm$$7x?iH@h9u|&dhFh!;l~L?tPqd?m6G{y7SKe zuDl80Zu~2WCNxXLG_)Wt(0)N**3%{3DyC1*Uoi5XK>V0#nci`M=Ke#oNhHuJk<_pS zn!wFIxn+3i1@H7(KAz7LX~$6-7^Gw`U6{iAg4XY zw2DJ@=97463-;kX65Sg1qeozWO;QcX>&&17Dvl{|XDC~tt_0P|-Hg@0tXD&y0=N0z z(HV95K@I&lB+xRi&=lBvBP{8mTXCDjVGV;w3mlA6*Dc$YYxEA=g_TpfRVW#bE0D0y z2LK2RY;wa!K364lo25}8mxejaq?b)?Y?Cd&n%@+ zIF7!OGhHu0ZShu?q|a=1o>HAJ^~!e316c6Ci;d zRW$0djVcT`Bw+wu5+A~-#7PbJ;uNpW+e_)9Z5K;My6DDg!t@MB_iV!6S@otLIoWWZi8qhDL_vdr^8y{$f~!g*AZgizagnu+kus+^ z7BrZCq*&Zm4q4Pt!V;b98&`F1V*~}eywOHk;$aOA2-vo3H>ybH9eRPu)PQ5?n?rLF zm1+X`K{e8QXpGoaUiZ$L-U4ULAj_ix2O{0)TUB3OllTH2 zlXzUi7xAU45si8f>9W$QWL;-}h@9$f9-h$fr0RriKJB!p=ND%jJx^@~o>tm^MR8}t zLQ<~+<+H0ibY?0?M{lhEY>8E~X7y5qg&`Kyhqjz)855PIdBd5}=Sw{3$k}0g44KKgo_qW+F#kkoJnJNfKDZ>;L5X&t6k?Bya2yAoJgjJc& znh;4IWDl*n;1hL45{040YiVW}Esdc@<>LA94Y50-tOs3Nnc!5P1bZUL!sbc3gcCLb zfv!lxu=+EsgJVB~L!3GrJ+V@*dgI6qL>&vx>SNoT}z6r#RBA1%AQfE(Fn9on?;L#$szU!HbliH>LjP_ijy}^nkq22 zH@=+))s4h$*tR{_bM*4K;Vsw&w=IsfB-U|7;;KrS-_!VO%9+-(y=bI^tP67fq@HIL zWm9~iKHEdWKxpuyaC>vMy;v!S4Zj}ZI?x*!XXvyD@(1eZs|B!bD-XIyRN~km9;0UR{uPb z_$yuEL(}kxj(WSW`q!~ayv^tD22i80l6a>fI2zCiVP(<;oFdua|GYPcj=umjNp6tJ~eojcfN=p za26w;FX4ye@8bGL_%ZeFqbq(w`AwAk3?}hYI^<`h=;Tgt_Hym)=RErb&kmyHT@)ZC z5)#`aj!M`PQxfMS-z@kq`iCXFR6Bl2;yBrVg;($z=S}zxMf}#E{f?M|Uwchp*x(I+ k`~&{Ty&fvMk0*bMxAI%#DE>@C|HA*jas7Av1OG(o|BZ4gjQ{`u literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/ServerLocation.class b/target/classes/mcmanage/ServerLocation.class new file mode 100644 index 0000000000000000000000000000000000000000..9ac80376dc5aae11745f550f283d7c94bedee681 GIT binary patch literal 1067 zcma)5QEw7K5dIb@2Y40)Y(;Htl`33o(I=xcK1kBo1oeRiAADM116Ph+a<`E5pZGI0 zftd8cAK;HN&K{SP1~le!w==`c_sx7e{Q7GT1)s-;Wt&6Ygb8zgybW^kZ)cC zwzTice%(N9+Q^#vm^(J^9UFNRsA#NwVq|A|YVNL$Eo>VOJ`@cl3Hh_D2V@1BOC2!0 zuB@W3M$W3MF^0;2*0!muhU(EM*`_PS$H}N8{Bz#%!r^FKug!he_)##S2QKwiYW_u< zIzvjUg%%9O%G&NSEj97G;?y-Xg`3(Q8%61+-YKO6?ep;mp$DoLWRoaoaDb;4o*C&X z4CQO_T{%@lx~A|B7HXdIu2%jf!`EdkqQnL0doFvP2+B>RhLdr9Rmi2tjl%QGu~?J- zWhsBLU-jkrBZvm~yq2p)Jq3rsVtW<#hE*BtGbx4N@OTi2z`}EegOvf-^=+ZXu>0>+ z+VjPb*r$bz(f-B3%#xEucORX!rR2vbvVnW_Es^JupP;ko`~Y(f=dhfkIc_^UbL75< z+4t$YMHL|A1k&_muu0ejLVZ9{XHk!b*ddRQLS7bHhS_veH2;vWr(HaXm`_3<$U8G4 zoe}2@xhqP=H>!xi@Fpo2$b~$1Xy+rIIQGJgZ{8B8EyA!#Fp zNrAZ&c`8dC=^d3`9-b&i3rs$7Jy$;!NaPC#Q%GaVLdM2tumx^*ov!rckt#J+aH@ix z2n4G!s(GQ7o}&bkp6t?O>mTWxI&i(CvLT$YF>BZ?GK8-08Q$q zS)M&-<2r5#EOupERejHq`bSqEb7Vy8P@tY4mpksM)y92=aTiZ_B7#0V+ zd#HkadDw}r#dl=qKnAYCLuXPSyHvPV|D-FXl(hEaI~ADEpPPY6W>)t}I^ERLY46Bh zw3mfDXA18>mQ2&{2aeiwBaLSY?6#>RZrM?Fz=Ji)gXo|-cFPGI$8WxC#}-)2Qe1sYezrgXF)ycPImG~dI(m~>lut&R#;>%QOa z_sSy|8xxIs&Me%2+f$>H!|+!l4DnMek0y0UQI(xe)77e+#xv$sUm*IKI7Pcs{1c+MK7du+7+|`%G{9W(Vse1_ zVq$>BKca<2_RFx?Uqcd0m?E0N3b)Pi%eYQ-1M8f<8&hHfUlNf#k}RT;5p52#V*Vl| zqLC4vq@dd<4P~{-V4`jn-(&Gtq_bClLn^yeC$!k6+2+{h*FTU5zcVrcqt1N2T*cI^ zMM@TiI94)?MSR8m1-@pKg$etag>Sg^UBU_6!~MuUz$03d>Bnr}qe7JBe43wom4|+g IO>E=xzdImnW&i*H literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/ServerManager.class b/target/classes/mcmanage/ServerManager.class new file mode 100644 index 0000000000000000000000000000000000000000..6ee016938b175f7a7d770bb655951a3716700c0b GIT binary patch literal 11885 zcmcIq34B!5)jwx4$(u|b2@J9f7#xr-Ly|#MtO;0>5HOfPOduFg@MY#D8JNr)-@E}* zyV-rQ`=)l$)>gZ>S_vVkVr@&Uwbt6ru6D28?Y^r0-+SMiB^j*W_x-+K^1JiiUCurG zIrrT6z*AHA5Ya`x^Md4~3XS|aRZT|X)^FNJOuI+E*Z~SMX<6Bo)krUa*6-NK^hl6usZOK0I?baH(|oyG zI%&m*lPNRSYdE7>>@#9w+t#(+1zgnX*8Q`)8dO&aj8=`#Vp>%S+;D)wP|h)9+pt%g z_ZFmuv`C}HI)!P;ER4idU^Fjon}%auF$hSo9#!Q~z^n}rye&RXjtBqi^1I|L1h>a>m;nHG&1hs_Qv9XFi4NoN#K zS;t5_;KS-Naw-EXNX-<}XuVG7(S{=0iqM1dWCXIQH1ID6bs$7c(I8z&8#TH}r{~bc zOpBG6O(!<$IGNa`XgX3!GYu7*lQxeQzn|?7Luw&#+mgb7ZsDht$|yV9Ko=xx-lQHM@jsgp_1L*LWa1rt;H#k8Uv*{+5IXH0Ib zq3v|3MqN7Xpv#z+=ON|EpRqSoB4;O=&i5471>~tf=dVJphj2gWY7@Pk~7l? z-GSXWxon4(fZ4&Lc7@=86T-^yzNU=$yUH3|KhyWA3&k^q6mDye(fAYDt(*XRX0y^vmX2C6); zwfT+OY}){g*s~@~E&y5A(MvRXsZK8wQVy5H(FN_#CZA`9s6sfa>*$pt+P#V?vKF!| zx5{H&fG!sly;jV>MsV?UI=x=(6_B`hrJWG@DG`F;-y}5V%}f`UA)-qub+IciqeCI8 zqNql1%X?5S3U?>dhj+M_KBeN zPMzK*B36Z!0~H!YLlh9~*-f|T^j_f_=2*jB=}gXzRUxXTTLqEt7r~&M5omNS^5Js;%3D$CCTKCKNqLKLKEH65o3 zjZWw^NhcA8%I9P&Rfg6j!*v`k#-BFE@DrM?BO$6$P(Q8H-2$YBOhh14L#OCojXtB( zee_u@E#;V)0iOX470J?034LMSVV4jk0DWGk)AR)Zx6Q1TIs#OpWfjVExFrAtProR5 z`T)~l*<~~2@?UvbZhn9sgvpt?l+o-Qa|F^438cTmwAS6TjA`XHUv8<x=!DqZ-NC!j8x9tH9RASa{XLclhuXE)X=we`VM_p`GxjzN2H_v zwGI1`V0?d;=I_dw>4G^wrqd7UM+n|W?W6`}~#?bvM|bJ~#F!ao@q5DJL%gjf5U=NTmTrC08T z`wG%usUkrC1RerR4gH&*)aWUlp2l{?@)DEbtBgcqMk?wF2R`jM`*f}lL{-|x*!K1i zh3M80&8J%ftYL>Hm=BbPt91?vyQy`owjt;|jv%g8v99wRk&6c$ONHA2*8yDG8p$O! zp6AI@s#~vZ#gVSN31yJy@_b|fd=@BmwNlb5FmJ^AFdYQkP@e#!$*E!BcS%@E1U7fMkQt zQCImqwo;}V1W-jgrkBzP&MxFmowqRp zV1=E7uy(KQepX>e$!?a_mWWT-y_9K?yLgAjm+9QiJ@Ac^SyH!wXgp`z$T4Fb)>tNG zI%2`LoRhQR$^t;CEjyl$GhI@wM0vojQvO#^kn}FF&6Bh|q3#v#(iU>OT<1RSSBdMc zoRd#jgf!e8z`EiQh-@eC5z-hyj#>~|$((%+0|7=BP@n98Tr3 zqaj)Z=f(#;#*64V2NYMqVhrn-b*onI`^3&n_*%!Dh3@pqf)5oZ+9j$fklOZjEU zJF}+KVc4eAYh}S93kK&$CJZI2?QQGr>^s=j+jX$Lt-ljC>=k4NL`o6hS0Pss2ij~) zEM{bq%^3r+cr4xw%{;OphR`fZd)b)m237r?eFL3+{Rg*p^}&vIw0Vzybxf@jO0hFH zHe}kng~f^V(TW?X0mDv;cem5;j3yz)#b@AsD_pRsBqog%PDdrRGzQ2*#j2>>g*9`K zlE)AC7#Vk$xe4oNI%OG&UP03i1Dc|t2AP%osaEI0J$6bIRopVr5~Zr;ias(Ab*nl{ z%S?0YAwVO5d{veyn9eRc(X9pGgs*TAM_Mtr+=0){B5*b?JFL!|kV^`dkac9p$D4$! z!~ndJU8rQc3Qv+?(Ip~1N&qf~5ce=TWMLIF)OoCP$%2X%dOYeDmWp;fbG)s9KsS}+bZjd^30(mSX)3qb=1f#M$yRB_J0k$pxBH1Dh$EjN@01vtl&z4A#@l8 ze?*hHN}z>IlgXD6C9fj+yZMsTTGIv>R?b*-24z8I%yNYYh5(R}X=SJdT#=rB^Lek6LW z0mebPUY=?qvNn%IC8CZx^7^MG!U2AaspZ)Q*_a!mvN4XS_z++m!&hxH;GYu_$BG~Y zh^Udsuw_Tw`4N^|{RG(Tv0#h$K0P6t% z5>^SY^7+>=K%@x~BPDXi@rWu8N>qP~>|m=Kq6OD5P4@pDxoCk}4|0C^4^U@s85kmf zJCWIUI0#y6Wrc04#{9Bay? zjByz6<_+tER$4f$Cb?$VNM+5SDbHO^u9I&XN?Gy4o7GS@V;oI40T~DRA~LMa=WPU8 z|3VD($Wqu8ReNUA_as!eUlGNTWHzrdIIW2~&vL+f8o|e%BIKU71e2iRf2x`1 zF-`=flU!gJ#kNbtwo7$>n7@j*dhxbQ=ZE+!0be8!UN{*6KCUViuvu~Lmf%rGT9{X_ zQ6n1>2xrWM5dBJICyZ|r^sY2av?FC?v*MVkxv2>Timx0sUxQa|C^;(hxru-A{Umg% zXekb43I(ssuKAk0?+;{xQX-Gi(5CrNcq+(kRYx{i(#}i{5rI{n!vB; zH{h+B-zIZ46ac+)Xu;GzUNPCuzan(9#(lx6}N~?xb^~6SQiI8i*#S=?=Me z1+BsXyMo28O8}Xu36rFP8}gW}raFETznO^Ng1KOVsZo6$(0VI1 zf_~6cp#w}ECLD-P(fLH(lXOAPB(}+hBr2YvSZ1IQvC+R9w zV!jsELa&~n*G$m$8w1e=fhht*TdMICuAZVd;yEZDKvzpmxW;8*iyqeT z_|{2!`;9dJPP!>vGez%~3=G$NQoIMJ=sofsG=_t-iENqE7@jjpHw!Xr!?gu67YTIT zjwyPdi!>%kDnAg`{dd#tgB5quhx#Y!6IZxcM;Y?RbKfqEhz`z5xom0`<}x`6gISBMPYRt6e_?-l?$0QsK=iz+p$k^dKJgwK}_5IsrjHM&-#>z<|| znlocqji6<30IN@lMVG7f{1L#e!oKzVQCP{x`4h@Y_yl?b82e`QF1l-qreG-RT%GG_ z#DlbBj7__pu$7Z^k1(9i`KZO;6!sUZ$NhU7Lti>cU&av3!d2LtXu~u;Ja~d0nWV2x z(YK)3RpCluERSNw_a^BFd!bZn{~t@WY7G5E0fFh{fov=Q!Q7us(Jui=3s;4;a)5p% z0SQ;8oXR%XG~uI%Af<67V?irzT8k_7jpRTNk3#Q`(N#2#(dW|(@OM33M{lQ>z#d)- zv%elveI0J;-XOK>N=QD9FS0%fE>vN38C>Q`Xb8B-cQPykyFAEup$~^ZT=g7>Hu$jH z$9V!z71;9@K7l7cc6~Wd;;9mQZQ+x6s*+l;oP1AX(<+UQOM#w(G}S*r|M9ucDJf7t zHmHX)g^VTW0{$6n7i96H_WGqE1JT-be$ri-AvnkK?vxIYi zcZA&jqCCSi{S~78yKt4Ef1IR$`Dkz0AH9oto}Wgi*iRt4sM9ApD+`_Txyl=FI*C&R zE|zPAHmN1^8Gc7RPV?Nsu>S;ygdR=vg2BcUyl8?K?+sV_C;05Wk}k396h|a&>*n+F zuz!-zo#HjJBO0!p;I+rOG3q}~zm87x`oU@5Fo-pc6MVr5ZaKl5kMox3x+&gDFz8G7 z3T08QYzS3zqBldNZ^7-e7avM(j`h(uF^ni{As=$GChYE zNcHhy$G=HuQi1&*;d}TLl;#0C#P{-NP|p|6M8st^b|0`8E<`8af+wj%DNc!=d=_S} z0=|Ib!`yDckJGeWsmqpW-sy6v7tG(?4X*B;;K6khyw5XHzDimaB6&9=IYzFYVncR` zNL~xa--?R|Wpt}yC`4aE@0U?Ie+ZHMD~S3JW6swQ6uwHE;NUN#Z%AH5U>M7grhJY+ z4>+4-d_RpR;HdcHMfz(sJ|H6f7x;dcm``D81tzvAVlGs~G#3$bf`@t6ecLp_F+V% zC8s58TRgE+3*RGrfkyzYau3wa4T{WK5x}dk05(Di5U^!}hX;F3Q>bz0x~3^k3f)ZI z{`BL~3aIhA=oH(khb~q`Ad}*pBx2T#MJ@grePREpJAg3JQsh_l@^=^7Cg_>?-35mv zewFmvaovu+pid{khAG&@Jy>@iMd-62^fXqTLWXuP*4{_$=<7z`E<6w5`D#4J@m+_= z94`QEwfGkJ0l=w%MuhlFc=BPb%Hf0_Ci2WmC>xN>nuC=~5W(sVjUSv3mf;-W%6uCD zh=sM$bs})_5y65d3aP93j+y9l_zdCm5(yD=F0|!`Fpbcfoy*$+aJsJr?UOIY#*2HuVnih+5S$pPssL(R%l4nL{kLqN z5-sv{(fVZTmu;0VKo!0^-&|jve4j7d1+rb_j)gICJ%US38R)Lx*M75n- heXFagk-Hu6t)Xh)TKq=wejJCmb$D;|HT%|6_&@$%3bFtI literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/ServerManagerUI$1.class b/target/classes/mcmanage/ServerManagerUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..9a1e6707d2b91400a2e9acc1d6e047f43780d6f6 GIT binary patch literal 3675 zcmcImYkM2T89iewURl}1igJMjLPTnU?Iehl7AQ{B#*W=6wH+55r4ZV%lE(JN(vGsb zvKg@dU2&f(-WH4hwhM*o%DvJ2%lOU^TRbnn$BUk=4kbkkgB!!=()F#(oR; z*f@YZ18rwy)@expCd!!jv0?qg!zhAF?oL<31b` z*lxUPFAJms_gQJuRm>5)AsfRO(T1I6Ij+2l6P|O!C60p7@xnm+U5t$+Jx}9^z}^HD z`Kt2d&~U!u)M~PtAs-&FQ2=4?U6k~HSIbqS0|F<&5%X znzfq1p(H}Fhsn^}PWRvwHa>}yq@Po%$OglEINH0>kt9G1O|KG?It88HW?lLQt#KQt zFhQy;D1XAKED7XeM+|HmHw~9^=#BDr+C~v)NIt`k7BR+}VW>3aI+GJkGc{9~wlHJk zEM{Zgw*78x%>*)>@SHNSBxi=68ZM>rI6a%}D1m(0SjzkIsEmXy%nRIOvTcAadZG0F zW+RlUwes4+x~4yC<4Il6y;POKc|2|5b2dJY z3$3a%rrKKsGNjzJ3<7qbZsxJrb>-!df}^=#?!rA@PvRa=Y0Fg`Qa7XlQ`YPimF0Qg zsmL7ro|6W#+cM$%%C~T_t81M(Yhs^uJeh%unvFUL(T-qAt;VjNa-Eu56gVEk@2rMo zO1;6t^1{(X_lSv@n2B91>W0#ThK)k!Zr^f;2}){QRhhAYDc6%T z&3ak-^O^!|G*gO&U2=R^f5($4-N*&*zOBx|W1|A;R?)J4BahqNh^u=#6<=<&ln-{v z9^V-43GUCdQKu*UbMB(&giW6wA8PfRwzb=6Na@BUAo!2Zg-$ln$TkD?w9_zwTliuJ z@8*|$wHl@AtZ}kcOo{Fo+x}o*5)qb^TOBp=&8enek&~`QVOLj2d_dO_;hOL&H5HK7 z(=uFA~iJry}1nzrWGETYDv65f# zRXv{olnHwygE#Rb3qQ7T6+aO;xFKOvPQ6@pm@~c|(Zkk39QwninpS&FVWcM=Acd!sitz z;OGR`d-%?b9R4fB$lqXH<5v$tKKm#GTtt)4J&_bvu*xsW8*Oaey5;j)pmkk}bse~l zZMmH{u=^(Nn&SBI`?y!&7VZZ)dH5ZQ_8J5FGz1T%G(6Z)*pEiS*n!xXjh$G-WjgaL zrER{WnddmV!kHA`=kYv8J$Qj%UobLsNa(L#&cCZ2I!xOmH*oZyIGA+mSme~mdl2v8 z!%yDCqvvihD|jDcJxDk|Y2+fYPo-|)(^}_esPiq9sP7!rKXnVwMA~kkq9vob1t7QB zdlSo>Zr(e+$@GzbTr;UD;sWLvfPOz=-dFj&fG@N3b>JGM8KwtJRhr0TnW%f2sz;fs zB3{HiUc%FOnLD1NYgd@!=ZVw{-2Wn8=h~ZGyUOv~9KXZyb-ZE#(1>Pvm5tK=3=UD| zC8n9Fj6rEZ5lLw%UgqjH^!^7IES$e$;g#LlQ>4U$L`9RMKoPBA3o%fd0vkD|p`}1< zVIA7O7~C(>Z@uqTyvBEm_xG>hYi8yle4XzRGWHwP@m=%$K7Pn3eu|&tx90mT^ZcE8 V{sDiYe2%&__x113jQ=|J{txx{@;d+k literal 0 HcmV?d00001 diff --git a/target/classes/mcmanage/ServerManagerUI.class b/target/classes/mcmanage/ServerManagerUI.class new file mode 100644 index 0000000000000000000000000000000000000000..12ab830f83abe047c4aae1da1a05eb45292c723e GIT binary patch literal 6511 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 LkqMcS^H}%4rQM&9 literal 0 HcmV?d00001 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..1014211 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,15 @@ +mcmanage/ServerManager.class +mcmanage/JSONManager$1.class +mcmanage/EnhancedServerManagerUI$2.class +mcmanage/ServerManagerUI$1.class +mcmanage/EnhancedServerManagerUI$1.class +mcmanage/JSONManager.class +mcmanage/JSONManager$2.class +mcmanage/EnhancedServerManagerUI.class +mcmanage/PaperAPIClient.class +mcmanage/Main.class +mcmanage/EnhancedServerManagerUI$4.class +mcmanage/ServerLocation.class +mcmanage/ServerManagerUI.class +mcmanage/EnhancedServerManagerUI$3.class +mcmanage/ServerManager$ServerInstance.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..0842c13 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,7 @@ +/home/rattatwinko/Documents/gitproj/mvn_MCMANAGE/src/main/java/mcmanage/JSONManager.java +/home/rattatwinko/Documents/gitproj/mvn_MCMANAGE/src/main/java/mcmanage/ServerLocation.java +/home/rattatwinko/Documents/gitproj/mvn_MCMANAGE/src/main/java/mcmanage/ServerManager.java +/home/rattatwinko/Documents/gitproj/mvn_MCMANAGE/src/main/java/mcmanage/ServerManagerUI.java +/home/rattatwinko/Documents/gitproj/mvn_MCMANAGE/src/main/java/mcmanage/EnhancedServerManagerUI.java +/home/rattatwinko/Documents/gitproj/mvn_MCMANAGE/src/main/java/mcmanage/PaperAPIClient.java +/home/rattatwinko/Documents/gitproj/mvn_MCMANAGE/src/main/java/mcmanage/Main.java