From 9e8bf482cb74e85c0f0e809b8a3d8463f0e3a340 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 20 May 2017 10:58:38 -0400 Subject: [PATCH] runelite-client: set default config by default --- .../java/net/runelite/client/RuneLite.java | 12 +- .../config/ConfigInvocationHandler.java | 14 +-- .../runelite/client/config/ConfigManager.java | 103 +++++++++++++++++- .../net/runelite/client/plugins/Plugin.java | 5 - .../client/plugins/config/ConfigPanel.java | 16 +-- .../plugins/opponentinfo/OpponentInfo.java | 1 - 6 files changed, 115 insertions(+), 36 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 9ce6c50be1..dd1cae7ee3 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -77,7 +77,7 @@ public class RuneLite private WSClient wsclient; private AccountSession accountSession; - private ConfigManager configManager = new ConfigManager(eventBus); + private final ConfigManager configManager = new ConfigManager(eventBus); static { @@ -121,6 +121,10 @@ public class RuneLite pluginManager = new PluginManager(this); pluginManager.loadAll(); + // Plugins have registered their config, so set default config + // to main settings + configManager.loadDefault(); + renderer = new OverlayRenderer(); loadSession(); @@ -221,8 +225,7 @@ public class RuneLite { // Initialize config for new session // If the session isn't logged in yet, don't switch to the new config - configManager = new ConfigManager(eventBus, session); - configManager.load(); + configManager.switchSession(session); } eventBus.post(new SessionOpen()); @@ -246,8 +249,7 @@ public class RuneLite accountSession = null; // No more account // Restore config - configManager = new ConfigManager(eventBus); - configManager.load(); + configManager.switchSession(null); eventBus.post(new SessionClose()); } diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java index 9cea084db8..2f004605ec 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigInvocationHandler.java @@ -80,17 +80,13 @@ class ConfigInvocationHandler implements InvocationHandler // Convert value to return type Class returnType = method.getReturnType(); - if (returnType == value.getClass()) + Object objectValue = ConfigManager.stringToObject(value, returnType); + + if (!objectValue.getClass().equals(returnType)) { - return value; + logger.warn("Unable to convert return type for configuration item {}.{}: {}", group.keyName(), item.keyName(), returnType); } - if (returnType == Boolean.class) - { - return Boolean.valueOf(value); - } - - logger.warn("Unknown return type for configuration item {}.{}: {}", group.keyName(), item.keyName(), returnType); return null; } else @@ -121,7 +117,7 @@ class ConfigInvocationHandler implements InvocationHandler } } - private Object callDefaultMethod(Object proxy, Method method, Object[] args) throws Throwable + static Object callDefaultMethod(Object proxy, Method method, Object[] args) throws Throwable { // Call the default method implementation - https://rmannibucau.wordpress.com/2014/03/27/java-8-default-interface-methods-and-jdk-dynamic-proxies/ Constructor constructor = MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class); diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index 24a5ff2810..4631106dcd 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -30,9 +30,13 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; +import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Properties; import java.util.stream.Collectors; @@ -54,11 +58,13 @@ public class ConfigManager private final EventBus eventBus; private AccountSession session; private ConfigClient client; + private File propertiesFile; - private final File propertiesFile; private final ConfigInvocationHandler handler = new ConfigInvocationHandler(this); private final Properties properties = new Properties(); + private final List configProxies = new ArrayList<>(); + public ConfigManager(EventBus eventBus) { this.eventBus = eventBus; @@ -68,10 +74,39 @@ public class ConfigManager public ConfigManager(EventBus eventBus, AccountSession session) { this.eventBus = eventBus; - this.session = session; - // if session username is null then dont.. - this.client = new ConfigClient(session.getUuid()); + switchSession(session); + } + + public Collection getConfigProxies() + { + return Collections.unmodifiableCollection(configProxies); + } + + public void loadDefault() + { + for (Object config : configProxies) + { + setDefaultConfiguration(config); + } + } + + public final void switchSession(AccountSession session) + { + if (session == null) + { + this.session = null; + this.client = null; + } + else + { + this.session = session; + this.client = new ConfigClient(session.getUuid()); + } + this.propertiesFile = getPropertiesFile(); + + load(); // load profile specific config + loadDefault(); // set defaults over anything not set } private File getPropertiesFile() @@ -120,6 +155,8 @@ public class ConfigManager for (ConfigEntry entry : configuration.getConfig()) { + logger.debug("Loading configuration value from client {}: {}", entry.getKey(), entry.getValue()); + properties.setProperty(entry.getKey(), entry.getValue()); } @@ -137,6 +174,8 @@ public class ConfigManager private void loadFromFile() { + properties.clear(); + try (FileInputStream in = new FileInputStream(propertiesFile)) { properties.load(in); @@ -168,10 +207,14 @@ public class ConfigManager throw new RuntimeException("Non-public configuration classes can't have default methods invoked"); } - return (T) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] + T t = (T) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { clazz }, handler); + + configProxies.add(t); + + return t; } public String getConfiguration(String groupName, String key) @@ -269,4 +312,54 @@ public class ConfigManager .collect(Collectors.toList()); return new ConfigDescriptor(group, items); } + + private void setDefaultConfiguration(Object proxy) + { + Class clazz = proxy.getClass().getInterfaces()[0]; + ConfigGroup group = clazz.getAnnotation(ConfigGroup.class); + + if (group == null) + { + return; + } + + for (Method method : clazz.getDeclaredMethods()) + { + ConfigItem item = method.getAnnotation(ConfigItem.class); + + if (item == null || !method.isDefault()) + { + continue; + } + + String current = getConfiguration(group.keyName(), item.keyName()); + if (current != null) + { + continue; // something else is already set + } + + Object defaultValue; + try + { + defaultValue = ConfigInvocationHandler.callDefaultMethod(proxy, method, null); + } + catch (Throwable ex) + { + logger.warn(null, ex); + continue; + } + + logger.debug("Setting default configuration value for {}.{} to {}", group.keyName(), item.keyName(), defaultValue); + setConfiguration(group.keyName(), item.keyName(), defaultValue.toString()); + } + } + + static Object stringToObject(String str, Class type) + { + if (type == boolean.class) + { + return Boolean.parseBoolean(str); + } + return str; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java index 6b4ae68652..60d940fe0c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java @@ -44,11 +44,6 @@ public abstract class Plugin extends AbstractIdleService return overlay != null ? Arrays.asList(overlay) : Collections.EMPTY_LIST; } - public Object getConfig() - { - return null; - } - /** * Override AbstractIdleService's default executor to instead execute in * the main thread. Prevents plugins from all being initialized from diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java index f9fbac101c..2a3db601f5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java @@ -39,8 +39,6 @@ import net.runelite.client.RuneLite; import net.runelite.client.config.ConfigDescriptor; import net.runelite.client.config.ConfigItemDescriptor; import net.runelite.client.config.ConfigManager; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginManager; import net.runelite.client.ui.PluginPanel; import static net.runelite.client.ui.PluginPanel.PANEL_HEIGHT; import static net.runelite.client.ui.PluginPanel.PANEL_WIDTH; @@ -76,16 +74,12 @@ public class ConfigPanel extends PluginPanel private Collection getConfig() { List list = new ArrayList<>(); - PluginManager pm = runelite.getPluginManager(); - for (Plugin plugin : pm.getPlugins()) + for (Object config : runelite.getConfigManager().getConfigProxies()) { - Object config = plugin.getConfig(); - if (config != null) - { - ConfigManager configManager = runelite.getConfigManager(); - ConfigDescriptor configDescriptor = configManager.getConfigDescriptor(config); - list.add(configDescriptor); - } + ConfigManager configManager = runelite.getConfigManager(); + ConfigDescriptor configDescriptor = configManager.getConfigDescriptor(config); + + list.add(configDescriptor); } return list; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java index 1d072d5660..a70e371b93 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java @@ -55,7 +55,6 @@ public class OpponentInfo extends Plugin { } - @Override public OpponentConfig getConfig() { return config;