6 Commits

Author SHA1 Message Date
5ac22babab Bugfixes and optimizations
Fixes a bug where the server version is not updated on load.
Optimized downloading of all jar files.
2018-03-29 16:09:08 +02:00
46bb3a9e29 Merge branch 'master' of github.com:EpicKnarvik97/Minecraft-Server-Launcher 2018-02-27 10:59:17 +01:00
cf0d1f7fff More comments 2018-02-27 10:58:05 +01:00
6ba2397e40 Update README.md 2018-02-26 00:54:12 +00:00
2476e379e5 Merge branch 'master' of github.com:EpicKnarvik97/Minecraft-Server-Launcher 2018-02-23 21:44:21 +01:00
5ed0236888 Some fixes and additions
Added log for GUI label.
Removed quotes around jar path to make things work on linux.
2018-02-23 21:38:42 +01:00
7 changed files with 112 additions and 167 deletions

View File

@ -1,5 +1,5 @@
# Minecraft-Server-Launcher # Minecraft-Server-Launcher
I originally created this software in 2013 using AutoIt. Since I am now learning Java, and I have wanted to rewrite it for a long time, I am trying to recreate it in Java. It is currently missing mostly everything, but it's nothing a lot of work can't fix. I originally created this software in 2013 using AutoIt. Since I am now learning Java, I have recreated it in Java.
The original version can be found at: https://knarcraft.net/Downloads/Bungeeminecraftserverlauncher/ The original version can be found at: https://knarcraft.net/Downloads/Bungeeminecraftserverlauncher/
Its goal is to do everything the original does, just better. The original is 1595 lines of code repetition and dirty code. I had no prior programming experience when I first started working on the original, which is why it became such a mess. Its goal is to do everything the original does, just better. The original is 1595 lines of code repetition and dirty code. I had no prior programming experience when I first started working on the original, which is why it became such a mess.

View File

