Register and use commands
authorTomas Wenström <tomas.wenstrom@gmail.com>
Mon, 25 Nov 2019 21:56:12 +0000 (22:56 +0100)
committerTomas Wenström <tomas.wenstrom@gmail.com>
Mon, 25 Nov 2019 21:56:12 +0000 (22:56 +0100)
src/kaka/cakelight/Console.java
src/kaka/cakelight/mode/TwoColorNoiseMode.java

index 0b956ae..120d0f4 100644 (file)
@@ -8,11 +8,14 @@ import kaka.cakelight.mode.VideoMode;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.util.*;
 
 public class Console extends Thread {
     private CakeLight cakelight;
     private Configuration config;
     private BufferedReader reader;
+    private Map<String, Command> commands = new HashMap<>();
+    private List<Command> commandList = new ArrayList<>();
 
     public static void start(CakeLight cakelight, Configuration config) {
         new Console(cakelight, config).start();
@@ -22,6 +25,7 @@ public class Console extends Thread {
         this.cakelight = cakelight;
        this.config = config;
        reader = new BufferedReader(new InputStreamReader(System.in));
+       register(TwoColorNoiseMode.getCommand());
 
     public CakeLight getCakelight() {
        return cakelight;
@@ -30,6 +34,16 @@ public class Console extends Thread {
     public Configuration getConfig() {
        return config;
     }
+
+    private void register(Command cmd) {
+       for (String name : cmd.getNames()){
+           if (commands.containsKey(name)) {
+               System.out.println("Command name '" + name + "' is already registered by '" + commands.get(name).getClass() + "'!");
+               System.exit(1);
+           }
+           commands.put(name, cmd);
+       }
+       commandList.add(cmd);
     }
 
     @Override
@@ -38,6 +52,18 @@ public class Console extends Thread {
             System.out.print("> ");
             try {
                 String input = reader.readLine();
+               String[] splitInput = input.split("\\s+", 2);
+               String name = splitInput[0];
+               String[] args = splitInput.length == 2
+                       ? splitInput[1].split("\\s+")
+                       : new String[]{};
+
+               Command cmd = commands.get(name);
+               if (cmd != null) {
+                   cmd.activate(this, args);
+                   continue;
+               }
+
                 if (input.matches("[0-5]")) {
                    cakelight.setMode(new AmbientMode(new String[] {input}));
                    System.out.println("setting ambient mode to " + input);
@@ -110,5 +136,9 @@ public class Console extends Thread {
            System.out.println("Failed to parse color '" + s + "'. Using black instead.");
            return Color.BLACK;
        }
+
+       default void output(String text) {
+           System.out.println("(" + text + ")");
+       }
     }
 }
index 1ebb930..4046cbd 100644 (file)
@@ -11,16 +11,19 @@ public class TwoColorNoiseMode extends AmbientMode {
 
     public static Console.Command getCommand() {
         return new Console.Command() {
+            @Override
             public String[] getNames() {
                 return new String[] {"n", "noise"};
             }
 
+            @Override
             public void activate(Console console, String[] args) {
-                if (args.length == 3) { // cmd + col1 + col2
+                if (args.length == 2) { // col1 + col2
                     console.getCakelight().setMode(new TwoColorNoiseMode(
-                            parseColor(args[1]),
-                            parseColor(args[2])
+                            parseColor(args[0]),
+                            parseColor(args[1])
                     ));
+                    output("setting two-color noise mode");
                 }
             }
         };