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