Skip to content

Instantly share code, notes, and snippets.

@ducc
Last active March 5, 2016 20:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ducc/b27c09587ad6204d0071 to your computer and use it in GitHub Desktop.
Save ducc/b27c09587ad6204d0071 to your computer and use it in GitHub Desktop.
Consumer based command system

Registering a command

register(new String[] { "test", "t", "ping" }, args -> {
    System.out.println("\nFired! Your args: " + Arrays.toString(args));
});

Running a command

handle("/test these are some of the command arguments!");
import java.util.*;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.function.Consumer;
public class CommandBus {
private final Map<String, List<Consumer<String[]>>> handlers = new HashMap<>();
private final ReadWriteLock lock = new ReentrantReadWriteLock();
public void register(String[] names, Consumer<String[]> consumer) {
lock.writeLock().lock();
try {
List<Consumer<String[]>> list;
if (handlers.containsKey(names)) {
list = handlers.get(names);
} else {
list = new ArrayList<>();
}
list.add(consumer);
for (String name : names) {
handlers.put(name, list);
}
} finally {
lock.writeLock().unlock();
}
}
public void handle(String input) {
if (!input.startsWith("/")) return;
input = input.substring(1);
String[] args = input.split(" ");
String command = args[0];
args = Arrays.copyOfRange(args, 1, args.length);
lock.readLock().lock();
try {
if (!handlers.containsKey(command)) return;
List<Consumer<String[]>> consumers = handlers.get(command);
for (Consumer<String[]> consumer : consumers) {
consumer.accept(args);
}
} finally {
lock.readLock().unlock();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment