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(); | |
| } | |
| } | |
| | |
| } |