diff --git a/.gitignore b/.gitignore
index 092780b..a032d03 100644
--- a/.gitignore
+++ b/.gitignore
@@ -120,3 +120,5 @@ buildNumber.properties
parabotv2
releases
._*
+
+Test.java
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 3c85fb4..7640c2e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -112,7 +112,7 @@
2.4.1
- fat
+ jar-with-dependencies
diff --git a/src/main/java/org/parabot/Landing.java b/src/main/java/org/parabot/Landing.java
index 3f1d249..de1cd97 100644
--- a/src/main/java/org/parabot/Landing.java
+++ b/src/main/java/org/parabot/Landing.java
@@ -11,6 +11,7 @@ import org.parabot.core.network.proxy.ProxyType;
import org.parabot.core.ui.BotUI;
import org.parabot.core.ui.ServerSelector;
import org.parabot.core.ui.utils.UILog;
+import org.parabot.environment.api.utils.JavaUtil;
import javax.swing.*;
import java.awt.*;
@@ -112,14 +113,7 @@ public final class Landing {
Directories.setServerCompiledDirectory(new File(args[++i]));
break;
case "-clearcache":
- File[] cache = Directories.getCachePath().listFiles();
- if (cache != null) {
- for (File f : cache) {
- if (f.exists() && f.canWrite()) {
- f.delete();
- }
- }
- }
+ Directories.clearCache();
break;
case "-mac":
byte[] mac = new byte[6];
diff --git a/src/main/java/org/parabot/core/Configuration.java b/src/main/java/org/parabot/core/Configuration.java
index 5da8099..9003784 100644
--- a/src/main/java/org/parabot/core/Configuration.java
+++ b/src/main/java/org/parabot/core/Configuration.java
@@ -15,6 +15,7 @@ public class Configuration {
public static final String GET_SERVER_PROVIDERS = "http://bdn.parabot.org/api/get.php?action=server_providers";
public static final String GET_SERVER_PROVIDER = "http://bdn.parabot.org/api/get.php?action=server_provider&name=";
public static final String GET_SERVER_PROVIDER_INFO = "http://bdn.parabot.org/api/get.php?action=server_information&name=";
+ public static final String GET_SERVER_SETTINGS = "http://bdn.parabot.org/api/get.php?action=get_settings";
public static final String GET_BOT_VERSION = "http://bdn.parabot.org/api/v2/bot/version";
public static final String API_DOWNLOAD_BOT = "http://bdn.parabot.org/api/v2/bot/download/client/";
public static final String DOWNLOAD_BOT = "http://bdn.parabot.org/versions/";
diff --git a/src/main/java/org/parabot/core/Context.java b/src/main/java/org/parabot/core/Context.java
index ed60582..c895f1d 100644
--- a/src/main/java/org/parabot/core/Context.java
+++ b/src/main/java/org/parabot/core/Context.java
@@ -18,8 +18,9 @@ import org.parabot.environment.scripts.uliratha.UlirathaClient;
import org.parabot.environment.servers.ServerProvider;
import java.applet.Applet;
-import java.awt.Dimension;
+import java.awt.*;
import java.io.File;
+import java.io.PrintStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.TimerTask;
@@ -27,7 +28,7 @@ import java.util.TimerTask;
/**
* Game context
*
- * @author Everel
+ * @author Everel, JKetelaar, Matt
*/
public class Context {
public static final HashMap threadGroups = new HashMap();
@@ -36,7 +37,6 @@ public class Context {
private static Context instance;
private static String username;
- public boolean added;
private ASMClassLoader classLoader;
private ClassPath classPath;
private ServerProvider serverProvider;
@@ -52,6 +52,9 @@ public class Context {
private UlirathaClient ulirathaClient;
private JSONParser jsonParser;
+ private PrintStream defaultOut;
+ private PrintStream defaultErr = System.err;
+
private Context(final ServerProvider serverProvider) {
threadGroups.put(Thread.currentThread().getThreadGroup(), this);
@@ -63,7 +66,9 @@ public class Context {
this.randomHandler = new RandomHandler();
this.jsonParser = new JSONParser();
-
+
+ this.defaultOut = System.out;
+ this.defaultErr = System.err;
}
public static Context getInstance(ServerProvider serverProvider) {
@@ -174,7 +179,7 @@ public class Context {
Applet applet = serverProvider.fetchApplet();
// if applet is null the server provider will call setApplet itself
if(applet != null) {
- setApplet(applet);
+ setApplet(applet);
}
}
@@ -188,7 +193,7 @@ public class Context {
if (getClient() == null) {
setClientInstance(gameApplet);
}
-
+
Core.verbose("Applet fetched.");
final GamePanel panel = GamePanel.getInstance();
@@ -206,6 +211,7 @@ public class Context {
gameApplet.init();
gameApplet.start();
+
java.util.Timer t = new java.util.Timer();
t.schedule(new TimerTask() {
@Override
@@ -222,6 +228,8 @@ public class Context {
Core.verbose("Done.");
BotDialog.getInstance().validate();
+ System.setOut(this.defaultOut);
+ System.setErr(this.defaultErr);
}
/**
diff --git a/src/main/java/org/parabot/core/Core.java b/src/main/java/org/parabot/core/Core.java
index e1e976d..5bf73a8 100644
--- a/src/main/java/org/parabot/core/Core.java
+++ b/src/main/java/org/parabot/core/Core.java
@@ -1,6 +1,8 @@
package org.parabot.core;
+import com.bugsnag.BeforeNotify;
import com.bugsnag.Client;
+import com.bugsnag.Error;
import org.json.simple.JSONObject;
import org.json.simple.parser.ParseException;
import org.parabot.Landing;
@@ -301,11 +303,21 @@ public class Core {
}
public static void setBugsnagVersion(){
- Core.bugsnagInstance.setReleaseStage(currentVersion.compareTo(latestVersion) >= 0 ? "development" : "production");
+ Core.bugsnagInstance.setReleaseStage(currentVersion != latestVersion ? "development" : "production");
}
public static void setBugsnagUser(String id, String email, String username){
- Core.bugsnagInstance.setUser(id, email, username);
+ // TODO Check order of parameters
+ Core.bugsnagInstance.setUser(username, email, id);
+ }
+
+ public static void setBugsnagServer(String server){
+ Core.setBugsnagInformation("Server", "Server", server);
+ }
+
+ public static void setBugsnagInformation(String tab, String key, String value){
+ // TODO Should be checked if correct
+ Core.bugsnagInstance.addToTab(tab, key, value);
}
public static void debug(int i) {
diff --git a/src/main/java/org/parabot/core/Directories.java b/src/main/java/org/parabot/core/Directories.java
index 502b588..8b04584 100644
--- a/src/main/java/org/parabot/core/Directories.java
+++ b/src/main/java/org/parabot/core/Directories.java
@@ -7,16 +7,14 @@ import org.parabot.environment.api.utils.StringUtils;
import org.parabot.environment.api.utils.WebUtil;
import javax.swing.*;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
+import java.io.*;
import java.util.*;
/**
- * Holds parabot's used directories
+ * Holds and manages Parabot's used directories
*
* @author Everel
+ * @author JKetelaar
* @author Matt
*/
public class Directories {
@@ -45,34 +43,48 @@ public class Directories {
Core.verbose("Directories cached.");
clearCache(259200);
- setHomeDirectory();
+ if (Core.isSecure()) {
+ setHomeDirectory();
+ }
}
private static void setHomeDirectory(){
File cache;
tempDir = StringUtils.randomString(12);
try {
- if ((cache = new File(Directories.getCachePath(), "cache.json")).exists()){
+ if ((cache = new File(Directories.getSettingsPath(), "cache.json")).exists()){
JSONObject object = (JSONObject) WebUtil.getJsonParser().parse(new FileReader(cache));
String temp;
if ((temp = (String) object.get("homedir")) != null){
cached.put("Home", new File(cached.get("Root"), "/" + temp + "/"));
}
}else{
- cache.createNewFile();
- JSONObject object = new JSONObject();
- object.put("homedir", tempDir);
- FileWriter file = new FileWriter(cache);
- file.write(object.toJSONString());
- file.flush();
- file.close();
- cached.put("Home", new File(cached.get("Root"), "/" + tempDir + "/"));
+ cached.put("Home", createCacheDirectory(cache));
}
} catch (IOException | ParseException ignored) {
cached.put("Home", new File(cached.get("Root"), "/" + tempDir + "/"));
}
- System.out.println("Setting server cache directory to: " + cached.get("Home"));
- cached.get("Home").mkdirs();
+ if (!cached.get("Home").exists()) {
+ cached.get("Home").mkdirs();
+ }
+ System.out.println("Set temporary cache directory to: " + cached.get("Home"));
+ }
+
+ private static File createCacheDirectory(File cacheFile) throws IOException {
+ cacheFile.createNewFile();
+ JSONObject object = new JSONObject();
+ object.put("homedir", tempDir);
+ FileWriter file = new FileWriter(cacheFile);
+ file.write(object.toJSONString());
+ file.flush();
+ file.close();
+
+ File cacheDir = new File(cached.get("Root"), "/" + tempDir + "/");
+ if (!cacheDir.exists()) {
+ cacheDir.mkdirs();
+ }
+
+ return cacheDir;
}
/**
@@ -219,8 +231,9 @@ public class Directories {
* Clears the cache based on the latest modification
*
* @param remove A long that represents the amount of seconds that a file may have since the latest modification
+ * @param force Defines if the cache folder, within user.home, should also be removed
*/
- private static void clearCache(int remove) {
+ public static void clearCache(int remove, boolean force){
File[] cache = getCachePath().listFiles();
if (cache != null) {
for (File f : cache) {
@@ -230,15 +243,84 @@ public class Directories {
}
}
}
- }
- public static void clearCache() {
- File[] cache = getCachePath().listFiles();
- if (cache != null) {
- for (File f : cache) {
- Core.verbose("Clearing " + f.getName() + " from cache...");
- f.delete();
+ if (force){
+ File cacheFile;
+
+ if ((cacheFile = new File(Directories.getSettingsPath(), "cache.json")).exists()){
+ try {
+ JSONObject jsonObject = (JSONObject) WebUtil.getJsonParser().parse(new FileReader(cacheFile));
+ if (jsonObject != null){
+ Object dirObject;
+ if ((dirObject = jsonObject.get("homedir")) != null) {
+ String dir = (String) dirObject;
+ if (dir.length() > 0) {
+ File cacheDir = new File(cached.get("Root"), "/" + dir + "/");
+ removeDirectory(cacheDir);
+ createCacheDirectory(cacheFile);
+ }
+ }
+ }
+
+ } catch (IOException | ParseException e) {
+ e.printStackTrace();
+ }
}
}
}
+
+ private static void clearCache(int remove) {
+ clearCache(remove, false);
+ }
+
+ public static void clearCache() {
+ clearCache(0, true);
+ }
+
+ /**
+ * @param file Directory to be removed
+ */
+ private static void removeDirectory(File file) {
+ if (file.isDirectory()) {
+ if (file.list().length == 0) {
+ file.delete();
+ Core.verbose("Directory is deleted : "
+ + file.getAbsolutePath());
+ } else {
+ String files[] = file.list();
+ for (String temp : files) {
+ File fileDelete = new File(file, temp);
+ removeDirectory(fileDelete);
+ }
+
+ if (file.list().length == 0) {
+ file.delete();
+ Core.verbose("Directory is deleted : "
+ + file.getAbsolutePath());
+ }
+ }
+ } else {
+ file.delete();
+ Core.verbose("File is deleted : " + file.getAbsolutePath());
+ }
+ }
+
+ /**
+ * Returns an array of files with from a given directory and a given extension
+ *
+ * @param directory The directory where should be searched
+ * @param extension The extension to be searched for, including the dot (like .json)
+ * @return An array of of files that match the request
+ */
+ public static File[] listFilesWithExtension(File directory, final String extension){
+ return directory.listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String filename) {
+ return filename.endsWith(extension);
+ }
+ });
+ }
+
+ public static File[] listJSONFiles(File directory) {
+ return listFilesWithExtension(directory, ".json");
+ }
}
diff --git a/src/main/java/org/parabot/core/asm/RedirectClassAdapter.java b/src/main/java/org/parabot/core/asm/RedirectClassAdapter.java
index 9cf9999..3421a50 100644
--- a/src/main/java/org/parabot/core/asm/RedirectClassAdapter.java
+++ b/src/main/java/org/parabot/core/asm/RedirectClassAdapter.java
@@ -20,7 +20,7 @@ public class RedirectClassAdapter extends ClassVisitor implements Opcodes {
private String className;
- private static PrintStream str_out, class_out;
+ private static PrintStream str_out, class_out, dec_out;
static {
redirects.put("java/awt/Toolkit", ToolkitRedirect.class);
@@ -40,6 +40,7 @@ public class RedirectClassAdapter extends ClassVisitor implements Opcodes {
if (str_out == null && Core.shouldDump())
try {
str_out = new PrintStream(new FileOutputStream(new File(Directories.getWorkspace(),"strings.txt")));
+ dec_out = new PrintStream(new FileOutputStream(new File(Directories.getWorkspace(),"decrypted_strings.txt")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -89,8 +90,13 @@ public class RedirectClassAdapter extends ClassVisitor implements Opcodes {
@Override
public void visitLdcInsn(Object o) {
- if (o instanceof String && str_out != null)
+ if (o instanceof String && str_out != null) {
str_out.println(className + " " + o);
+ if (!className.toLowerCase().contains("parabot")) {
+ dec_out.println(o + ":");
+ dec_out.println();
+ }
+ }
super.visitLdcInsn(o);
}
diff --git a/src/main/java/org/parabot/core/asm/adapters/AddGetterAdapter.java b/src/main/java/org/parabot/core/asm/adapters/AddGetterAdapter.java
index e068c0b..7ee094a 100644
--- a/src/main/java/org/parabot/core/asm/adapters/AddGetterAdapter.java
+++ b/src/main/java/org/parabot/core/asm/adapters/AddGetterAdapter.java
@@ -48,7 +48,6 @@ public class AddGetterAdapter implements Opcodes, Injectable {
final ClassNode fieldLocation, final FieldNode fieldNode,
final String methodName, final String returnDesc,
final boolean staticMethod, final long multiplier) {
- System.out.println(fieldNode.name);
this.into = into;
this.fieldLocation = fieldLocation;
this.fieldNode = fieldNode;
diff --git a/src/main/java/org/parabot/core/asm/redirect/URLRedirect.java b/src/main/java/org/parabot/core/asm/redirect/URLRedirect.java
new file mode 100644
index 0000000..c4de84f
--- /dev/null
+++ b/src/main/java/org/parabot/core/asm/redirect/URLRedirect.java
@@ -0,0 +1,8 @@
+package org.parabot.core.asm.redirect;
+
+/**
+ * @author JKetelaar
+ */
+public class URLRedirect{
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/parabot/core/desc/ServerProviderInfo.java b/src/main/java/org/parabot/core/desc/ServerProviderInfo.java
index 922d3c5..ba20206 100644
--- a/src/main/java/org/parabot/core/desc/ServerProviderInfo.java
+++ b/src/main/java/org/parabot/core/desc/ServerProviderInfo.java
@@ -2,17 +2,21 @@ package org.parabot.core.desc;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+import org.parabot.core.Configuration;
import org.parabot.core.Core;
import org.parabot.core.ui.utils.UILog;
import org.parabot.environment.api.utils.WebUtil;
import javax.swing.*;
import java.io.BufferedReader;
+import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
+import java.util.zip.CRC32;
/**
* Gets the information for the selected server provider
@@ -29,40 +33,63 @@ public class ServerProviderInfo {
this.properties = new Properties();
this.settings = new HashMap<>();
try {
- String line;
Core.verbose("Reading info: " + providerInfo);
BufferedReader br = WebUtil.getReader(new URL(providerInfo.toString()), username, password);
- //TODO Make this one line (web sided)
- JSONParser parser = new JSONParser();
- if ((line = br.readLine()) != null) {
- JSONObject jsonObject = (JSONObject) parser.parse(line);
- for (Object o : jsonObject.entrySet()) {
- Map.Entry, ?> pairs = (Map.Entry, ?>) o;
- if (String.valueOf(pairs.getKey()).equalsIgnoreCase("settings")){
- JSONObject object = (JSONObject) pairs.getValue();
- for (Object settingObject : object.entrySet()){
- Map.Entry, ?> settingValue = (Map.Entry, ?>) settingObject;
- String key = (String) settingValue.getKey();
- long value = (Long) settingValue.getValue();
- settings.put(key, (int) value);
- }
- }else {
- properties.put(String.valueOf(pairs.getKey()), String.valueOf(pairs.getValue()));
- }
- }
- } else {
- UILog.log(
- "Error",
- "Failed to load server provider, error: [No information about the provider found.]",
- JOptionPane.ERROR_MESSAGE);
- return;
- }
- br.close();
- } catch (Exception e) {
+ JSONObject jsonObject = (JSONObject) WebUtil.getJsonParser().parse(br);
+ for (Object o : jsonObject.entrySet()) {
+ Map.Entry, ?> pairs = (Map.Entry, ?>) o;
+ if (String.valueOf(pairs.getKey()).equalsIgnoreCase("settings")){
+ JSONObject object = (JSONObject) pairs.getValue();
+ parseSettings(object);
+ }else {
+ properties.put(String.valueOf(pairs.getKey()), String.valueOf(pairs.getValue()));
+ }
+ }
+ if (br != null) {
+ br.close();
+ }
+ } catch (Exception e) {
e.printStackTrace();
}
}
+
+ public ServerProviderInfo(String clientJar, String hooks, String name, String clientClass, int bankTabs){
+ this.properties = new Properties();
+ this.settings = new HashMap<>();
+
+ try {
+ BufferedReader br = WebUtil.getReader(new URL(Configuration.GET_SERVER_SETTINGS));
+ JSONObject settings = (JSONObject) WebUtil.getJsonParser().parse(br);
+ parseSettings(settings);
+ } catch (ParseException | IOException e) {
+ e.printStackTrace();
+ }
+
+ this.properties.setProperty("client_jar", clientJar);
+ this.properties.setProperty("hooks", hooks);
+ this.properties.setProperty("name", name);
+ this.properties.setProperty("client_class", clientClass);
+ this.properties.setProperty("provider_crc32", String.valueOf(getCRC32(name, "provider")));
+ this.properties.setProperty("client_crc32", String.valueOf(getCRC32(name, "client")));
+ this.properties.setProperty("bank_tabs", String.valueOf(bankTabs));
+ }
+
+ private long getCRC32(String name, String type){
+ CRC32 crc = new CRC32();
+ name += "-" + type;
+ crc.update(name.getBytes());
+ return crc.getValue();
+ }
+
+ private void parseSettings(JSONObject object){
+ for (Object settingObject : object.entrySet()){
+ Map.Entry, ?> settingValue = (Map.Entry, ?>) settingObject;
+ String key = (String) settingValue.getKey();
+ long value = (Long) settingValue.getValue();
+ settings.put(key, (int) value);
+ }
+ }
public URL getClient() {
try {
@@ -100,7 +127,7 @@ public class ServerProviderInfo {
}
public long getCRC32() {
- return Long.parseLong(properties.getProperty("provider_crc32"));
+ return Long.parseLong(properties.getProperty("provider_crc32"));
}
public long getClientCRC32() {
diff --git a/src/main/java/org/parabot/core/lib/Library.java b/src/main/java/org/parabot/core/lib/Library.java
index 73e4073..9ac49e5 100644
--- a/src/main/java/org/parabot/core/lib/Library.java
+++ b/src/main/java/org/parabot/core/lib/Library.java
@@ -41,6 +41,12 @@ public abstract class Library {
* @return url
*/
public abstract URL getDownloadLink();
+
+ /**
+ * Defines if the system requires a jar
+ * @return boolean
+ */
+ public abstract boolean requiresJar();
/**
diff --git a/src/main/java/org/parabot/core/lib/javafx/JavaFX.java b/src/main/java/org/parabot/core/lib/javafx/JavaFX.java
index 4f62259..5684e45 100644
--- a/src/main/java/org/parabot/core/lib/javafx/JavaFX.java
+++ b/src/main/java/org/parabot/core/lib/javafx/JavaFX.java
@@ -7,6 +7,7 @@ import org.parabot.core.Core;
import org.parabot.core.Directories;
import org.parabot.core.build.BuildPath;
import org.parabot.core.lib.Library;
+import org.parabot.environment.api.utils.JavaUtil;
/**
*
@@ -59,6 +60,11 @@ public class JavaFX extends Library {
return null;
}
+ @Override
+ public boolean requiresJar() {
+ return JavaUtil.JAVA_VERSION <= 1.7;
+ }
+
@Override
public String getLibraryName() {
return "JavaFX";
@@ -67,5 +73,4 @@ public class JavaFX extends Library {
public static boolean isValid() {
return valid;
}
-
}
diff --git a/src/main/java/org/parabot/core/lib/naga/Naga.java b/src/main/java/org/parabot/core/lib/naga/Naga.java
index e1645d4..9154e7e 100644
--- a/src/main/java/org/parabot/core/lib/naga/Naga.java
+++ b/src/main/java/org/parabot/core/lib/naga/Naga.java
@@ -56,6 +56,11 @@ public class Naga extends Library {
return null;
}
+ @Override
+ public boolean requiresJar() {
+ return true;
+ }
+
@Override
public String getLibraryName() {
return "Naga";
diff --git a/src/main/java/org/parabot/core/parsers/servers/LocalServers.java b/src/main/java/org/parabot/core/parsers/servers/LocalServers.java
index fb82095..a1dc8a6 100644
--- a/src/main/java/org/parabot/core/parsers/servers/LocalServers.java
+++ b/src/main/java/org/parabot/core/parsers/servers/LocalServers.java
@@ -1,19 +1,41 @@
package org.parabot.core.parsers.servers;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FilenameFilter;
+import java.io.IOException;
import java.lang.reflect.Constructor;
+import java.net.URL;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Objects;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.ParseException;
+import org.parabot.core.Configuration;
+import org.parabot.core.Context;
+import org.parabot.core.Core;
import org.parabot.core.Directories;
+import org.parabot.core.build.BuildPath;
import org.parabot.core.classpath.ClassPath;
import org.parabot.core.desc.ServerDescription;
+import org.parabot.core.desc.ServerProviderInfo;
+import org.parabot.core.ui.components.VerboseLoader;
+import org.parabot.core.ui.utils.UILog;
+import org.parabot.environment.api.utils.WebUtil;
import org.parabot.environment.servers.ServerManifest;
+import org.parabot.environment.servers.ServerProvider;
+import org.parabot.environment.servers.executers.LocalPublicServerExecuter;
import org.parabot.environment.servers.executers.LocalServerExecuter;
+import org.parabot.environment.servers.executers.PublicServerExecuter;
import org.parabot.environment.servers.loader.ServerLoader;
+import javax.swing.*;
+
/**
* Parses local server providers located in the servers directory
*
- * @author Everel
+ * @author Everel, JKetelaar
*/
public class LocalServers extends ServerParser {
@@ -24,7 +46,7 @@ public class LocalServers extends ServerParser {
basePath.parseJarFiles(false);
basePath.addClasses(Directories.getServerPath());
- final ArrayList classPaths = new ArrayList();
+ final ArrayList classPaths = new ArrayList<>();
classPaths.add(basePath);
for (final ClassPath classPath : basePath.getJarFiles()) {
classPaths.add(classPath);
@@ -64,6 +86,34 @@ public class LocalServers extends ServerParser {
}
}
+ for (File file : Directories.listJSONFiles(Directories.getServerPath())){
+ try {
+ JSONObject object = (JSONObject) WebUtil.getJsonParser().parse(new FileReader(file));
+ String name = (String) object.get("name");
+ String author = (String) object.get("author");
+ double version = (Double) object.get("version");
+ String clientClass = (String) object.get("client-class");
+ Object bank;
+ int bankTabs = 0;
+ if ((bank = object.get("bank")) != null){
+ bankTabs = (int) bank;
+ }
+
+ JSONObject locations = (JSONObject) object.get("locations");
+ String server = (String) locations.get("server");
+ String provider = (String) locations.get("provider");
+ String hooks = (String) locations.get("hooks");
+
+ ServerProviderInfo serverProviderInfo = new ServerProviderInfo(server, hooks, name, clientClass, bankTabs);
+
+ System.out.println(server);
+ ServerDescription desc = new ServerDescription(name,
+ author, version);
+ SERVER_CACHE.put(desc, new LocalPublicServerExecuter(name, serverProviderInfo, server, provider));
+ } catch (IOException | ParseException e) {
+ e.printStackTrace();
+ }
+ }
}
}
diff --git a/src/main/java/org/parabot/environment/Environment.java b/src/main/java/org/parabot/environment/Environment.java
index adef982..c8c8759 100644
--- a/src/main/java/org/parabot/environment/Environment.java
+++ b/src/main/java/org/parabot/environment/Environment.java
@@ -33,7 +33,7 @@ public class Environment {
libs.add(new Naga());
for(Library lib : libs) {
- if(!lib.hasJar()) {
+ if(!lib.hasJar() && lib.requiresJar()) {
Core.verbose("Downloading " + lib.getLibraryName() + "...");
VerboseLoader.setState("Downloading " + lib.getLibraryName() + "...");
WebUtil.downloadFile(lib.getDownloadLink(), lib.getJarFile(), VerboseLoader.get());
@@ -43,8 +43,7 @@ public class Environment {
lib.init();
}
-
- Core.verbose("Loading server: " + desc.toString());
+ Core.verbose("Loading server: " + desc.toString() + "...");
ServerParser.SERVER_CACHE.get(desc).run();
diff --git a/src/main/java/org/parabot/environment/api/utils/FileUtil.java b/src/main/java/org/parabot/environment/api/utils/FileUtil.java
index 6d0b914..ba7ea9c 100644
--- a/src/main/java/org/parabot/environment/api/utils/FileUtil.java
+++ b/src/main/java/org/parabot/environment/api/utils/FileUtil.java
@@ -2,7 +2,9 @@ package org.parabot.environment.api.utils;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -65,4 +67,25 @@ public class FileUtil {
return null;
}
+
+ public static void copyFile(File sourceFile, File destFile)
+ throws IOException {
+ if (!sourceFile.exists()) {
+ return;
+ }
+ if (!destFile.exists()) {
+ destFile.createNewFile();
+ }
+ FileChannel source = null;
+ FileChannel destination = null;
+ source = new FileInputStream(sourceFile).getChannel();
+ destination = new FileOutputStream(destFile).getChannel();
+ if (source != null) {
+ destination.transferFrom(source, 0, source.size());
+ }
+ if (source != null) {
+ source.close();
+ }
+ destination.close();
+ }
}
diff --git a/src/main/java/org/parabot/environment/api/utils/JavaUtil.java b/src/main/java/org/parabot/environment/api/utils/JavaUtil.java
new file mode 100644
index 0000000..ad6952b
--- /dev/null
+++ b/src/main/java/org/parabot/environment/api/utils/JavaUtil.java
@@ -0,0 +1,15 @@
+package org.parabot.environment.api.utils;
+
+/**
+ * @author JKetelaar
+ */
+public class JavaUtil {
+ public static double JAVA_VERSION = getVersion();
+
+ static double getVersion () {
+ String version = System.getProperty("java.version");
+ int pos = version.indexOf('.');
+ pos = version.indexOf('.', pos+1);
+ return Double.parseDouble (version.substring (0, pos));
+ }
+}
diff --git a/src/main/java/org/parabot/environment/scripts/Script.java b/src/main/java/org/parabot/environment/scripts/Script.java
index 971d296..732e5c0 100644
--- a/src/main/java/org/parabot/environment/scripts/Script.java
+++ b/src/main/java/org/parabot/environment/scripts/Script.java
@@ -156,6 +156,7 @@ public class Script implements Runnable {
if(state < 0 || state > 2) {
throw new IllegalArgumentException("Illegal state");
}
+ Core.setBugsnagInformation("Script", "State", String.valueOf(state));
this.state = state;
}
@@ -180,5 +181,6 @@ public class Script implements Runnable {
public void setScriptID(int scriptID){
this.scriptID = scriptID;
+ Core.setBugsnagInformation("Script", "State", String.valueOf(scriptID));
}
}
diff --git a/src/main/java/org/parabot/environment/servers/LocalServerExecuter.java b/src/main/java/org/parabot/environment/servers/LocalServerExecuter.java
index 61a9f4c..257a9c8 100644
--- a/src/main/java/org/parabot/environment/servers/LocalServerExecuter.java
+++ b/src/main/java/org/parabot/environment/servers/LocalServerExecuter.java
@@ -15,6 +15,8 @@ import java.net.MalformedURLException;
* @author Everel
*
*/
+@SuppressWarnings("Duplicates")
+@Deprecated
public class LocalServerExecuter extends ServerExecuter {
private final ServerProvider serverProvider;
private ClassPath classPath;
diff --git a/src/main/java/org/parabot/environment/servers/executers/LocalPublicServerExecuter.java b/src/main/java/org/parabot/environment/servers/executers/LocalPublicServerExecuter.java
new file mode 100644
index 0000000..912745c
--- /dev/null
+++ b/src/main/java/org/parabot/environment/servers/executers/LocalPublicServerExecuter.java
@@ -0,0 +1,134 @@
+package org.parabot.environment.servers.executers;
+
+import org.parabot.core.Configuration;
+import org.parabot.core.Context;
+import org.parabot.core.Core;
+import org.parabot.core.Directories;
+import org.parabot.core.build.BuildPath;
+import org.parabot.core.classpath.ClassPath;
+import org.parabot.core.desc.ServerProviderInfo;
+import org.parabot.core.forum.AccountManager;
+import org.parabot.core.forum.AccountManagerAccess;
+import org.parabot.core.ui.components.VerboseLoader;
+import org.parabot.core.ui.utils.UILog;
+import org.parabot.environment.api.utils.FileUtil;
+import org.parabot.environment.api.utils.WebUtil;
+import org.parabot.environment.servers.ServerProvider;
+import org.parabot.environment.servers.loader.ServerLoader;
+
+import javax.swing.*;
+import java.io.File;
+import java.lang.reflect.Constructor;
+import java.net.URL;
+
+/**
+ *
+ * Fetches a server provider from the local config file
+ *
+ * @author JKetelaar
+ *
+ */
+public class LocalPublicServerExecuter extends ServerExecuter {
+ private String serverName;
+ private String serverUrl;
+ private String providerUrl;
+ private ServerProviderInfo serverProviderInfo;
+
+ public LocalPublicServerExecuter(final String serverName, final ServerProviderInfo serverProviderInfo, String serverUrl, String providerUrl) {
+ this.serverName = serverName;
+ this.serverUrl = serverUrl;
+ this.providerUrl = providerUrl;
+ this.serverProviderInfo = serverProviderInfo;
+ }
+
+ @Override
+ public void run() {
+ try {
+ final File destination = new File(Directories.getCachePath(),
+ serverProviderInfo.getCRC32() + ".jar");
+
+ Core.verbose("Downloading: " + providerUrl + " ...");
+
+ if(destination.exists()) {
+ Core.verbose("Found cached server provider [CRC32: " + serverProviderInfo.getCRC32() + "]");
+ } else {
+ File local;
+ if ((local = new File(providerUrl)).exists()){
+ FileUtil.copyFile(local, destination);
+ Core.verbose("Server provider copied...");
+ }else {
+ WebUtil.downloadFile(new URL(providerUrl), destination, VerboseLoader.get());
+ Core.verbose("Server provider downloaded...");
+ }
+ }
+
+ final File clientDestination = new File(Directories.getCachePath(),
+ serverProviderInfo.getClientCRC32() + ".jar");
+
+ Core.verbose("Downloading: " + serverUrl + " ...");
+
+ if(clientDestination.exists()) {
+ Core.verbose("Found cached client [CRC32: " + serverProviderInfo.getClientCRC32() + "]");
+ } else {
+ File local;
+ if ((local = new File(serverUrl)).exists()){
+ FileUtil.copyFile(local, clientDestination);
+ Core.verbose("Server client copied...");
+ }else {
+ WebUtil.downloadFile(new URL(serverUrl), clientDestination, VerboseLoader.get());
+ Core.verbose("Server client downloaded...");
+ }
+ }
+
+ final ClassPath classPath = new ClassPath();
+ classPath.addJar(destination);
+
+ BuildPath.add(destination.toURI().toURL());
+
+ ServerLoader serverLoader = new ServerLoader(classPath);
+ final String[] classNames = serverLoader.getServerClassNames();
+ if (classNames.length == 0) {
+ UILog.log(
+ "Error",
+ "Failed to load server provider, error: [No provider found in jar file.]",
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ } else if (classNames.length > 1) {
+ UILog.log(
+ "Error",
+ "Failed to load server provider, error: [Multiple providers found in jar file.]");
+ return;
+ }
+
+ final String className = classNames[0];
+ try {
+ final Class> providerClass = serverLoader
+ .loadClass(className);
+ final Constructor> con = providerClass.getConstructor();
+ final ServerProvider serverProvider = (ServerProvider) con
+ .newInstance();
+ Context.getInstance(serverProvider).setProviderInfo(serverProviderInfo);
+ super.finalize(serverProvider, this.serverName);
+ } catch (NoClassDefFoundError | ClassNotFoundException ignored) {
+ UILog.log(
+ "Error",
+ "Failed to load server provider, error: [This server provider is not compatible with this version of parabot]",
+ JOptionPane.ERROR_MESSAGE);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ UILog.log(
+ "Error",
+ "Failed to load server provider.",
+ JOptionPane.ERROR_MESSAGE);
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ UILog.log(
+ "Error",
+ "Failed to load server provider, post the stacktrace/error on the parabot forums.",
+ JOptionPane.ERROR_MESSAGE);
+ }
+
+ }
+}
diff --git a/src/main/java/org/parabot/environment/servers/executers/PublicServerExecuter.java b/src/main/java/org/parabot/environment/servers/executers/PublicServerExecuter.java
index 21846a7..7e32445 100644
--- a/src/main/java/org/parabot/environment/servers/executers/PublicServerExecuter.java
+++ b/src/main/java/org/parabot/environment/servers/executers/PublicServerExecuter.java
@@ -58,7 +58,6 @@ public class PublicServerExecuter extends ServerExecuter {
+ this.serverName;
Core.verbose("Downloading: " + jarUrl + " ...");
-
if(destination.exists()) {
Core.verbose("Found cached server provider [CRC32: " + serverProviderInfo.getCRC32() + "]");
diff --git a/src/main/java/org/parabot/environment/servers/executers/ServerExecuter.java b/src/main/java/org/parabot/environment/servers/executers/ServerExecuter.java
index f2210d1..f2ac865 100644
--- a/src/main/java/org/parabot/environment/servers/executers/ServerExecuter.java
+++ b/src/main/java/org/parabot/environment/servers/executers/ServerExecuter.java
@@ -1,10 +1,13 @@
package org.parabot.environment.servers.executers;
import org.parabot.core.Context;
+import org.parabot.core.Core;
import org.parabot.core.parsers.randoms.RandomParser;
import org.parabot.core.ui.components.PaintComponent;
import org.parabot.environment.servers.ServerProvider;
+import java.io.PrintStream;
+
/**
*
* Executes a server provider
@@ -21,11 +24,7 @@ public abstract class ServerExecuter {
@Override
public void run() {
try {
- try{
- org.parabot.environment.api.utils.WindowsPreferences.userRoot().remove("Software\\JavaSoft\\Prefs");
- }catch (Exception e){
- // Ikov likes to creates preference keys, doesn't it?
- }
+ Core.setBugsnagServer(serverName);
Context context = Context.getInstance(provider);
context.load();