package 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 runningScripts = new Vector(); 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 lastRan = new ArrayList(); 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(); } } }