@ -27,7 +27,7 @@ import static net.knarcraft.serverlauncher.Shared.stringBetween;
public class Main { public class Main {
@SuppressWarnings("CanBeFinal") @SuppressWarnings("CanBeFinal")
public static String appDir; private static String appDir;
private static boolean running = false; private static boolean running = false;
static { static {
@ -37,6 +37,11 @@ public class Main {
e.printStackTrace(); e.printStackTrace();
System.exit(1); System.exit(1);
} }
try (PrintWriter file = new PrintWriter(Main.getAppDir() + File.separator + "latestrun.log")) {
file.print("");
} catch (IOException e ) {
e.printStackTrace();
}
} }
public static void main(String[] args) { public static void main(String[] args) {
@ -45,7 +50,6 @@ public class Main {
setup(); setup();
new ServerConsoles(); new ServerConsoles();
Profile.load(); Profile.load();
ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(Main::updateConsoles, 10, 500, TimeUnit.MILLISECONDS); exec.scheduleAtFixedRate(Main::updateConsoles, 10, 500, TimeUnit.MILLISECONDS);
} catch (Exception e) { } catch (Exception e) {
@ -63,6 +67,10 @@ public class Main {
} }
} }
public static String getAppDir() {
return appDir;
}
/** /**
* Reads from server processes, and writes the output to consoles. * Reads from server processes, and writes the output to consoles.
*/ */

View File

@ -32,9 +32,9 @@ public class Profile {
private static final ArrayList<Profile> profiles = new ArrayList<>(); private static final ArrayList<Profile> profiles = new ArrayList<>();
private static Profile current; private static Profile current;
private static GUI gui; private static GUI gui;
private static final String profilesDir = Main.appDir + File.separator + "files"; private static final String profilesDir = Main.getAppDir() + File.separator + "files";
private static final String profilesFile = Main.appDir + File.separator + "files" + File.separator + "Profiles.txt"; private static final String profilesFile = Main.getAppDir() + File.separator + "files" + File.separator + "Profiles.txt";
private static final String jarDir = Main.appDir + File.separator + "files" + File.separator + "Jars" + File.separator; private static final String jarDir = Main.getAppDir() + File.separator + "files" + File.separator + "Jars" + File.separator;
private final ArrayList<Collection> collections; private final ArrayList<Collection> collections;
private final String name; private final String name;
@ -139,6 +139,11 @@ public class Profile {
this.downloadJars = value; this.downloadJars = value;
} }
/**
* Set the current profile to the profile with a certain name.
*
* @param name The name of the profile
*/
public static void setCurrent(String name) { public static void setCurrent(String name) {
for (Profile profile : profiles) { for (Profile profile : profiles) {
if (profile.name.equals(name)) { if (profile.name.equals(name)) {
@ -456,6 +461,12 @@ public class Profile {
} }
} }
/**
* Parses a profile, and creates a profile with the data.
*
* @param profileData The data of the new profile
* @return The new profile
*/
private static Profile parseProfile(String[] profileData) { private static Profile parseProfile(String[] profileData) {
return new Profile( return new Profile(
profileData[0], profileData[0],
@ -465,6 +476,12 @@ public class Profile {
); );
} }
/**
* Parses a server, and creates a new collection.
*
* @param profile The profile which to add the collection
* @param serverData The data to parse
*/
private static void parseServer(Profile profile, String[] serverData) { private static void parseServer(Profile profile, String[] serverData) {
profile.collections.add(new Collection( profile.collections.add(new Collection(
serverData[0], serverData[0],
@ -480,6 +497,11 @@ public class Profile {
); );
} }
/**
* Downloads all jars to the program directory.
*
* @throws IOException On version file failure or folder creation failure
*/
public static void downloadJars() throws IOException { public static void downloadJars() throws IOException {
if (!new File(jarDir).exists() && !new File(jarDir).mkdirs()) { if (!new File(jarDir).exists() && !new File(jarDir).mkdirs()) {
JOptionPane.showMessageDialog( JOptionPane.showMessageDialog(
@ -490,146 +512,64 @@ public class Profile {
); );
throw new FileNotFoundException("Unable to create jars folder"); throw new FileNotFoundException("Unable to create jars folder");
} }
downloadSimple("Spigot"); try {
downloadSimple("Craftbukkit"); downloadAll();
downloadSimple("MCPCplus");
downloadMixed("Vanilla");
downloadMixed("Snapshot");
downloadSponge();
downloadBungee();
gui.setStatus("Finished downloading jars"); gui.setStatus("Finished downloading jars");
} } catch (FileNotFoundException e) {
gui.setStatus("One or more downloads failed: " + e.getMessage());
private static void downloadSimple(String typeName) throws FileNotFoundException {
ServerType type = ServerType.getByName(typeName);
String url = Objects.requireNonNull(type).getDownloadURL();
String name = type.getName();
Boolean success;
for (String version : type.getVersions()) {
File file = new File(jarDir + type.getName() + version + ".jar");
if (!file.isFile()) {
Path filePath = Paths.get(jarDir + type.getName() + version + ".jar");
if (gui != null) {
gui.setStatus("Downloading: " + name + version + ".jar");
}
success = downloadFile(url + name + version + ".jar", filePath);
if (!success) {
if (gui != null) {
gui.setStatus("Error downloading: " + name + version + ".jar");
}
throw new FileNotFoundException("Error downloading: " + name + version + ".jar");
}
}
} }
} }
private static void downloadMixed(String typeName) throws IOException { /**
AdvancedServerType type = (AdvancedServerType) ServerType.getByName(typeName); * Downloads jar files for all possible server versions.
String url = Objects.requireNonNull(type).getDownloadURL(); *
String name = type.getName(); * @throws IOException If a jar fails to download.
String versionText; */
String newestVersion; private static void downloadAll() throws IOException {
Boolean success; for (ServerType type : ServerType.getServerTypes()) {
String url = Objects.requireNonNull(type).getDownloadURL(), name = type.getName(), newestVersion;
AdvancedServerType advType = type instanceof AdvancedServerType ? (AdvancedServerType) type : null;
for (String version : type.getVersions()) { for (String version : type.getVersions()) {
File file = new File(jarDir + type.getName() + version + ".jar"); Boolean success;
Path filePath = Paths.get(jarDir + type.getName() + version + ".jar");
if (gui != null) { if (gui != null) {
gui.setStatus("Downloading: " + name + version + ".jar"); gui.setStatus("Downloading: " + name + version + ".jar");
} }
File file = new File(jarDir + type.getName() + version + ".jar");
Path filePath = Paths.get(jarDir + type.getName() + version + ".jar");
switch (type.getName()) {
case "Vanilla":
case "Snapshot":
if (version.equals("Latest")) { if (version.equals("Latest")) {
try { newestVersion = stringBetween(readFile(Objects.requireNonNull(advType).getVersionURL()), advType.getSrcStart(), advType.getSrcEnd());
versionText = readFile(type.getVersionURL());
} catch (IOException e) {
throw new IOException("Error reading: " + type.getVersionURL());
}
newestVersion = stringBetween(versionText, type.getSrcStart(), type.getSrcEnd());
if (!file.isFile() || !newestVersion.equals(getVersion(name))) {
success = downloadFile(
url + newestVersion + type.getDownloadURLPart() + newestVersion + ".jar",
filePath
);
setVersion(name, newestVersion); setVersion(name, newestVersion);
if (!success) { success = (file.isFile() && newestVersion.equals(getVersion(name))) || downloadFile(url + newestVersion + advType.getDownloadURLPart() + newestVersion + ".jar", filePath);
if (gui != null) {
gui.setStatus("Error downloading: " + name + version + ".jar");
}
throw new FileNotFoundException("Error downloading: " + name + version + ".jar");
}
}
} else { } else {
if (!file.isFile()) { success = file.isFile() || downloadFile(url + version + Objects.requireNonNull(advType).getDownloadURLPart() + version + ".jar", filePath);
success = downloadFile(url + version + type.getDownloadURLPart() + version + ".jar", filePath);
if (!success) {
if (gui != null) {
gui.setStatus("Error downloading: " + name + version + ".jar");
} }
throw new FileNotFoundException("Error downloading: " + name + version + ".jar"); break;
} case "Spigot":
} case "Craftbukkit":
} case "MCPCplus":
} success = file.isFile() || downloadFile(url + name + version + ".jar", filePath);
} break;
case "SpongeVanilla":
private static void downloadSponge() throws IOException { newestVersion = stringBetween(readFile(Objects.requireNonNull(advType).getVersionURL() + version), advType.getSrcStart(), advType.getSrcEnd());
AdvancedServerType type = (AdvancedServerType) ServerType.getByName("SpongeVanilla"); success = file.isFile() || downloadFile(url + newestVersion + advType.getDownloadURLPart() + newestVersion + ".jar", filePath);
String url = Objects.requireNonNull(type).getDownloadURL(); break;
String name = type.getName(); case "Bungee":
String versionText; newestVersion = stringBetween(readFile(Objects.requireNonNull(advType).getVersionURL()), advType.getSrcStart(), advType.getSrcEnd());
String newestVersion;
Boolean success;
for (String version : type.getVersions()) {
File file = new File(jarDir + name + version + ".jar");
Path filePath = Paths.get(jarDir + name + version + ".jar");
if (gui != null) {
gui.setStatus("Downloading: " + name + version + ".jar");
}
try {
versionText = readFile(type.getVersionURL() + version);
} catch (IOException e) {
throw new IOException("Error reading: " + type.getVersionURL());
}
newestVersion = stringBetween(versionText, type.getSrcStart(), type.getSrcEnd());
if (!file.isFile()) {
success = downloadFile(
url + newestVersion + type.getDownloadURLPart() + newestVersion + ".jar",
filePath
);
if (!success) {
if (gui != null) {
gui.setStatus("Error downloading: " + name + version + ".jar");
}
throw new FileNotFoundException("Error downloading: " + name + version + ".jar");
}
}
}
}
private static void downloadBungee() throws IOException {
AdvancedServerType type = (AdvancedServerType) ServerType.getByName("Bungee");
String url = Objects.requireNonNull(type).getDownloadURL();
String name = type.getName();
String versionText;
String newestVersion;
Boolean success;
File file = new File(jarDir + type.getName() + ".jar");
Path filePath = Paths.get(jarDir + type.getName() + ".jar");
if (gui != null) {
gui.setStatus("Downloading: " + name + ".jar");
}
try {
versionText = readFile(type.getVersionURL());
} catch (IOException e) {
throw new IOException("Error reading: " + type.getVersionURL());
}
newestVersion = stringBetween(versionText, type.getSrcStart(), type.getSrcEnd());
if (!file.isFile() || !newestVersion.equals(getVersion(name))) {
success = downloadFile(url, filePath);
setVersion(name, newestVersion); setVersion(name, newestVersion);
success = (file.isFile() && newestVersion.equals(getVersion(name))) || downloadFile(url, filePath);
break;
default:
success = true;
}
if (!success) { if (!success) {
if (gui != null) { if (gui != null) {
gui.setStatus("Error downloading: " + name + ".jar"); gui.setStatus("Error downloading: " + name + version + ".jar");
}
throw new FileNotFoundException("Error downloading: " + name + version + ".jar");
} }
throw new FileNotFoundException("Error downloading: " + name + ".jar");
} }
} }
} }

View File

@ -25,7 +25,7 @@ public class Server {
private static final String[] ramList = { private static final String[] ramList = {
"512M", "1G", "2G", "3G", "4G", "5G", "6G", "7G", "8G", "9G", "10G","11G", "12G", "13G", "14G", "15G", "16G" "512M", "1G", "2G", "3G", "4G", "5G", "6G", "7G", "8G", "9G", "10G","11G", "12G", "13G", "14G", "15G", "16G"
}; };
private static final String jarDir = Main.appDir + File.separator + "files" + File.separator + "Jars" + File.separator; private static final String jarDir = Main.getAppDir() + File.separator + "files" + File.separator + "Jars" + File.separator;
private final String name; private final String name;
private String path; private String path;
@ -293,9 +293,9 @@ public class Server {
ProcessBuilder builder; ProcessBuilder builder;
String serverPath; String serverPath;
if (Profile.getCurrent().getDownloadJars() && !type.getName().equals("Custom")) { if (Profile.getCurrent().getDownloadJars() && !type.getName().equals("Custom")) {
serverPath = "\"" + jarDir + this.getType() + "\""; serverPath = jarDir + this.getType();
} else { } else {
serverPath = "\"" + this.path + File.separator + this.getType() + "\""; serverPath = this.path + File.separator + this.getType();
} }
builder = new ProcessBuilder( builder = new ProcessBuilder(
"java", "java",
@ -351,12 +351,7 @@ public class Server {
AdvancedServerType type; AdvancedServerType type;
File file = new File(this.path + File.separator + this.getType()); File file = new File(this.path + File.separator + this.getType());
Path filePath = Paths.get(this.path + File.separator + this.getType()); Path filePath = Paths.get(this.path + File.separator + this.getType());
String versionText; String versionText, newestVersion, url = this.type.getDownloadURL(), name = this.type.getName(), ver = this.serverVersion;
String newestVersion;
String url = this.type.getDownloadURL();
String name = this.type.getName();
String ver = this.serverVersion;
boolean success;
switch (this.type.getName()) { switch (this.type.getName()) {
case "Custom": case "Custom":
if (!file.isFile()) { if (!file.isFile()) {
@ -366,12 +361,9 @@ public class Server {
case "Spigot": case "Spigot":
case "Craftbukkit": case "Craftbukkit":
case "MCPCplus": case "MCPCplus":
if (!file.isFile()) { if (!(file.isFile() || downloadFile(url + name + ver + ".jar", filePath))) {
success = downloadFile(url + name + ver + ".jar", filePath);
if (!success) {
throw new FileNotFoundException("Jar file could not be downloaded."); throw new FileNotFoundException("Jar file could not be downloaded.");
} }
}
break; break;
case "Vanilla": case "Vanilla":
case "Snapshot": case "Snapshot":
@ -384,23 +376,16 @@ public class Server {
} }
newestVersion = stringBetween(versionText, type.getSrcStart(), type.getSrcEnd()); newestVersion = stringBetween(versionText, type.getSrcStart(), type.getSrcEnd());
if (!file.isFile() || !newestVersion.equals(this.getVersion(name))) { if (!file.isFile() || !newestVersion.equals(this.getVersion(name))) {
success = downloadFile(
url + newestVersion + type.getDownloadURLPart() + newestVersion + ".jar",
filePath
);
this.setVersion(name, newestVersion); this.setVersion(name, newestVersion);
if (!success) { if (!downloadFile(url + newestVersion + type.getDownloadURLPart() + newestVersion + ".jar", filePath)) {
throw new FileNotFoundException("Jar file could not be downloaded."); throw new FileNotFoundException("Jar file could not be downloaded.");
} }
} }
} else { } else {
if (!file.isFile()) { if (!(file.isFile() || downloadFile(url + ver + type.getDownloadURLPart() + ver + ".jar", filePath))) {
success = downloadFile(url + ver + type.getDownloadURLPart() + ver + ".jar", filePath);
if (!success) {
throw new FileNotFoundException("Jar file could not be downloaded."); throw new FileNotFoundException("Jar file could not be downloaded.");
} }
} }
}
break; break;
case "SpongeVanilla": case "SpongeVanilla":
type = (AdvancedServerType) this.type; type = (AdvancedServerType) this.type;
@ -411,12 +396,8 @@ public class Server {
} }
newestVersion = stringBetween(versionText, type.getSrcStart(), type.getSrcEnd()); newestVersion = stringBetween(versionText, type.getSrcStart(), type.getSrcEnd());
if (!file.isFile() || !newestVersion.equals(this.getVersion(name))) { if (!file.isFile() || !newestVersion.equals(this.getVersion(name))) {
success = downloadFile(
url + newestVersion + type.getDownloadURLPart() + newestVersion + ".jar",
filePath
);
this.setVersion(name, newestVersion); this.setVersion(name, newestVersion);
if (!success) { if (!downloadFile(url + newestVersion + type.getDownloadURLPart() + newestVersion + ".jar", filePath)) {
throw new FileNotFoundException("Jar file could not be downloaded."); throw new FileNotFoundException("Jar file could not be downloaded.");
} }
} }
@ -430,9 +411,8 @@ public class Server {
} }
newestVersion = stringBetween(versionText, type.getSrcStart(), type.getSrcEnd()); newestVersion = stringBetween(versionText, type.getSrcStart(), type.getSrcEnd());
if (!file.isFile() || !newestVersion.equals(this.getVersion(name))) { if (!file.isFile() || !newestVersion.equals(this.getVersion(name))) {
success = downloadFile(url, filePath);
this.setVersion(name, newestVersion); this.setVersion(name, newestVersion);
if (!success) { if (!downloadFile(url, filePath)) {
throw new FileNotFoundException("Jar file could not be downloaded."); throw new FileNotFoundException("Jar file could not be downloaded.");
} }
} }

View File

@ -42,6 +42,11 @@ public class ServerType {
return serverTypes; return serverTypes;
} }
/**
* Gets a list of all server types' names.
*
* @return A list of strings
*/
public static String[] getTypeNames() { public static String[] getTypeNames() {
ArrayList<ServerType> types = ServerType.getServerTypes(); ArrayList<ServerType> types = ServerType.getServerTypes();
String[] serverTypes = new String[types.size()]; String[] serverTypes = new String[types.size()];
@ -51,6 +56,12 @@ public class ServerType {
return serverTypes; return serverTypes;
} }
/**
* Gets a server type by name.
*
* @param name Then name of the server type
* @return A ServerType
*/
public static ServerType getByName(String name) { public static ServerType getByName(String name) {
for (ServerType serverType : serverTypes) { for (ServerType serverType : serverTypes) {
if (serverType.getName().equals(name)) { if (serverType.getName().equals(name)) {

View File

@ -1,5 +1,6 @@
package net.knarcraft.serverlauncher.userinterface; package net.knarcraft.serverlauncher.userinterface;
import net.knarcraft.serverlauncher.Main;
import net.knarcraft.serverlauncher.profile.Collection; import net.knarcraft.serverlauncher.profile.Collection;
import net.knarcraft.serverlauncher.server.Server; import net.knarcraft.serverlauncher.server.Server;
import net.knarcraft.serverlauncher.profile.Profile; import net.knarcraft.serverlauncher.profile.Profile;
@ -93,6 +94,11 @@ public class GUI implements ActionListener {
*/ */
public void setStatus(String text) { public void setStatus(String text) {
this.lblStatuslabel.setText(text); this.lblStatuslabel.setText(text);
try (PrintWriter file = new PrintWriter(new FileWriter(Main.getAppDir() + File.separator + "latestrun.log", true))) {
file.println(text);
} catch (IOException e ) {
e.printStackTrace();
}
} }
/** /**

View File

@ -38,7 +38,7 @@ public class ServerTab implements ActionListener {
this.chckbxEnabled.setSelected(enabled); this.chckbxEnabled.setSelected(enabled);
this.serverTypes.setSelectedItem(typeName); this.serverTypes.setSelectedItem(typeName);
this.serverTypes(); this.serverTypes();
this.serverTypes.setSelectedItem(serverVersion); this.serverVersions.setSelectedItem(serverVersion);
this.maxRam.setSelectedItem(maxRam); this.maxRam.setSelectedItem(maxRam);
} }