Skip to content

Commit

Permalink
add tag server.list_plugins_handling_event
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Mar 9, 2019
1 parent 0224083 commit 7809db9
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 9 deletions.
Expand Up @@ -29,7 +29,7 @@

public abstract class BukkitScriptEvent extends ScriptEvent {

public Class<? extends Event> getRegistrationClass(Class<? extends Event> clazz) {
public static Class<? extends Event> getRegistrationClass(Class<? extends Event> clazz) {
try {
clazz.getDeclaredMethod("getHandlerList");
return clazz;
Expand All @@ -42,7 +42,7 @@ public Class<? extends Event> getRegistrationClass(Class<? extends Event> clazz)
}
}

public HandlerList getEventListeners(Class<? extends Event> type) {
public static HandlerList getEventListeners(Class<? extends Event> type) {
try {
Method method = getRegistrationClass(type).getDeclaredMethod("getHandlerList");
method.setAccessible(true);
Expand All @@ -64,7 +64,7 @@ public HandlerList getEventListeners(Class<? extends Event> type) {
}
}

public EventExecutor getExecutor(RegisteredListener listener) {
public static EventExecutor getExecutor(RegisteredListener listener) {
try {
return (EventExecutor) REGISTERED_LISTENER_EXECUTOR_FIELD.get(listener);
}
Expand Down
Expand Up @@ -2,6 +2,7 @@

import net.aufdemrand.denizen.Denizen;
import net.aufdemrand.denizen.Settings;
import net.aufdemrand.denizen.events.BukkitScriptEvent;
import net.aufdemrand.denizen.flags.FlagManager;
import net.aufdemrand.denizen.nms.NMSHandler;
import net.aufdemrand.denizen.npc.traits.AssignmentTrait;
Expand Down Expand Up @@ -43,20 +44,20 @@
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.map.MapCursor;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredListener;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
import org.bukkit.scoreboard.Scoreboard;

import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.*;
import java.util.regex.Pattern;

public class ServerTags {
Expand Down Expand Up @@ -1463,8 +1464,65 @@ else if (attribute.startsWith("port")) {
event.setReplaced(new Element(NMSHandler.getInstance().getPort()).getAttribute(attribute.fulfill(1)));
}

// TODO: Add everything else from Bukkit.getServer().*
// <--[tag]
// @attribute <server.list_plugins_handling_event[<bukkit event>]>
// @returns dList(dPlugin)
// @description
// Returns a list of all plugins that handle a given Bukkit event.
// Can specify by ScriptEvent name ("PlayerBreaksBlock"), or by full Bukkit class name ("org.bukkit.event.block.BlockBreakEvent").
// This is a primarily a dev tool and is not necessarily useful to most players or scripts.
// -->
else if (attribute.matches("list_plugins_handling_event")
&& attribute.hasContext(1)) {
String eventName = attribute.getContext(1);
if (eventName.contains(".")) {
try {
Class clazz = Class.forName(eventName, false, ServerTags.class.getClassLoader());
dList result = getHandlerPluginList(clazz);
if (result != null) {
event.setReplaced(result.getAttribute(attribute.fulfill(1)));
}
}
catch (ClassNotFoundException ex) {
if (!attribute.hasAlternative()) {
dB.echoError(ex);
}
}
}
else {
ScriptEvent scriptEvent = ScriptEvent.eventLookup.get(CoreUtilities.toLowerCase(eventName));
if (scriptEvent instanceof Listener) {
Plugin plugin = DenizenAPI.getCurrentInstance();
for (Class eventClass : plugin.getPluginLoader()
.createRegisteredListeners((Listener) scriptEvent, plugin).keySet()) {
dList result = getHandlerPluginList(eventClass);
// Return results for the first valid match.
if (result != null && result.size() > 0) {
event.setReplaced(result.getAttribute(attribute.fulfill(1)));
return;
}
}
event.setReplaced(new dList().getAttribute(attribute.fulfill(1)));
}
}
}
}

public static dList getHandlerPluginList(Class eventClass) {
if (Event.class.isAssignableFrom(eventClass)) {
HandlerList handlers = BukkitScriptEvent.getEventListeners(eventClass);
if (handlers != null) {
dList result = new dList();
HashSet<String> deduplicationSet = new HashSet<>();
for (RegisteredListener listener : handlers.getRegisteredListeners()) {
if (deduplicationSet.add(listener.getPlugin().getName())) {
result.addObject(new dPlugin(listener.getPlugin()));
}
}
return result;
}
}
return null;
}

public static void adjustServer(Mechanism mechanism) {
Expand Down

0 comments on commit 7809db9

Please sign in to comment.