From 7af374bd720d2855f363ec137b04ef306f4f68ad Mon Sep 17 00:00:00 2001
From: Mariell Hoversholm <proximyst@proximyst.com>
Date: Sat, 29 Apr 2017 12:03:44 +0200
Subject: [PATCH] Finalised params in methods and implemented commands

---
 src/com/coalesce/bukkitforclojure/Main.java | 31 +++++++++++++++++++--
 1 file changed, 28 insertions(+), 3 deletions(-)

diff --git a/src/com/coalesce/bukkitforclojure/Main.java b/src/com/coalesce/bukkitforclojure/Main.java
index b5543dc..81cc4be 100644
--- a/src/com/coalesce/bukkitforclojure/Main.java
+++ b/src/com/coalesce/bukkitforclojure/Main.java
@@ -2,6 +2,9 @@ package com.coalesce.bukkitforclojure;
 
 import clojure.java.api.Clojure;
 import clojure.lang.IFn;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.PluginCommand;
 import org.bukkit.configuration.file.YamlConfiguration;
 import org.bukkit.event.Event;
 import org.bukkit.event.EventPriority;
@@ -25,6 +28,7 @@ public class Main extends JavaPlugin {
     private final IFn require = Clojure.var("clojure.core", "require");
     private final Map<Class<? extends Event>, Set<IFn>> events = new HashMap<>();
     private final EventExecutor executor = (listener, event) -> fireEvent(event);
+    private final Map<Command, IFn> commands = new HashMap<>();
 
     @Override
     public void onLoad() {
@@ -68,12 +72,12 @@ public class Main extends JavaPlugin {
         }
     }
 
-    public void registerEvent(Class<? extends Event> event, EventPriority priority, IFn method) {
+    public void registerEvent(final Class<? extends Event> event, final EventPriority priority, final IFn method) {
         registerEvent(event, priority, method, false);
     }
 
     @SuppressWarnings({"WeakerAccess", "SameParameterValue"})
-    public void registerEvent(Class<? extends Event> event, EventPriority priority, IFn method, boolean ignoreCancelled) {
+    public void registerEvent(final Class<? extends Event> event, final EventPriority priority, final IFn method, final boolean ignoreCancelled) {
         Set<IFn> methods = events.getOrDefault(event, new HashSet<>());
         methods.add(method);
         events.put(event, methods);
@@ -81,7 +85,7 @@ public class Main extends JavaPlugin {
         }, priority, executor, this, ignoreCancelled);
     }
 
-    private <T extends Event> void fireEvent(T event) {
+    private <T extends Event> void fireEvent(final T event) {
         Set<IFn> methods = events.get(event.getClass());
         if (methods == null) {
             return; // No events have been registered from the plugin, thus no need to fire any.
@@ -89,6 +93,27 @@ public class Main extends JavaPlugin {
         methods.forEach(it -> it.invoke(event));
     }
 
+    public void registerCommand(final String name, final IFn method) {
+        PluginCommand command = getCommand(name);
+        command.setExecutor(this);
+        commands.put(command, method);
+    }
+
+    @Override
+    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
+        IFn command = commands.get(cmd);
+        if (command == null) {
+            return true;
+        }
+        try {
+            command.invoke(sender, command, label, args);
+        } catch (Exception ex) {
+            // Due to clojure having no return statement, this will be kind of the statement.
+            // If the developer expects one, use a try-catch block in Clojure.
+        }
+        return true;
+    }
+
     public static Logger sLogger() {
         return logger;
     }
-- 
GitLab