All pastes #1520149 Raw Edit

ScriptHandler

public text v1 · immutable
#1520149 ·published 2009-08-06 06:07 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;

    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();   
        }
    }
}