package org.rsbot; import org.rsbot.log.LogFormatter; import org.rsbot.log.SystemConsoleHandler; import org.rsbot.log.TextAreaLogHandler; import org.rsbot.util.StringUtil; import org.rsbot.util.io.IOHelper; import javax.swing.filechooser.FileSystemView; import java.awt.*; import java.io.*; import java.net.MalformedURLException; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.logging.FileHandler; import java.util.logging.LogManager; public class Configuration { public enum OperatingSystem { MAC, WINDOWS, LINUX, UNKNOWN } public static class Paths { public static class Resources { public static final String ROOT = "resources"; public static final String ROOT_IMG = ROOT + "/images"; public static final String SPLASH = ROOT_IMG + "/splash.png"; public static final String ICON = ROOT_IMG + "/icon.png"; public static final String ICON_APPADD = ROOT_IMG + "/application_add.png"; public static final String ICON_APPDELETE = ROOT_IMG + "/application_delete.png"; public static final String ICON_ARROWIN = ROOT_IMG + "/arrow_in.png"; public static final String ICON_REFRESH = ROOT_IMG + "/arrow_refresh.png"; public static final String ICON_DELETE = ROOT_IMG + "/delete.png"; public static final String ICON_GITHUB = ROOT_IMG + "/github.png"; public static final String ICON_PLAY = ROOT_IMG + "/control_play_blue.png"; public static final String ICON_PAUSE = ROOT_IMG + "/control_pause.png"; public static final String DATABASE_ERROR = ROOT_IMG + "/database_error.png"; public static final String ICON_ADD = ROOT_IMG + "/add.png"; public static final String ICON_HOME = ROOT_IMG + "/home.png"; public static final String ICON_BOT = ROOT_IMG + "/bot.png"; public static final String ICON_CLOSE = ROOT_IMG + "/close.png"; public static final String ICON_TICK = ROOT_IMG + "/tick.png"; public static final String ICON_MOUSE = ROOT_IMG + "/mouse.png"; public static final String ICON_PHOTO = ROOT_IMG + "/photo.png"; public static final String ICON_REPORTKEY = ROOT_IMG + "/report_key.png"; public static final String ICON_REPORT_DISK = ROOT_IMG + "/report_disk.png"; public static final String ICON_INFO = ROOT_IMG + "/information.png"; public static final String ICON_KEYBOARD = ROOT_IMG + "/keyboard.png"; public static final String ICON_START = ROOT_IMG + "/control_play.png"; public static final String ICON_SCRIPT = ROOT_IMG + "/script.png"; public static final String ICON_SCRIPT_ADD = ROOT_IMG + "/script_add.png"; public static final String ICON_SCRIPT_LIVE = ROOT_IMG + "/script_lightning.png"; public static final String ICON_SCRIPT_GEAR = ROOT_IMG + "/script_gear.png"; public static final String ICON_SCRIPT_CODE = ROOT_IMG + "/script_code.png"; public static final String ICON_WEBLINK = ROOT_IMG + "/world_link.png"; public static final String ICON_WRENCH = ROOT_IMG + "/wrench.png"; public static final String ICON_LIKE = ROOT_IMG + "/like.png"; public static final String ICON_UNLIKE = ROOT_IMG + "/unlike.png"; public static final String VERSION = ROOT + "/version.txt"; public static final String MESSAGES = ROOT + "/messages/"; } public static class URLs { public static final String HOST = "powercoders.org"; private static final String BASE = "http://links." + HOST + "/"; public static final String DOWNLOAD = BASE + "download"; public static final String CLIENTPATCH = BASE + "clientpatch"; public static final String VERSION = BASE + "version"; public static final String VERSION_KILL = BASE + "version-kill"; public static final String PROJECT = BASE + "git-project"; public static final String SITE = BASE + "site"; } public static final String ROOT = new File(".").getAbsolutePath(); public static final String COMPILE_SCRIPTS_BAT = "Compile-Scripts.bat"; public static final String COMPILE_SCRIPTS_SH = "compile-scripts.sh"; public static final String COMPILE_FIND_JDK = "FindJDK.bat"; public static final String SCRIPTS_NAME_SRC = "scripts"; public static final String SCRIPTS_NAME_OUT = "Scripts"; public static String getAccountsFile() { final String path; if (Configuration.getCurrentOperatingSystem() == OperatingSystem.WINDOWS) { path = System.getenv("APPDATA") + File.separator + Configuration.NAME + "_Accounts.ini"; } else { path = Paths.getUnixHome() + File.separator + "." + Configuration.NAME_LOWERCASE + "acct"; } return path; } public static String getHomeDirectory() { final String env = System.getenv(Configuration.NAME.toUpperCase() + "_HOME"); if (env == null || env.isEmpty()) { return (Configuration.getCurrentOperatingSystem() == OperatingSystem.WINDOWS ? FileSystemView.getFileSystemView().getDefaultDirectory().getAbsolutePath() : Paths.getUnixHome()) + File.separator + Configuration.NAME; } else { return env; } } public static String getLogsDirectory() { return Paths.getHomeDirectory() + File.separator + "Logs"; } public static String getPathCache() { return Paths.getSettingsDirectory() + File.separator + "path.txt"; } public static String getUIDsFile() { return Paths.getSettingsDirectory() + File.separator + "uid.txt"; } public static String getScreenshotsDirectory() { return Paths.getHomeDirectory() + File.separator + "Screenshots"; } public static String getScriptsDirectory() { return Paths.getHomeDirectory() + File.separator + Paths.SCRIPTS_NAME_OUT; } public static String getScriptsSourcesDirectory() { return Paths.getScriptsDirectory() + File.separator + "Sources"; } public static String getScriptsPrecompiledDirectory() { return Paths.getScriptsDirectory() + File.separator + "Precompiled"; } public static String getScriptsNetworkDirectory() { return Paths.getScriptsDirectory() + File.separator + "Network"; } public static String getCacheDirectory() { return Paths.getHomeDirectory() + File.separator + "Cache"; } public static String getScriptsExtractedCache() { return Paths.getCacheDirectory() + File.separator + "script.dat"; } public static String getScriptCacheDirectory() { return getCacheDirectory() + File.separator + "Scripts"; } public static String getVersionCache() { return Paths.getCacheDirectory() + File.separator + "info.dat"; } public static String getWebDatabase() { return Paths.getSettingsDirectory() + File.separator + "Web.store"; } public static String getServiceKey() { return Paths.getSettingsDirectory() + File.separator + "service.key"; } public static String getSettingsDirectory() { return Paths.getHomeDirectory() + File.separator + "Settings"; } public static String getGarbageDirectory() { final File dir = new File(Configuration.Paths.getScriptCacheDirectory(), ".java"); if (!dir.exists()) { dir.mkdirs(); } String path = dir.getAbsolutePath(); try { path = URLDecoder.decode(path, "UTF-8"); } catch (final UnsupportedEncodingException ignored) { } return path; } public static String getRunningJarPath() { if (!RUNNING_FROM_JAR) { return null; } String path = new File(Configuration.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getAbsolutePath(); try { path = URLDecoder.decode(path, "UTF-8"); } catch (UnsupportedEncodingException ignored) { } return path; } public static String getUnixHome() { final String home = System.getProperty("user.home"); return home == null ? "~" : home; } private static Map<String, File> cachableResources; public static Map<String, File> getCachableResources() { if (cachableResources == null) { cachableResources = new HashMap<String, File>(3); cachableResources.put(URLs.CLIENTPATCH, new File(getCacheDirectory(), "ms.dat")); cachableResources.put(URLs.VERSION, new File(getCacheDirectory(), "version-latest.txt")); cachableResources.put(URLs.VERSION_KILL, new File(getCacheDirectory(), "version-kill.txt")); } return cachableResources; } } public static final String NAME = "PCBot"; public static final String NAME_LOWERCASE = NAME.toLowerCase(); private static final OperatingSystem CURRENT_OS; public static boolean RUNNING_FROM_JAR = false; static final URL resource; static { resource = Configuration.class.getClassLoader().getResource(Paths.Resources.VERSION); if (resource != null) { Configuration.RUNNING_FROM_JAR = true; } final String os = System.getProperty("os.name"); if (os.contains("Mac")) { CURRENT_OS = OperatingSystem.MAC; } else if (os.contains("Windows")) { CURRENT_OS = OperatingSystem.WINDOWS; } else if (os.contains("Linux")) { CURRENT_OS = OperatingSystem.LINUX; } else { CURRENT_OS = OperatingSystem.UNKNOWN; } } public static void createDirectories() { final ArrayList<String> dirs = new ArrayList<String>(); dirs.add(Paths.getHomeDirectory()); dirs.add(Paths.getLogsDirectory()); dirs.add(Paths.getCacheDirectory()); dirs.add(Paths.getSettingsDirectory()); dirs.add(Paths.getScriptsDirectory()); dirs.add(Paths.getScriptsSourcesDirectory()); dirs.add(Paths.getScriptsPrecompiledDirectory()); for (final String name : dirs) { final File dir = new File(name); if (!dir.exists()) { dir.mkdirs(); } } } public static void registerLogging() { final Properties logging = new Properties(); final String logFormatter = LogFormatter.class.getCanonicalName(); final String fileHandler = FileHandler.class.getCanonicalName(); logging.setProperty("handlers", TextAreaLogHandler.class.getCanonicalName() + "," + fileHandler); logging.setProperty(".level", "INFO"); logging.setProperty(SystemConsoleHandler.class.getCanonicalName() + ".formatter", logFormatter); logging.setProperty(fileHandler + ".formatter", logFormatter); logging.setProperty(TextAreaLogHandler.class.getCanonicalName() + ".formatter", logFormatter); logging.setProperty(fileHandler + ".pattern", Paths.getLogsDirectory() + File.separator + "%u.%g.log"); logging.setProperty(fileHandler + ".count", "10"); final ByteArrayOutputStream logout = new ByteArrayOutputStream(); try { logging.store(logout, ""); LogManager.getLogManager().readConfiguration(new ByteArrayInputStream(logout.toByteArray())); } catch (final Exception ignored) { } if (Configuration.RUNNING_FROM_JAR) { String path = resource.toString(); try { path = URLDecoder.decode(path, "UTF-8"); } catch (final UnsupportedEncodingException ignored) { } final String prefix = "jar:file:/"; if (path.indexOf(prefix) == 0) { path = path.substring(prefix.length()); path = path.substring(0, path.indexOf('!')); if (File.separatorChar != '/') { path = path.replace('/', File.separatorChar); } try { final File pathfile = new File(Paths.getPathCache()); if (pathfile.exists()) { pathfile.delete(); } pathfile.createNewFile(); final Writer out = new BufferedWriter(new FileWriter(Paths.getPathCache())); out.write(path); out.close(); } catch (final Exception e) { e.printStackTrace(); } } } } public static URL getResourceURL(final String path) throws MalformedURLException { return RUNNING_FROM_JAR ? Configuration.class.getResource("/" + path) : new File(path).toURI().toURL(); } public static Image getImage(final String resource) { try { return Toolkit.getDefaultToolkit().getImage(getResourceURL(resource)); } catch (final Exception e) { } return null; } public static OperatingSystem getCurrentOperatingSystem() { return Configuration.CURRENT_OS; } public static int getVersion() { final URL src; try { src = getResourceURL(Paths.Resources.VERSION); } catch (final MalformedURLException ignored) { return -1; } return Integer.parseInt(IOHelper.readString(src).trim()); } public static String getVersionFormatted() { return StringUtil.formatVersion(getVersion()); } }