package io.shockah.skylark.plugin; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.net.URL; import java.util.Collections; import java.util.List; import io.shockah.json.JSONObject; public class Plugin { public final PluginManager manager; public final Info info; public Plugin(PluginManager manager, Info info) { this.manager = manager; this.info = info; } protected void onLoad() { } protected void onUnload() { } protected void onDependencyLoaded(Plugin plugin) { } protected void onDependencyUnloaded(Plugin plugin) { } protected void onAllPluginsLoaded() { } public final JSONObject getConfig() { return manager.app.config.getObjectOrNew(info.packageName()); } public static final class Info { public final JSONObject json; public final URL url; public Info(JSONObject json, URL url) { this.json = json; this.url = url; } public String packageName() { return json.getString("packageName"); } public String baseClass() { return json.getString("baseClass"); } public List<String> dependsOn() { return Collections.unmodifiableList(json.getListOrEmpty("dependsOn").ofStrings()); } public boolean enabledByDefault() { return json.getBool("enabledByDefault", true); } public String name() { return json.containsKey("name") ? json.getString("name") : packageName(); } public String author() { return json.getString("author", null); } public String description() { return json.getString("description", null); } } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public static @interface Dependency { public String value() default ""; } }