package net.aufdemrand.denizen.objects;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.aufdemrand.denizencore.objects.*;
import net.aufdemrand.denizencore.objects.properties.Property;
import net.aufdemrand.denizencore.objects.properties.PropertyParser;
import net.aufdemrand.denizencore.tags.Attribute;
import net.aufdemrand.denizencore.tags.TagContext;
import net.aufdemrand.denizencore.utilities.CoreUtilities;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import java.util.HashMap;
public class dPlugin implements dObject {
//////////////////
// Object Fetcher
////////////////
public static dPlugin valueOf(String string) {
return valueOf(string, null);
}
/**
* Gets a dPlugin from a string format.
*
* @param string The plugin in string form. (pl@PluginName)
* @return The dPlugin value. If the string is incorrectly formatted or
* the specified plugin is invalid, this is null.
*/
@Fetchable("pl")
public static dPlugin valueOf(String string, TagContext context) {
if (string == null) {
return null;
}
string = CoreUtilities.toLowerCase(string).replace("pl@", "");
try {
// Attempt to match from plugin list, as PluginManager#getPlugin is case sensitive
for (Plugin plugin : Bukkit.getServer().getPluginManager().getPlugins()) {
if (string.equalsIgnoreCase(plugin.getName())) {
return new dPlugin(plugin);
}
}
}
catch (Exception e) {
dB.echoError("Invalid plugin name specified, or plugin is not enabled: " + string);
}
return null;
}
public static boolean matches(String arg) {
if (CoreUtilities.toLowerCase(arg).startsWith("pl@")) {
return true;
}
for (Plugin plugin : Bukkit.getServer().getPluginManager().getPlugins()) {
if (arg.equalsIgnoreCase(plugin.getName())) {
return true;
}
}
return false;
}
/////////////////////
// Constructors
//////////////////
public dPlugin(Plugin plugin) {
this.plugin = plugin;
}
/////////////////////
// Instance Fields/Methods
/////////////////
private Plugin plugin;
public Plugin getPlugin() {
return plugin;
}
/////////////////////
// dObject Methods
///////////////////
private String prefix = "Plugin";
@Override
public String getObjectType() {
return "Plugin";
}
@Override
public String getPrefix() {
return prefix;
}
@Override
public String debug() {
return String.format("<G>%s='<Y>%s<G>' ", prefix, identify());
}
@Override
public boolean isUnique() {
return true;
}
@Override
public String identify() {
return "pl@" + plugin.getName();
}
@Override
public String identifySimple() {
return identify();
}
@Override
public dPlugin setPrefix(String prefix) {
this.prefix = prefix;
return this;
}
public static void registerTags() {
// <--[tag]
// @attribute <pl@plugin.name>
// @returns Element
// @description
// Gets the name of this plugin.
// -->
registerTag("name", new TagRunnable() {
@Override
public String run(Attribute attribute, dObject object) {
return new Element(((dPlugin) object).plugin.getName())
.getAttribute(attribute.fulfill(1));
}
});
// <--[tag]
// @attribute <pl@plugin.version>
// @returns Element
// @description
// Gets the version for the plugin specified.
// -->
registerTag("version", new TagRunnable() {
@Override
public String run(Attribute attribute, dObject object) {
return new Element(((dPlugin) object).plugin.getDescription().getVersion())
.getAttribute(attribute.fulfill(1));
}
});
// <--[tag]
// @attribute <pl@plugin.description>
// @returns Element
// @description
// Gets the description for the plugin specified.
// -->
registerTag("description", new TagRunnable() {
@Override
public String run(Attribute attribute, dObject object) {
return new Element(((dPlugin) object).plugin.getDescription().getDescription())
.getAttribute(attribute.fulfill(1));
}
});
// <--[tag]
// @attribute <pl@plugin.authors>
// @returns dList
// @description
// Gets the list of authors for the plugin specified.
// -->
registerTag("authors", new TagRunnable() {
@Override
public String run(Attribute attribute, dObject object) {
return new dList(((dPlugin) object).plugin.getDescription().getAuthors())
.getAttribute(attribute.fulfill(1));
}
});
// <--[tag]
// @attribute <pl@plugin.type>
// @returns Element
// @description
// Always returns 'Plugin' for dPlugin objects. All objects fetchable by the Object Fetcher will return the
// type of object that is fulfilling this attribute.
// -->
registerTag("type", new TagRunnable() {
@Override
public String run(Attribute attribute, dObject object) {
return new Element("Plugin").getAttribute(attribute.fulfill(1));
}
});
}
public static HashMap<String, TagRunnable> registeredTags = new HashMap<String, TagRunnable>();
public static void registerTag(String name, TagRunnable runnable) {
if (runnable.name == null) {
runnable.name = name;
}
registeredTags.put(name, runnable);
}
/////////////////
// Attributes
/////////
@Override
public String getAttribute(Attribute attribute) {
if (attribute == null) {
return null;
}
// TODO: Scrap getAttribute, make this functionality a core system
String attrLow = CoreUtilities.toLowerCase(attribute.getAttributeWithoutContext(1));
TagRunnable tr = registeredTags.get(attrLow);
if (tr != null) {
if (!tr.name.equals(attrLow)) {
net.aufdemrand.denizencore.utilities.debugging.dB.echoError(attribute.getScriptEntry() != null ? attribute.getScriptEntry().getResidingQueue() : null,
"Using deprecated form of tag '" + tr.name + "': '" + attrLow + "'.");
}
return tr.run(attribute, this);
}
// Iterate through this object's properties' attributes
for (Property property : PropertyParser.getProperties(this)) {
String returned = property.getAttribute(attribute);
if (returned != null) {
return returned;
}
}
return new Element(identify()).getAttribute(attribute);
}
}