mirror of
https://github.com/2006-Scape/Parabot.git
synced 2026-07-02 16:49:10 +00:00
Merge pull request #318 from Parabot/development
[RELEASE] Release of V2.8.1
This commit is contained in:
+1
-1
@@ -34,7 +34,7 @@ env:
|
|||||||
- secure: UG+b1tEgc8xv9x4r//2OAIK1RrYv6n209KTTFMMwcnAa7DI8HaP8nljRa5/VhDhuKHdlVrYH/tI90v7UVBs0GDVNwK5V17Io0fMm3FUGZekSthTCqqno5wAGa9r6a6mMLtSaSmIFeIKi0+0d2ZwplRuhj/dtEYjjBBj+kK8g4nE=
|
- secure: UG+b1tEgc8xv9x4r//2OAIK1RrYv6n209KTTFMMwcnAa7DI8HaP8nljRa5/VhDhuKHdlVrYH/tI90v7UVBs0GDVNwK5V17Io0fMm3FUGZekSthTCqqno5wAGa9r6a6mMLtSaSmIFeIKi0+0d2ZwplRuhj/dtEYjjBBj+kK8g4nE=
|
||||||
- secure: St/fecUDInFBCRriYqgp2F8PU9/SooorgxD9Mrs+b0EsC7AbtSsQXvdIv2Lp6xzdQ0VSXPcLIhULPOYrmBKnGQ/NjXTIZXxnroyQxxnI6xyEWIZwiHRY/bKRJDRbQTxD9NL32szKiDSwnw7pu6llF4D64UqQvziq4Gm6VohU75M=
|
- secure: St/fecUDInFBCRriYqgp2F8PU9/SooorgxD9Mrs+b0EsC7AbtSsQXvdIv2Lp6xzdQ0VSXPcLIhULPOYrmBKnGQ/NjXTIZXxnroyQxxnI6xyEWIZwiHRY/bKRJDRbQTxD9NL32szKiDSwnw7pu6llF4D64UqQvziq4Gm6VohU75M=
|
||||||
- secure: bD15GVZWowiknbfLavh8CxSh0GsnF5kT4kZ6ggCuUDGyj0mzqf7dNRnchQIKkCG0WRYyTrFN4pEiygeywWsipEeAVv9Xhx3cuUZmzeQaR5KCWabSwJ8gK6jZd1YhcWmM9vrdPHobZr65MP0y/8mu/Fovgky9dY7KDf4G3SebNrM=
|
- secure: bD15GVZWowiknbfLavh8CxSh0GsnF5kT4kZ6ggCuUDGyj0mzqf7dNRnchQIKkCG0WRYyTrFN4pEiygeywWsipEeAVv9Xhx3cuUZmzeQaR5KCWabSwJ8gK6jZd1YhcWmM9vrdPHobZr65MP0y/8mu/Fovgky9dY7KDf4G3SebNrM=
|
||||||
- PARABOT_VERSION=2.8
|
- PARABOT_VERSION=2.8.1
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
# Parabot
|
# Parabot
|
||||||
|
|
||||||
Parabot V2.8
|
Parabot V2.8.1
|
||||||
|
|
||||||
#### Links
|
#### Links
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ Then you'll need to add the dependency:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.parabot</groupId>
|
<groupId>org.parabot</groupId>
|
||||||
<artifactId>client</artifactId>
|
<artifactId>client</artifactId>
|
||||||
<version>2.7</version>
|
<version>2.8.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>org.parabot</groupId>
|
<groupId>org.parabot</groupId>
|
||||||
<artifactId>client</artifactId>
|
<artifactId>client</artifactId>
|
||||||
<version>2.8</version>
|
<version>2.8.1</version>
|
||||||
|
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<name>Parabot client</name>
|
<name>Parabot client</name>
|
||||||
<description>The only perfect open source (Runescape private server) bot!</description>
|
<description>The best open-source (Runescape Private Server) bot</description>
|
||||||
<url>http://www.parabot.org/</url>
|
<url>http://www.parabot.org/</url>
|
||||||
|
|
||||||
<licenses>
|
<licenses>
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<version>4.12</version>
|
<version>4.12</version>
|
||||||
<scope>provided</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.parabot</groupId>
|
<groupId>org.parabot</groupId>
|
||||||
@@ -191,13 +191,13 @@
|
|||||||
<uniqueVersion>false</uniqueVersion>
|
<uniqueVersion>false</uniqueVersion>
|
||||||
<id>parabot-maven</id>
|
<id>parabot-maven</id>
|
||||||
<name>Custom Maven Repository</name>
|
<name>Custom Maven Repository</name>
|
||||||
<url>ftp://maven.parabot.org</url>
|
<url>ftp://maven.parabot.org/public_html</url>
|
||||||
<layout>default</layout>
|
<layout>default</layout>
|
||||||
</repository>
|
</repository>
|
||||||
<site>
|
<site>
|
||||||
<id>parabot-maven</id>
|
<id>parabot-maven</id>
|
||||||
<name>Frontend Parabot Maven</name>
|
<name>Frontend Parabot Maven</name>
|
||||||
<url>ftp://maven.parabot.org/docs/${artifactId}/</url>
|
<url>ftp://maven.parabot.org/public_html/docs/${artifactId}/</url>
|
||||||
</site>
|
</site>
|
||||||
</distributionManagement>
|
</distributionManagement>
|
||||||
|
|
||||||
|
|||||||
@@ -11,32 +11,31 @@ import org.parabot.core.network.proxy.ProxyType;
|
|||||||
import org.parabot.core.ui.BotUI;
|
import org.parabot.core.ui.BotUI;
|
||||||
import org.parabot.core.ui.ServerSelector;
|
import org.parabot.core.ui.ServerSelector;
|
||||||
import org.parabot.core.ui.utils.UILog;
|
import org.parabot.core.ui.utils.UILog;
|
||||||
|
import org.parabot.environment.handlers.exceptions.ExceptionHandler;
|
||||||
|
import org.parabot.environment.handlers.exceptions.FileExceptionHandler;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parabot v2.7
|
|
||||||
*
|
|
||||||
* @author Everel, JKetelaar, Matt, Dane
|
* @author Everel, JKetelaar, Matt, Dane
|
||||||
* @version 2.7
|
* @version 2.8.1
|
||||||
* @see <a href="http://www.parabot.org">Homepage</a>
|
* @see <a href="https://www.parabot.org">Homepage</a>
|
||||||
*/
|
*/
|
||||||
public final class Landing {
|
public final class Landing {
|
||||||
private static String username;
|
private static String username;
|
||||||
private static String password;
|
private static String password;
|
||||||
|
|
||||||
public static void main(String... args) throws IOException {
|
public static void main(String... args) {
|
||||||
|
// Thread.setDefaultUncaughtExceptionHandler(new FileExceptionHandler(ExceptionHandler.ExceptionType.CLIENT));
|
||||||
|
|
||||||
if (Context.getJavaVersion() >= 9) {
|
if (Context.getJavaVersion() >= 9) {
|
||||||
UILog.log("Parabot", "Parabot doesn't support Java 9+ currently. Please downgrade to Java 8 to ensure Parabot is working correctly.");
|
UILog.log("Parabot", "Parabot doesn't support Java 9+ currently. Please downgrade to Java 8 to ensure Parabot is working correctly.");
|
||||||
System.exit(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!System.getProperty("os.arch").contains("64")) {
|
if (!System.getProperty("os.arch").contains("64")) {
|
||||||
UILog.log("Parabot", "You are not running a 64-bit version of Java, this might cause the client to lag or crash unexpectedly.\r\n" +
|
UILog.log("Parabot", "You are not running a 64-bit version of Java, this might cause the client to lag or crash unexpectedly.\r\n" +
|
||||||
"It's recommended to upgrade to a 64-bit version.");
|
"It is recommended to upgrade to a 64-bit version.");
|
||||||
}
|
}
|
||||||
|
|
||||||
parseArgs(args);
|
parseArgs(args);
|
||||||
@@ -80,11 +79,11 @@ public final class Landing {
|
|||||||
switch (arg.toLowerCase()) {
|
switch (arg.toLowerCase()) {
|
||||||
case "-createdirs":
|
case "-createdirs":
|
||||||
Directories.validate();
|
Directories.validate();
|
||||||
System.out
|
System.out.println(TranslationHelper.translate(("DIRECTORIES_CREATED")));
|
||||||
.println(TranslationHelper.translate(("DIRECTORIES_CREATED")));
|
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
break;
|
break;
|
||||||
case "-debug":
|
case "-debug":
|
||||||
|
Core.setDump(true);
|
||||||
case "-offlinemode":
|
case "-offlinemode":
|
||||||
Core.setDebug(true);
|
Core.setDebug(true);
|
||||||
break;
|
break;
|
||||||
@@ -130,14 +129,9 @@ public final class Landing {
|
|||||||
break;
|
break;
|
||||||
case "-proxy":
|
case "-proxy":
|
||||||
ProxyType type = ProxyType.valueOf(args[++i].toUpperCase());
|
ProxyType type = ProxyType.valueOf(args[++i].toUpperCase());
|
||||||
if (type == null) {
|
ProxySocket.setProxy(type, args[++i], Integer.parseInt(args[++i]));
|
||||||
System.err.println(TranslationHelper.translate("INVALID_PROXY_TYPE") + args[i]);
|
|
||||||
System.exit(1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ProxySocket.setProxy(type, args[++i],
|
|
||||||
Integer.parseInt(args[++i]));
|
|
||||||
break;
|
break;
|
||||||
|
case "-proxy_auth":
|
||||||
case "-auth":
|
case "-auth":
|
||||||
ProxySocket.auth = true;
|
ProxySocket.auth = true;
|
||||||
ProxySocket.setLogin(args[++i], args[++i]);
|
ProxySocket.setLogin(args[++i], args[++i]);
|
||||||
@@ -146,6 +140,7 @@ public final class Landing {
|
|||||||
Core.disableSec();
|
Core.disableSec();
|
||||||
break;
|
break;
|
||||||
case "-no_validation":
|
case "-no_validation":
|
||||||
|
case "-ignore_updates":
|
||||||
Core.disableValidation();
|
Core.disableValidation();
|
||||||
break;
|
break;
|
||||||
case "-uuid":
|
case "-uuid":
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class Core {
|
|||||||
private static boolean loadLocal; //Loads both local and public scripts/servers
|
private static boolean loadLocal; //Loads both local and public scripts/servers
|
||||||
|
|
||||||
private static boolean validate = true;
|
private static boolean validate = true;
|
||||||
private static boolean secure = true;
|
private static boolean secure = true;
|
||||||
|
|
||||||
private static Version currentVersion = Configuration.BOT_VERSION;
|
private static Version currentVersion = Configuration.BOT_VERSION;
|
||||||
|
|
||||||
@@ -140,46 +140,13 @@ public class Core {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks the version of the bot using a checksum of the jar comparison against checksum given by the website
|
* Prints a debug line to the Logger and System PrintStream
|
||||||
|
* Meant for the debug adapter within hooks
|
||||||
*
|
*
|
||||||
* @return <b>true</b> if no new version is found, otherwise <b>false</b>.
|
* @param line
|
||||||
*/
|
*/
|
||||||
private static boolean checksumValid() {
|
public static void debug(final String line) {
|
||||||
File f = new File(Landing.class.getProtectionDomain().getCodeSource().getLocation().getFile());
|
System.out.println(line);
|
||||||
if (f.isFile()) {
|
|
||||||
try {
|
|
||||||
MessageDigest md = MessageDigest.getInstance("MD5");
|
|
||||||
File location = new File(Landing.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
|
|
||||||
if (location.exists()) {
|
|
||||||
FileInputStream fis = new FileInputStream(location);
|
|
||||||
byte[] dataBytes = new byte[1024];
|
|
||||||
|
|
||||||
int nread;
|
|
||||||
|
|
||||||
while ((nread = fis.read(dataBytes)) != -1) {
|
|
||||||
md.update(dataBytes, 0, nread);
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[] mdbytes = md.digest();
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder("");
|
|
||||||
for (byte mdbyte : mdbytes) {
|
|
||||||
sb.append(Integer.toString((mdbyte & 0xff) + 0x100, 16).substring(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
String result;
|
|
||||||
if ((result = WebUtil.getContents(String.format(Configuration.COMPARE_CHECKSUM_URL, "client", currentVersion.get()), "checksum=" + URLEncoder.encode(sb.toString(), "UTF-8"))) != null) {
|
|
||||||
JSONObject object = (JSONObject) WebUtil.getJsonParser().parse(result);
|
|
||||||
boolean upToDate = (boolean) object.get("result");
|
|
||||||
Core.verbose("Local checksum: " + URLEncoder.encode(sb.toString(), "UTF-8") + ". " + (upToDate ? "This matches BDN and is up to date." : "BDN mismatch, must be Out Of Date."));
|
|
||||||
return upToDate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (NoSuchAlgorithmException | ParseException | IOException | URISyntaxException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -194,7 +161,7 @@ public class Core {
|
|||||||
try {
|
try {
|
||||||
if (br != null) {
|
if (br != null) {
|
||||||
JSONObject object = (JSONObject) WebUtil.getJsonParser().parse(br);
|
JSONObject object = (JSONObject) WebUtil.getJsonParser().parse(br);
|
||||||
boolean latest = (Boolean) object.get("result");
|
boolean latest = (Boolean) object.get("result");
|
||||||
if (!latest) {
|
if (!latest) {
|
||||||
Directories.clearCache();
|
Directories.clearCache();
|
||||||
}
|
}
|
||||||
@@ -216,14 +183,6 @@ public class Core {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Method that removes the cache contents after 3 days
|
|
||||||
*/
|
|
||||||
private static void validateCache() {
|
|
||||||
// Already handled by Directories initiating
|
|
||||||
// Method will be used once BDN V3 has a functionality for this
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void downloadNewVersion() {
|
public static void downloadNewVersion() {
|
||||||
UILog.log(TranslationHelper.translate("UPDATES"),
|
UILog.log(TranslationHelper.translate("UPDATES"),
|
||||||
TranslationHelper.translate("DOWNLOAD_UPDATE_PARABOT_AT")
|
TranslationHelper.translate("DOWNLOAD_UPDATE_PARABOT_AT")
|
||||||
@@ -268,4 +227,55 @@ public class Core {
|
|||||||
public static int newVersionAlert() {
|
public static int newVersionAlert() {
|
||||||
return UILog.alert("Parabot Update", "There's a new version of Parabot! \nDo you wish to download it?\n\nThe current version could have some problems!", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
|
return UILog.alert("Parabot Update", "There's a new version of Parabot! \nDo you wish to download it?\n\nThe current version could have some problems!", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks the version of the bot using a checksum of the jar comparison against checksum given by the website
|
||||||
|
*
|
||||||
|
* @return <b>true</b> if no new version is found, otherwise <b>false</b>.
|
||||||
|
*/
|
||||||
|
private static boolean checksumValid() {
|
||||||
|
File f = new File(Landing.class.getProtectionDomain().getCodeSource().getLocation().getFile());
|
||||||
|
if (f.isFile()) {
|
||||||
|
try {
|
||||||
|
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||||
|
File location = new File(Landing.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
|
||||||
|
if (location.exists()) {
|
||||||
|
FileInputStream fis = new FileInputStream(location);
|
||||||
|
byte[] dataBytes = new byte[1024];
|
||||||
|
|
||||||
|
int nread;
|
||||||
|
|
||||||
|
while ((nread = fis.read(dataBytes)) != -1) {
|
||||||
|
md.update(dataBytes, 0, nread);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] mdbytes = md.digest();
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder("");
|
||||||
|
for (byte mdbyte : mdbytes) {
|
||||||
|
sb.append(Integer.toString((mdbyte & 0xff) + 0x100, 16).substring(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
String result;
|
||||||
|
if ((result = WebUtil.getContents(String.format(Configuration.COMPARE_CHECKSUM_URL, "client", currentVersion.get()), "checksum=" + URLEncoder.encode(sb.toString(), "UTF-8"))) != null) {
|
||||||
|
JSONObject object = (JSONObject) WebUtil.getJsonParser().parse(result);
|
||||||
|
boolean upToDate = (boolean) object.get("result");
|
||||||
|
Core.verbose("Local checksum: " + URLEncoder.encode(sb.toString(), "UTF-8") + ". " + (upToDate ? "This matches BDN and is up to date." : "BDN mismatch, must be Out Of Date."));
|
||||||
|
return upToDate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (NoSuchAlgorithmException | ParseException | IOException | URISyntaxException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method that removes the cache contents after 3 days
|
||||||
|
*/
|
||||||
|
private static void validateCache() {
|
||||||
|
// Already handled by Directories initiating
|
||||||
|
// Method will be used once BDN V3 has a functionality for this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -57,7 +57,7 @@ public class AddCallbackAdapter implements Injectable, Opcodes {
|
|||||||
}
|
}
|
||||||
inject.add(new MethodInsnNode(INVOKESTATIC,
|
inject.add(new MethodInsnNode(INVOKESTATIC,
|
||||||
this.invokeClass, this.invokeMethod,
|
this.invokeClass, this.invokeMethod,
|
||||||
this.desc));
|
this.desc, false));
|
||||||
if (this.conditional) {
|
if (this.conditional) {
|
||||||
LabelNode ln = new LabelNode(new Label());
|
LabelNode ln = new LabelNode(new Label());
|
||||||
inject.add(new JumpInsnNode(IFEQ, ln));
|
inject.add(new JumpInsnNode(IFEQ, ln));
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import org.objectweb.asm.Opcodes;
|
|||||||
import org.objectweb.asm.tree.*;
|
import org.objectweb.asm.tree.*;
|
||||||
|
|
||||||
public class AddDebugAdapter {
|
public class AddDebugAdapter {
|
||||||
private ClassNode owner;
|
private ClassNode owner;
|
||||||
private MethodNode mn;
|
private MethodNode mn;
|
||||||
|
|
||||||
public AddDebugAdapter(ClassNode owner, MethodNode mn) {
|
public AddDebugAdapter(ClassNode owner, MethodNode mn) {
|
||||||
@@ -19,14 +19,19 @@ public class AddDebugAdapter {
|
|||||||
|
|
||||||
public void inject() {
|
public void inject() {
|
||||||
InsnList inject = new InsnList();
|
InsnList inject = new InsnList();
|
||||||
Label l0 = new Label();
|
Label l0 = new Label();
|
||||||
inject.add(new LabelNode(l0));
|
inject.add(new LabelNode(l0));
|
||||||
|
|
||||||
String callString = owner.name + "." + mn.name + " " + mn.desc;
|
String callString = owner.name + "." + mn.name + " " + mn.desc;
|
||||||
LdcInsnNode ldc = new LdcInsnNode(callString);
|
LdcInsnNode ldc = new LdcInsnNode(callString);
|
||||||
|
|
||||||
MethodInsnNode methodNode = new MethodInsnNode(Opcodes.INVOKESTATIC, "org/parabot/core/Core", "debug",
|
MethodInsnNode methodNode = new MethodInsnNode(
|
||||||
"(Ljava/lang/String;)V");
|
Opcodes.INVOKESTATIC,
|
||||||
|
"org/parabot/core/Core",
|
||||||
|
"debug",
|
||||||
|
"(Ljava/lang/String;)V",
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
inject.add(ldc);
|
inject.add(ldc);
|
||||||
inject.add(methodNode);
|
inject.add(methodNode);
|
||||||
|
|||||||
@@ -94,9 +94,9 @@ public class AddInvokerAdapter implements Opcodes, Injectable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isInterface) {
|
if (isInterface) {
|
||||||
m.visitMethodInsn(INVOKEINTERFACE, instanceCast, mName, mDesc);
|
m.visitMethodInsn(INVOKEINTERFACE, instanceCast, mName, mDesc, true);
|
||||||
} else {
|
} else {
|
||||||
m.visitMethodInsn(isStatic ? INVOKESTATIC : INVOKEVIRTUAL, methodLocation.name, mn.name, mn.desc);
|
m.visitMethodInsn(isStatic ? INVOKESTATIC : INVOKEVIRTUAL, methodLocation.name, mn.name, mn.desc, false);
|
||||||
}
|
}
|
||||||
if (this.returnDesc.contains("L")) {
|
if (this.returnDesc.contains("L")) {
|
||||||
if (!this.returnDesc.contains("[")) {
|
if (!this.returnDesc.contains("[")) {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ public class SystemRedirect {
|
|||||||
|
|
||||||
public static PrintStream out = System.out;
|
public static PrintStream out = System.out;
|
||||||
public static PrintStream err = System.err;
|
public static PrintStream err = System.err;
|
||||||
public static InputStream in = System.in;
|
public static InputStream in = System.in;
|
||||||
|
|
||||||
public static long currentTimeMillis() {
|
public static long currentTimeMillis() {
|
||||||
return System.currentTimeMillis();
|
return System.currentTimeMillis();
|
||||||
@@ -23,11 +23,23 @@ public class SystemRedirect {
|
|||||||
System.exit(i);
|
System.exit(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String getClassPath(){
|
||||||
|
String classPath = System.getProperty("java.class.path");
|
||||||
|
StringBuilder finalClassPath = new StringBuilder();
|
||||||
|
for (String path : classPath.split(":")) {
|
||||||
|
if (!path.toLowerCase().contains("parabot")) {
|
||||||
|
finalClassPath.append(path).append(":");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return finalClassPath.toString();
|
||||||
|
}
|
||||||
|
|
||||||
public static String getProperty(String s) {
|
public static String getProperty(String s) {
|
||||||
String value;
|
String value;
|
||||||
switch (s) {
|
switch (s) {
|
||||||
case "java.class.path":
|
case "java.class.path":
|
||||||
value = ".";
|
value = getClassPath();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
value = System.getProperty(s);
|
value = System.getProperty(s);
|
||||||
@@ -42,14 +54,14 @@ public class SystemRedirect {
|
|||||||
String value = null;
|
String value = null;
|
||||||
switch (s2) {
|
switch (s2) {
|
||||||
case "java.class.path":
|
case "java.class.path":
|
||||||
value = ".";
|
value = getClassPath();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
switch (s) {
|
switch (s) {
|
||||||
case "java.class.path":
|
case "java.class.path":
|
||||||
value = ".";
|
value = getClassPath();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
value = System.getProperty(s);
|
value = System.getProperty(s);
|
||||||
|
|||||||
@@ -18,9 +18,10 @@ public abstract class ScriptParser {
|
|||||||
|
|
||||||
public static final Map<ScriptDescription, ScriptExecuter> SCRIPT_CACHE = new HashMap<>();
|
public static final Map<ScriptDescription, ScriptExecuter> SCRIPT_CACHE = new HashMap<>();
|
||||||
|
|
||||||
|
private static final ArrayList<ScriptParser> parsers = new ArrayList<>();
|
||||||
|
|
||||||
public static ScriptDescription[] getDescriptions() {
|
public static ScriptDescription[] getDescriptions() {
|
||||||
SCRIPT_CACHE.clear();
|
SCRIPT_CACHE.clear();
|
||||||
final ArrayList<ScriptParser> parsers = new ArrayList<>();
|
|
||||||
if (Core.inLoadLocal()) {
|
if (Core.inLoadLocal()) {
|
||||||
parsers.add(new LocalJavaScripts());
|
parsers.add(new LocalJavaScripts());
|
||||||
parsers.add(new BDNScripts());
|
parsers.add(new BDNScripts());
|
||||||
@@ -47,6 +48,9 @@ public abstract class ScriptParser {
|
|||||||
return SORTED_SCRIPT_CACHE.keySet().toArray(new ScriptDescription[SORTED_SCRIPT_CACHE.size()]);
|
return SORTED_SCRIPT_CACHE.keySet().toArray(new ScriptDescription[SORTED_SCRIPT_CACHE.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void execute();
|
public static final void addParser(ScriptParser parser) {
|
||||||
|
parsers.add(parser);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void execute();
|
||||||
}
|
}
|
||||||
@@ -27,11 +27,11 @@ import java.util.HashMap;
|
|||||||
*/
|
*/
|
||||||
public class ReflectUI extends JFrame {
|
public class ReflectUI extends JFrame {
|
||||||
private static final long serialVersionUID = 98565034137367257L;
|
private static final long serialVersionUID = 98565034137367257L;
|
||||||
private JTree tree;
|
private JTree tree;
|
||||||
private DefaultMutableTreeNode root;
|
private DefaultMutableTreeNode root;
|
||||||
private DefaultTreeModel model;
|
private DefaultTreeModel model;
|
||||||
private JEditorPane basicInfoPane;
|
private JEditorPane basicInfoPane;
|
||||||
private JEditorPane selectionInfoPane;
|
private JEditorPane selectionInfoPane;
|
||||||
|
|
||||||
private Object instance;
|
private Object instance;
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ public class ReflectUI extends JFrame {
|
|||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
RefField result = null;
|
RefField result = null;
|
||||||
String search = searchFunction.getText();
|
String search = searchFunction.getText();
|
||||||
for (RefField f : fields.values()) {
|
for (RefField f : fields.values()) {
|
||||||
if (f != null && (f.asObject()) != null) {
|
if (f != null && (f.asObject()) != null) {
|
||||||
String value;
|
String value;
|
||||||
@@ -137,9 +137,9 @@ public class ReflectUI extends JFrame {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void valueChanged(TreeSelectionEvent event) {
|
public void valueChanged(TreeSelectionEvent event) {
|
||||||
TreePath path = event.getPath();
|
TreePath path = event.getPath();
|
||||||
Object[] pathElements = path.getPath();
|
Object[] pathElements = path.getPath();
|
||||||
Object element = pathElements[pathElements.length - 1];
|
Object element = pathElements[pathElements.length - 1];
|
||||||
if (pathElements.length == 2) {
|
if (pathElements.length == 2) {
|
||||||
setClassInfo(classes.get(element));
|
setClassInfo(classes.get(element));
|
||||||
} else if (pathElements.length == 3) {
|
} else if (pathElements.length == 3) {
|
||||||
@@ -179,7 +179,7 @@ public class ReflectUI extends JFrame {
|
|||||||
content.add(searchContent);
|
content.add(searchContent);
|
||||||
|
|
||||||
JScrollPane contentPane = new JScrollPane(content);
|
JScrollPane contentPane = new JScrollPane(content);
|
||||||
Dimension prefSize = content.getPreferredSize();
|
Dimension prefSize = content.getPreferredSize();
|
||||||
contentPane.setPreferredSize(new Dimension(prefSize.width + contentPane.getVerticalScrollBar().getPreferredSize().width, prefSize.height + contentPane.getHorizontalScrollBar().getPreferredSize().height));
|
contentPane.setPreferredSize(new Dimension(prefSize.width + contentPane.getVerticalScrollBar().getPreferredSize().width, prefSize.height + contentPane.getHorizontalScrollBar().getPreferredSize().height));
|
||||||
setContentPane(contentPane);
|
setContentPane(contentPane);
|
||||||
pack();
|
pack();
|
||||||
@@ -188,8 +188,8 @@ public class ReflectUI extends JFrame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void fillModel() {
|
private void fillModel() {
|
||||||
Context context = Context.getInstance();
|
Context context = Context.getInstance();
|
||||||
ClassPath classPath = context.getClassPath();
|
ClassPath classPath = context.getClassPath();
|
||||||
ASMClassLoader classLoader = context.getASMClassLoader();
|
ASMClassLoader classLoader = context.getASMClassLoader();
|
||||||
for (String className : classPath.classNames) {
|
for (String className : classPath.classNames) {
|
||||||
try {
|
try {
|
||||||
@@ -219,7 +219,7 @@ public class ReflectUI extends JFrame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void fillBasicInfoPane() {
|
private void fillBasicInfoPane() {
|
||||||
Context context = Context.getInstance();
|
Context context = Context.getInstance();
|
||||||
ClassPath classPath = context.getClassPath();
|
ClassPath classPath = context.getClassPath();
|
||||||
|
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
@@ -231,8 +231,8 @@ public class ReflectUI extends JFrame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setFieldInfo(RefField refField) {
|
private void setFieldInfo(RefField refField) {
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
RefClass refClass = refField.getOwner();
|
RefClass refClass = refField.getOwner();
|
||||||
builder.append("<h1>").append(refClass.getClassName()).append(".").append(refField.getName()).append("</h1><br/>");
|
builder.append("<h1>").append(refClass.getClassName()).append(".").append(refField.getName()).append("</h1><br/>");
|
||||||
builder.append("<b>Class: </b>").append(refClass.getClassName()).append("<br/>");
|
builder.append("<b>Class: </b>").append(refClass.getClassName()).append("<br/>");
|
||||||
builder.append("<b>Value: </b>").append(refField.asObject()).append("<br/>");
|
builder.append("<b>Value: </b>").append(refField.asObject()).append("<br/>");
|
||||||
@@ -240,11 +240,23 @@ public class ReflectUI extends JFrame {
|
|||||||
builder.append("<b>Static: </b>").append(refField.isStatic() ? "yes" : "no").append("<br/>");
|
builder.append("<b>Static: </b>").append(refField.isStatic() ? "yes" : "no").append("<br/>");
|
||||||
builder.append("<b>Array: </b>").append(refField.isArray() ? refField.getArrayDimensions() + " dimension(s)" : "no").append("<br/>");
|
builder.append("<b>Array: </b>").append(refField.isArray() ? refField.getArrayDimensions() + " dimension(s)" : "no").append("<br/>");
|
||||||
|
|
||||||
if (refField.isArray() && refField.getASMType().getClassName().contains("String") && refField.getArrayDimensions() == 1) {
|
if (refField.isArray()) {
|
||||||
String[] strings = (String[]) refField.asObject();
|
if (refField.getArrayDimensions() == 1) {
|
||||||
String values = StringUtils.implode(", ", strings);
|
if (refField.getASMType().getClassName().contains("int")) {
|
||||||
|
int[] ints = (int[]) refField.asObject();
|
||||||
|
String values = "";
|
||||||
|
for (int i = 0; i < ints.length; i++) {
|
||||||
|
values += (ints[i] + (i < ints.length - 1 ? ", " : ""));
|
||||||
|
}
|
||||||
|
|
||||||
builder.append("<b>Values: </b>").append(values).append("<br/>");
|
builder.append("<b>Values: </b>").append(values).append("<br/>");
|
||||||
|
} else if (refField.getASMType().getClassName().contains("String")) {
|
||||||
|
String[] strings = (String[]) refField.asObject();
|
||||||
|
String values = StringUtils.implode(", ", strings);
|
||||||
|
|
||||||
|
builder.append("<b>Values: </b>").append(values).append("<br/>");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
selectionInfoPane.setText(builder.toString());
|
selectionInfoPane.setText(builder.toString());
|
||||||
|
|
||||||
|
|||||||
@@ -163,14 +163,7 @@ public final class ScriptSelector extends JFrame {
|
|||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
String s = getScriptName(tree.getSelectionPath().toString());
|
String s = getScriptName(tree.getSelectionPath().toString());
|
||||||
if (s != null) {
|
runScript(format.get(s));
|
||||||
try {
|
|
||||||
WebUtil.getContents("http://bdn.parabot.org/api/v2/scripts/local", "script=" + URLEncoder.encode(s, "UTF-8") + "&username=" + URLEncoder.encode(Context.getUsername(), "UTF-8"));
|
|
||||||
} catch (MalformedURLException | UnsupportedEncodingException e1) {
|
|
||||||
e1.printStackTrace();
|
|
||||||
}
|
|
||||||
runScript(format.get(s));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -39,4 +39,9 @@ public class UILog {
|
|||||||
return JOptionPane.showOptionDialog(null, message, title,
|
return JOptionPane.showOptionDialog(null, message, title,
|
||||||
JOptionPane.YES_NO_CANCEL_OPTION, messageType, null, options, null);
|
JOptionPane.YES_NO_CANCEL_OPTION, messageType, null, options, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int alert(final String title, final String message, Object[] options, int initialValue, int messageType) {
|
||||||
|
return JOptionPane.showOptionDialog(null, message, title,
|
||||||
|
JOptionPane.YES_NO_CANCEL_OPTION, messageType, null, options, initialValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
package org.parabot.environment.handlers.exceptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to be implemented that allows multiple types of exception handlers
|
||||||
|
*/
|
||||||
|
public abstract class ExceptionHandler implements Thread.UncaughtExceptionHandler {
|
||||||
|
/**
|
||||||
|
* The name of the exception handler
|
||||||
|
*/
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The status of the exception handler; Defines if the exception handler is enabled or disabled
|
||||||
|
*/
|
||||||
|
private boolean enabled = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type the handler is meant for
|
||||||
|
*/
|
||||||
|
private ExceptionType exceptionType;
|
||||||
|
|
||||||
|
public ExceptionHandler(String name, ExceptionType exceptionType) {
|
||||||
|
this.name = name;
|
||||||
|
this.exceptionType = exceptionType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void uncaughtException(Thread t, Throwable e) {
|
||||||
|
this.handle(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the exception to class extending this abstract class
|
||||||
|
*
|
||||||
|
* @param e
|
||||||
|
*/
|
||||||
|
public abstract void handle(Throwable e);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns if the exception handler is enabled or disabled
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the enabled status of the exception handler
|
||||||
|
*
|
||||||
|
* @param enabled
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public ExceptionHandler setEnabled(boolean enabled) {
|
||||||
|
this.enabled = enabled;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExceptionType getExceptionType() {
|
||||||
|
return exceptionType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExceptionHandler setExceptionType(ExceptionType exceptionType) {
|
||||||
|
this.exceptionType = exceptionType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ExceptionType {
|
||||||
|
SERVER("Server"),
|
||||||
|
SCRIPT("Script"),
|
||||||
|
CLIENT("Client");
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
ExceptionType(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
package org.parabot.environment.handlers.exceptions;
|
||||||
|
|
||||||
|
import org.parabot.core.Directories;
|
||||||
|
import org.parabot.core.ui.utils.UILog;
|
||||||
|
import org.parabot.environment.api.utils.FileUtil;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes exceptions to a file and reports the file location back to the user
|
||||||
|
*/
|
||||||
|
public class FileExceptionHandler extends ExceptionHandler {
|
||||||
|
/**
|
||||||
|
* The default index of all options to be selected when the popup appears
|
||||||
|
*/
|
||||||
|
private static final int defaultOptionIndex = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directory where the reports get written to
|
||||||
|
*/
|
||||||
|
private final File reportsDirectory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All possible options to select when the popup appears
|
||||||
|
*/
|
||||||
|
private final Object[] options = new Object[]{
|
||||||
|
"Close",
|
||||||
|
"Open report",
|
||||||
|
"Ignore " + this.getExceptionType().getName().toLowerCase() + " errors" };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines if the alert should popup during this client instance again
|
||||||
|
*/
|
||||||
|
private boolean ignored = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the exception handler and ensures the reports directory is created and writable
|
||||||
|
*/
|
||||||
|
public FileExceptionHandler(ExceptionType exceptionType) {
|
||||||
|
super("File exception handler", exceptionType);
|
||||||
|
|
||||||
|
this.reportsDirectory = new File(Directories.getWorkspace(), "reports");
|
||||||
|
if (!this.reportsDirectory.exists() || !this.reportsDirectory.isDirectory()) {
|
||||||
|
this.reportsDirectory.mkdir();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.cleanOldErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handle(Throwable e) {
|
||||||
|
File report = new File(this.reportsDirectory, "report-" + this.getExceptionType().getName().toLowerCase() + "-" + (System.currentTimeMillis() / 1000) + ".txt");
|
||||||
|
try {
|
||||||
|
report.createNewFile();
|
||||||
|
|
||||||
|
StringBuilder reportContent = new StringBuilder();
|
||||||
|
reportContent.append("Message: ").append(e.getMessage()).append("\n\n");
|
||||||
|
reportContent.append(e.toString()).append("\n\n");
|
||||||
|
|
||||||
|
for (int i = 0; i < e.getStackTrace().length; i++) {
|
||||||
|
if (i > 0) {
|
||||||
|
reportContent.append("\t");
|
||||||
|
}
|
||||||
|
reportContent.append(e.getStackTrace()[i]).append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
FileUtil.writeFileContents(report, reportContent.toString());
|
||||||
|
|
||||||
|
if (!ignored) {
|
||||||
|
displayAlert(report);
|
||||||
|
}
|
||||||
|
} catch (IOException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isIgnored() {
|
||||||
|
return ignored;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileExceptionHandler setIgnored(boolean ignored) {
|
||||||
|
this.ignored = ignored;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getReportsDirectory() {
|
||||||
|
return reportsDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays the dialog of the alert
|
||||||
|
*
|
||||||
|
* @param report
|
||||||
|
*/
|
||||||
|
private void displayAlert(File report) {
|
||||||
|
int response = UILog.alert(
|
||||||
|
"Error occurred",
|
||||||
|
"We are sorry to inform you that an error occurred within Parabot.\n\n" +
|
||||||
|
"The error has been written to a report file.\n" +
|
||||||
|
"Please report the error to the Parabot staff with as much information as possible.",
|
||||||
|
this.options,
|
||||||
|
defaultOptionIndex,
|
||||||
|
JOptionPane.WARNING_MESSAGE
|
||||||
|
);
|
||||||
|
|
||||||
|
switch (response) {
|
||||||
|
case 1:
|
||||||
|
try {
|
||||||
|
Desktop.getDesktop().open(report);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ignored = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove errors older than 24 hours
|
||||||
|
*/
|
||||||
|
private void cleanOldErrors() {
|
||||||
|
File[] reports = this.reportsDirectory.listFiles();
|
||||||
|
if (reports != null) {
|
||||||
|
for (File report : reports) {
|
||||||
|
if (report.isFile()) {
|
||||||
|
if ((System.currentTimeMillis() - report.lastModified()) / 1000 > 60 * 60 * 24) {
|
||||||
|
report.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -77,7 +77,7 @@ public abstract class ServerProvider implements Opcodes {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
HookParser parser = hookFile.getParser();
|
HookParser parser = hookFile.getParser();
|
||||||
Injectable[] injectables = parser.getInjectables();
|
Injectable[] injectables = parser.getInjectables();
|
||||||
|
|
||||||
if (injectables == null) {
|
if (injectables == null) {
|
||||||
@@ -92,17 +92,18 @@ public abstract class ServerProvider implements Opcodes {
|
|||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
} catch (NullPointerException ex) {
|
} catch (NullPointerException ex) {
|
||||||
if(!crashed) {
|
if (!crashed) {
|
||||||
Injectable inj = injectables[index];
|
Injectable inj = injectables[index];
|
||||||
|
|
||||||
int resp = UILog.alert("Outdated client", "This server currently has outdated hooks, please report it to a member of the Parabot staff.\r\n\r\n" +
|
int resp = UILog.alert("Outdated client", "This server currently has outdated hooks, please report it to the Parabot staff.\r\n\r\n" +
|
||||||
"Broken hook:\r\n"+inj, new Object[]{"Close", "Report here..."}, JOptionPane.ERROR_MESSAGE);
|
"Broken hook:\r\n" + inj, new Object[]{ "Close", "Report here..." }, JOptionPane.ERROR_MESSAGE);
|
||||||
|
|
||||||
if(resp == 1) {
|
if (resp == 1) {
|
||||||
URI uri = URI.create(Configuration.COMMUNITY_PAGE + "forum/135-reports/");
|
URI uri = URI.create(Configuration.COMMUNITY_PAGE + "forum/135-reports/");
|
||||||
try {
|
try {
|
||||||
Desktop.getDesktop().browse(uri);
|
Desktop.getDesktop().browse(uri);
|
||||||
} catch (IOException ignore) {}
|
} catch (IOException ignore) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
crashed = true;
|
crashed = true;
|
||||||
@@ -112,20 +113,6 @@ public abstract class ServerProvider implements Opcodes {
|
|||||||
Context.getInstance().setHookParser(parser);
|
Context.getInstance().setHookParser(parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
private HookFile fetchHookFile() {
|
|
||||||
HookFile hookFile = getHookFile();
|
|
||||||
if (hookFile != null) {
|
|
||||||
return hookFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
URL hookLocation = getHooks();
|
|
||||||
if (hookLocation == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new HookFile(hookLocation, HookFile.TYPE_XML);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add custom items to the bot menu bar
|
* Add custom items to the bot menu bar
|
||||||
*
|
*
|
||||||
@@ -156,16 +143,16 @@ public abstract class ServerProvider implements Opcodes {
|
|||||||
|
|
||||||
public void initMouse() {
|
public void initMouse() {
|
||||||
final Context context = Context.getInstance();
|
final Context context = Context.getInstance();
|
||||||
final Applet applet = context.getApplet();
|
final Applet applet = context.getApplet();
|
||||||
final Mouse mouse = new Mouse(applet);
|
final Mouse mouse = new Mouse(applet);
|
||||||
applet.addMouseListener(mouse);
|
applet.addMouseListener(mouse);
|
||||||
applet.addMouseMotionListener(mouse);
|
applet.addMouseMotionListener(mouse);
|
||||||
context.setMouse(mouse);
|
context.setMouse(mouse);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initKeyboard() {
|
public void initKeyboard() {
|
||||||
final Context context = Context.getInstance();
|
final Context context = Context.getInstance();
|
||||||
final Applet applet = context.getApplet();
|
final Applet applet = context.getApplet();
|
||||||
final Keyboard keyboard = new Keyboard(applet);
|
final Keyboard keyboard = new Keyboard(applet);
|
||||||
applet.addKeyListener(keyboard);
|
applet.addKeyListener(keyboard);
|
||||||
context.setKeyboard(keyboard);
|
context.setKeyboard(keyboard);
|
||||||
@@ -191,4 +178,18 @@ public abstract class ServerProvider implements Opcodes {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private HookFile fetchHookFile() {
|
||||||
|
HookFile hookFile = getHookFile();
|
||||||
|
if (hookFile != null) {
|
||||||
|
return hookFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
URL hookLocation = getHooks();
|
||||||
|
if (hookLocation == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new HookFile(hookLocation, HookFile.TYPE_XML);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -24,9 +24,9 @@ import java.net.URL;
|
|||||||
* @author JKetelaar
|
* @author JKetelaar
|
||||||
*/
|
*/
|
||||||
public class LocalPublicServerExecuter extends ServerExecuter {
|
public class LocalPublicServerExecuter extends ServerExecuter {
|
||||||
private String serverName;
|
private String serverName;
|
||||||
private String serverUrl;
|
private String serverUrl;
|
||||||
private String providerUrl;
|
private String providerUrl;
|
||||||
private ServerProviderInfo serverProviderInfo;
|
private ServerProviderInfo serverProviderInfo;
|
||||||
|
|
||||||
public LocalPublicServerExecuter(final String serverName, final ServerProviderInfo serverProviderInfo, String serverUrl, String providerUrl) {
|
public LocalPublicServerExecuter(final String serverName, final ServerProviderInfo serverProviderInfo, String serverUrl, String providerUrl) {
|
||||||
@@ -80,8 +80,8 @@ public class LocalPublicServerExecuter extends ServerExecuter {
|
|||||||
|
|
||||||
BuildPath.add(destination.toURI().toURL());
|
BuildPath.add(destination.toURI().toURL());
|
||||||
|
|
||||||
ServerLoader serverLoader = new ServerLoader(classPath);
|
ServerLoader serverLoader = new ServerLoader(classPath);
|
||||||
final String[] classNames = serverLoader.getServerClassNames();
|
final String[] classNames = serverLoader.getServerClassNames();
|
||||||
if (classNames.length == 0) {
|
if (classNames.length == 0) {
|
||||||
UILog.log(
|
UILog.log(
|
||||||
"Error",
|
"Error",
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ import java.net.MalformedURLException;
|
|||||||
*/
|
*/
|
||||||
public class LocalServerExecuter extends ServerExecuter {
|
public class LocalServerExecuter extends ServerExecuter {
|
||||||
private final Constructor<?> serverProviderConstructor;
|
private final Constructor<?> serverProviderConstructor;
|
||||||
private ClassPath classPath;
|
private ClassPath classPath;
|
||||||
private String serverName;
|
private String serverName;
|
||||||
|
|
||||||
public LocalServerExecuter(Constructor<?> serverProviderConstructor,
|
public LocalServerExecuter(Constructor<?> serverProviderConstructor,
|
||||||
ClassPath classPath, final String serverName) {
|
ClassPath classPath, final String serverName) {
|
||||||
|
|||||||
@@ -36,10 +36,9 @@ public class PublicServerExecuter extends ServerExecuter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
private String serverName;
|
|
||||||
|
|
||||||
private PBLocalPreferences settings;
|
|
||||||
private final String cacheVersionKey = "cachedProviderVersion";
|
private final String cacheVersionKey = "cachedProviderVersion";
|
||||||
|
private String serverName;
|
||||||
|
private PBLocalPreferences settings;
|
||||||
|
|
||||||
public PublicServerExecuter(final String serverName) {
|
public PublicServerExecuter(final String serverName) {
|
||||||
this.serverName = serverName;
|
this.serverName = serverName;
|
||||||
@@ -58,14 +57,14 @@ public class PublicServerExecuter extends ServerExecuter {
|
|||||||
Core.verbose("Downloading: " + jarUrl + " ...");
|
Core.verbose("Downloading: " + jarUrl + " ...");
|
||||||
|
|
||||||
String providerVersion = serverProviderInfo.getProviderVersion();
|
String providerVersion = serverProviderInfo.getProviderVersion();
|
||||||
if(providerVersion == null) {
|
if (providerVersion == null) {
|
||||||
providerVersion = "error";
|
providerVersion = "error";
|
||||||
}
|
}
|
||||||
|
|
||||||
settings = new PBLocalPreferences(serverProviderInfo.getClientCRC32()+".json");
|
settings = new PBLocalPreferences(serverProviderInfo.getClientCRC32() + ".json");
|
||||||
if(settings.getSetting(cacheVersionKey) != null) {
|
if (settings.getSetting(cacheVersionKey) != null) {
|
||||||
Core.verbose(String.format("Latest provider version: %s, local provider version: %s", settings.getSetting(cacheVersionKey), providerVersion));
|
Core.verbose(String.format("Latest provider version: %s, local provider version: %s", settings.getSetting(cacheVersionKey), providerVersion));
|
||||||
if(!settings.getSetting(cacheVersionKey).equals(providerVersion)) {
|
if (!settings.getSetting(cacheVersionKey).equals(providerVersion)) {
|
||||||
Core.verbose("Local provider outdated, clearing cache.");
|
Core.verbose("Local provider outdated, clearing cache.");
|
||||||
Directories.clearCache();
|
Directories.clearCache();
|
||||||
}
|
}
|
||||||
@@ -88,8 +87,8 @@ public class PublicServerExecuter extends ServerExecuter {
|
|||||||
|
|
||||||
BuildPath.add(destination.toURI().toURL());
|
BuildPath.add(destination.toURI().toURL());
|
||||||
|
|
||||||
ServerLoader serverLoader = new ServerLoader(classPath);
|
ServerLoader serverLoader = new ServerLoader(classPath);
|
||||||
final String[] classNames = serverLoader.getServerClassNames();
|
final String[] classNames = serverLoader.getServerClassNames();
|
||||||
if (classNames == null || classNames.length == 0) {
|
if (classNames == null || classNames.length == 0) {
|
||||||
UILog.log(
|
UILog.log(
|
||||||
"Error",
|
"Error",
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package org.parabot.environment.servers.executers;
|
|||||||
import org.parabot.core.Context;
|
import org.parabot.core.Context;
|
||||||
import org.parabot.core.ui.BotUI;
|
import org.parabot.core.ui.BotUI;
|
||||||
import org.parabot.core.ui.components.PaintComponent;
|
import org.parabot.core.ui.components.PaintComponent;
|
||||||
|
import org.parabot.environment.handlers.exceptions.ExceptionHandler;
|
||||||
|
import org.parabot.environment.handlers.exceptions.FileExceptionHandler;
|
||||||
import org.parabot.environment.servers.ServerProvider;
|
import org.parabot.environment.servers.ServerProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -15,7 +17,7 @@ public abstract class ServerExecuter {
|
|||||||
public abstract void run();
|
public abstract void run();
|
||||||
|
|
||||||
public void finalize(final ServerProvider provider, final String serverName) {
|
public void finalize(final ServerProvider provider, final String serverName) {
|
||||||
new Thread(new Runnable() {
|
Thread serverThread = new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
@@ -30,7 +32,11 @@ public abstract class ServerExecuter {
|
|||||||
t.printStackTrace();
|
t.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).start();
|
});
|
||||||
|
|
||||||
|
serverThread.setUncaughtExceptionHandler(new FileExceptionHandler(ExceptionHandler.ExceptionType.SERVER));
|
||||||
|
|
||||||
|
serverThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,8 +29,9 @@ public class ServerLoader extends ASMClassLoader {
|
|||||||
public final String[] getServerClassNames() {
|
public final String[] getServerClassNames() {
|
||||||
final List<String> classNames = new ArrayList<String>();
|
final List<String> classNames = new ArrayList<String>();
|
||||||
for (ClassNode c : classPath.classes.values()) {
|
for (ClassNode c : classPath.classes.values()) {
|
||||||
if (c.superName.replace('/', '.').equals(
|
if (c.superName
|
||||||
ServerProvider.class.getName())) {
|
.replace('/', '.')
|
||||||
|
.equals(ServerProvider.class.getName())) {
|
||||||
classNames.add(c.name.replace('/', '.'));
|
classNames.add(c.name.replace('/', '.'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package org.parabot;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.parabot.environment.handlers.exceptions.ExceptionHandler;
|
||||||
|
import org.parabot.environment.handlers.exceptions.FileExceptionHandler;
|
||||||
|
|
||||||
|
public class FileExceptionHandlerTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void manualTest() {
|
||||||
|
FileExceptionHandler handler = new FileExceptionHandler(ExceptionHandler.ExceptionType.CLIENT);
|
||||||
|
handler.setIgnored(true);
|
||||||
|
|
||||||
|
Exception exception = new NullPointerException("Manual test");
|
||||||
|
handler.handle(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void threadHandlerTest() {
|
||||||
|
FileExceptionHandler handler = new FileExceptionHandler(ExceptionHandler.ExceptionType.CLIENT);
|
||||||
|
handler.setIgnored(true);
|
||||||
|
|
||||||
|
Thread thread = new Thread() {
|
||||||
|
@Override
|
||||||
|
public void run() throws NullPointerException {
|
||||||
|
throw new NullPointerException("Thread test");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
thread.setUncaughtExceptionHandler(handler);
|
||||||
|
thread.start();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Thread.sleep(1500);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user