Help command for listing all commands
[kaka/cakelight.git] / src / kaka / cakelight / Console.java
index 422b7a3..76bd6e5 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,9 @@ public class Console extends Thread {
         this.cakelight = cakelight;
        this.config = config;
        reader = new BufferedReader(new InputStreamReader(System.in));
+       register(new HelpCommand());
+       register(TwoColorNoiseMode.getCommand());
+    }
 
     public CakeLight getCakelight() {
        return cakelight;
@@ -30,6 +36,30 @@ public class Console extends Thread {
     public Configuration getConfig() {
        return config;
     }
+
+    private class HelpCommand implements Command {
+       @Override
+       public String[] getNames() {
+           return new String[] {"?", "h", "help"};
+       }
+
+       @Override
+       public void activate(Console console, String[] args) {
+           for (Command c : commandList) {
+               System.out.println(String.join("|", c.getNames()));
+           }
+       }
+    }
+
+    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 +68,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);
@@ -83,5 +125,36 @@ public class Console extends Thread {
     public interface Command {
         String[] getNames();
         void activate(Console console, String[] args);
+
+       default Color parseColor(String s) {
+           switch (s.toLowerCase()) {
+               case "r": return Color.rgb(255, 0, 0);
+               case "g": return Color.rgb(0, 255, 0);
+               case "b": return Color.rgb(0, 0, 255);
+               default: // assume hexadecimal
+                   if (s.startsWith("#")) {
+                       s = s.substring(1);
+                   }
+                   if (s.length() == 3) {
+                       return Color.rgb(
+                               Integer.parseInt(s.substring(0, 1), 16) * 16 + Integer.parseInt(s.substring(0, 1), 16),
+                               Integer.parseInt(s.substring(1, 2), 16) * 16 + Integer.parseInt(s.substring(1, 2), 16),
+                               Integer.parseInt(s.substring(2, 3), 16) * 16 + Integer.parseInt(s.substring(2, 3), 16)
+                       );
+                   } else if (s.length() == 6) {
+                       return Color.rgb(
+                               Integer.parseInt(s.substring(0, 2), 16),
+                               Integer.parseInt(s.substring(2, 4), 16),
+                               Integer.parseInt(s.substring(4, 6), 16)
+                       );
+                   }
+           }
+           System.out.println("Failed to parse color '" + s + "'. Using black instead.");
+           return Color.BLACK;
+       }
+
+       default void output(String text) {
+           System.out.println("(" + text + ")");
+       }
     }
 }