rendered paste bodypackage com.kbot2.handlers;
import com.kbot2.UI.BotUI;
import com.kbot2.UI.ArgumentGetter;
import com.kbot2.bot.Bot;
import com.kbot2.handlers.other.Account;
import com.kbot2.handlers.settings.Setting;
import com.kbot2.handlers.eventSystem.eventListeners.PaintListener;
import com.kbot2.handlers.eventSystem.eventListeners.RandomListener;
import com.kbot2.handlers.eventSystem.eventListeners.TextPaintListener;
import com.kbot2.handlers.eventSystem.eventListeners.ServerMessageListener;
import com.kbot2.out.Console;
import com.kbot2.scriptable.LoadedScript;
import com.kbot2.scriptable.Script;
import com.kbot2.scriptable.HTMLDescription;
import com.kbot2.loader.HackedClassLoader;
import javax.swing.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
/**
* Created by IntelliJ IDEA.
* User: Jan Ove / Kosaki
* Date: 19.mar.2009
* Time: 17:21:03
*/
public class ScriptHandler {
private final Bot bot;
public final Vector<LoadedScript> runningScripts = new Vector<LoadedScript>();
public final RandomHandler randomHandler;
private Account account;
private boolean usingAccount;
public ScriptHandler(Bot bot) {
this.bot = bot;
// One random handler per ScriptHandler instance
randomHandler = new RandomHandler(bot);
}
/**
* Loads a script from the scripts directory.
* @param fileName without ".class"
* @return
*/
public Script loadScript(String fileName) {
try {
ClassLoader cl = new HackedClassLoader("file:./out/production/KBot2/com/scripts/", HackedClassLoader.class.getClassLoader());
Class<?> scriptClass = cl.loadClass("com.scripts." + fileName.replace(".class", ""));
Object scriptObj = scriptClass.newInstance();
if (scriptObj instanceof Script) {
updateLastRan((Script) scriptObj, fileName.replace(".class", ""));
return (Script) scriptObj;
} else {
Console.writeLine(this, fileName + " does not extend the correct class.");
}
} catch (Exception e) {
Console.writeLine(this, "Error when loading script " + fileName + ".");
Console.writeLine(this, "Caused by an: "+e.toString());
}
System.gc();
return null;
}
/**
* Starts a script
*
* @param script
* @credits Apples for his patch that fixed running the same script twice and turn of debug if clicking twice ;)
*/
public void runScript(Script script) {
if(script == null)
Console.writeLine(this, "Internal error: Loaded null script.");
try {
bot.getClient().getMyPlayer().getPosX();
} catch (Exception e) {
return;
}
for(LoadedScript loadedScript: runningScripts){
if (loadedScript.script.getName().equals(script.getName())) {
for(String tag: script.getTags()) {
if(tag == null)
continue;
if(tag.toLowerCase().equals("debug")){
stopScript(loadedScript.script);
return;
}
}
if(JOptionPane.showConfirmDialog(null, "This script is already running. \nAre you sure you want to run it?", "Error", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION)
return;
}
}
// Set the botInstance
script.setBotEnv(bot.botEnv);
BotUI.setInputEnabled(bot, false);
if (account == null && !script.getName().toLowerCase().contains("debug")) {
int result = JOptionPane.showConfirmDialog(null, "No account chosen, do you want to run without an account?", "Error", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
usingAccount = false;
if(script instanceof HTMLDescription)
new ArgumentGetter((HTMLDescription) script, bot.botEnv);
else
runScriptInternal(script);
}
} else
if(script instanceof HTMLDescription)
new ArgumentGetter((HTMLDescription) script, bot.botEnv);
else
runScriptInternal(script);
}
/**
* Must be public to be accessed fromn the ArgumentGetter
* @param script
*/
public void runScriptInternal(Script script) {
if (script.onStart()) {
// Auto add event listeners.
if(script instanceof PaintListener){
bot.getEventHandler().addPaintListener((PaintListener) script);
}
if(script instanceof RandomListener){
bot.getEventHandler().addRandomListener((RandomListener) script);
}
if(script instanceof TextPaintListener){
bot.getEventHandler().addTextPaintListener((TextPaintListener) script);
}
if(script instanceof ServerMessageListener){
bot.getEventHandler().addServerMessageListener((ServerMessageListener) script);
}
LoadedScript loadedScript = new LoadedScript(script, this, bot);
runningScripts.add(loadedScript);
loadedScript.startScript();
Console.writeLine(this, "Started script: "+script.getName());
}
}
public void updateLastRan(Script script, String filename) {
// Update the latest ran scripts.
Setting settings = SettingsHandler.getSetting("recentScripts", null)[0];
List<Setting> lastRan = new ArrayList<Setting>();
Setting scriptSetting = new Setting();
scriptSetting.name = "script";
Setting scriptName = new Setting();
scriptName.name = "name";
scriptName.value = script.getName();
scriptSetting.children.add(scriptName);
Setting scriptFileName = new Setting();
scriptFileName.name = "fileName";
scriptFileName.value = filename;
scriptSetting.children.add(scriptFileName);
lastRan.add(scriptSetting);
for (int i = 0; i < 5; i++) {
try {
lastRan.add(settings.children.get(i));
} catch (Exception ignored) {
} // Ignore if there is not 4 recent ran scripts.
}
settings.children.clear();
for (Setting child : lastRan) {
settings.children.add(child);
}
SettingsHandler.saveSetting("recentScripts");
BotUI.updateRecentRanScripts();
}
public void stopScript(Script script) {
for (LoadedScript loadedScript : runningScripts) {
if (loadedScript.script == script) {
stopScript(loadedScript);
break;
}
}
}
public void stopScript(LoadedScript script) {
script.script.onStop();
// Auto remove listeners.
if(script.script instanceof PaintListener){
bot.getEventHandler().removePaintListener((PaintListener) script.script);
}
if(script.script instanceof RandomListener){
bot.getEventHandler().removeRandomListener((RandomListener) script.script);
}
if(script.script instanceof TextPaintListener){
bot.getEventHandler().removeTextPaintListener((TextPaintListener) script.script);
}
if(script.script instanceof ServerMessageListener){
bot.getEventHandler().removeServerMessageListener((ServerMessageListener) script.script);
}
script.stopScript();
runningScripts.remove(script);
Console.writeLine(this, "Stopped the script: "+script.script.getName());
}
public void callRandoms() {
randomHandler.run();
}
public void stopAllScripts() {
while (!runningScripts.isEmpty()) {
stopScript(runningScripts.get(0));
}
}
public void stop() {
stopAllScripts();
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
usingAccount = account != null;
}
public boolean isUsingAccount() {
return usingAccount;
}
public boolean pausedAll = false;
public void pauseAllScripts(){
pausedAll = true;
for(LoadedScript script: runningScripts){
script.pauseScript();
}
}
public void resumeAllScripts(){
pausedAll = false;
for (LoadedScript script: runningScripts){
script.resumeScript();
}
}
}