All pastes #1520995 Raw Edit

ScriptHandler

public java v1 · immutable
#1520995 ·published 2009-08-07 04:01 UTC
rendered paste body
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<LoadedScript> runningScripts = new Vector<LoadedScript>();    public final RandomHandler randomHandler;    private Account account;    private boolean usingAccount, Checked;    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") && !Checked) {			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) {				Checked = true;				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();           }    }}