]> nmode's Git Repositories - signal-cli/commitdiff
Refactor command creation
authorAsamK <asamk@gmx.de>
Fri, 20 Aug 2021 16:42:38 +0000 (18:42 +0200)
committerAsamK <asamk@gmx.de>
Fri, 20 Aug 2021 16:42:38 +0000 (18:42 +0200)
45 files changed:
src/main/java/org/asamk/signal/App.java
src/main/java/org/asamk/signal/commands/AddDeviceCommand.java
src/main/java/org/asamk/signal/commands/BlockCommand.java
src/main/java/org/asamk/signal/commands/CliCommand.java [new file with mode: 0644]
src/main/java/org/asamk/signal/commands/Command.java
src/main/java/org/asamk/signal/commands/Commands.java
src/main/java/org/asamk/signal/commands/DaemonCommand.java
src/main/java/org/asamk/signal/commands/DbusCommand.java
src/main/java/org/asamk/signal/commands/ExtendedDbusCommand.java
src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java
src/main/java/org/asamk/signal/commands/JoinGroupCommand.java
src/main/java/org/asamk/signal/commands/JsonRpcCommand.java
src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java
src/main/java/org/asamk/signal/commands/JsonRpcLocalCommand.java
src/main/java/org/asamk/signal/commands/LinkCommand.java
src/main/java/org/asamk/signal/commands/ListContactsCommand.java
src/main/java/org/asamk/signal/commands/ListDevicesCommand.java
src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java
src/main/java/org/asamk/signal/commands/LocalCommand.java
src/main/java/org/asamk/signal/commands/MultiLocalCommand.java
src/main/java/org/asamk/signal/commands/ProvisioningCommand.java
src/main/java/org/asamk/signal/commands/QuitGroupCommand.java
src/main/java/org/asamk/signal/commands/ReceiveCommand.java
src/main/java/org/asamk/signal/commands/RegisterCommand.java
src/main/java/org/asamk/signal/commands/RegistrationCommand.java
src/main/java/org/asamk/signal/commands/RemoteDeleteCommand.java
src/main/java/org/asamk/signal/commands/RemoveDeviceCommand.java
src/main/java/org/asamk/signal/commands/RemovePinCommand.java
src/main/java/org/asamk/signal/commands/SendCommand.java
src/main/java/org/asamk/signal/commands/SendContactsCommand.java
src/main/java/org/asamk/signal/commands/SendReactionCommand.java
src/main/java/org/asamk/signal/commands/SendSyncRequestCommand.java
src/main/java/org/asamk/signal/commands/SendTypingCommand.java
src/main/java/org/asamk/signal/commands/SetPinCommand.java
src/main/java/org/asamk/signal/commands/TrustCommand.java
src/main/java/org/asamk/signal/commands/UnblockCommand.java
src/main/java/org/asamk/signal/commands/UnregisterCommand.java
src/main/java/org/asamk/signal/commands/UpdateAccountCommand.java
src/main/java/org/asamk/signal/commands/UpdateContactCommand.java
src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java
src/main/java/org/asamk/signal/commands/UpdateProfileCommand.java
src/main/java/org/asamk/signal/commands/UploadStickerPackCommand.java
src/main/java/org/asamk/signal/commands/VerifyCommand.java
src/main/java/org/asamk/signal/commands/VersionCommand.java

index 49172f800c2f9e547373d9c6ed180c17e36a7a07..12227a8eaa0585af296763a689d6ed10d7af4dbd 100644 (file)
@@ -96,7 +96,7 @@ public class App {
                 : new PlainTextWriterImpl(System.out);
 
         var commandKey = ns.getString("command");
                 : new PlainTextWriterImpl(System.out);
 
         var commandKey = ns.getString("command");
-        var command = Commands.getCommand(commandKey, outputWriter);
+        var command = Commands.getCommand(commandKey);
         if (command == null) {
             throw new UserErrorException("Command not implemented!");
         }
         if (command == null) {
             throw new UserErrorException("Command not implemented!");
         }
@@ -111,7 +111,7 @@ public class App {
         final var useDbusSystem = ns.getBoolean("dbus-system");
         if (useDbus || useDbusSystem) {
             // If username is null, it will connect to the default object path
         final var useDbusSystem = ns.getBoolean("dbus-system");
         if (useDbus || useDbusSystem) {
             // If username is null, it will connect to the default object path
-            initDbusClient(command, username, useDbusSystem);
+            initDbusClient(command, username, useDbusSystem, outputWriter);
             return;
         }
 
             return;
         }
 
@@ -142,7 +142,7 @@ public class App {
                 throw new UserErrorException("You cannot specify a username (phone number) when linking");
             }
 
                 throw new UserErrorException("You cannot specify a username (phone number) when linking");
             }
 
-            handleProvisioningCommand((ProvisioningCommand) command, dataPath, serviceEnvironment);
+            handleProvisioningCommand((ProvisioningCommand) command, dataPath, serviceEnvironment, outputWriter);
             return;
         }
 
             return;
         }
 
@@ -150,7 +150,11 @@ public class App {
             var usernames = Manager.getAllLocalUsernames(dataPath);
 
             if (command instanceof MultiLocalCommand) {
             var usernames = Manager.getAllLocalUsernames(dataPath);
 
             if (command instanceof MultiLocalCommand) {
-                handleMultiLocalCommand((MultiLocalCommand) command, dataPath, serviceEnvironment, usernames);
+                handleMultiLocalCommand((MultiLocalCommand) command,
+                        dataPath,
+                        serviceEnvironment,
+                        usernames,
+                        outputWriter);
                 return;
             }
 
                 return;
             }
 
@@ -175,14 +179,17 @@ public class App {
             throw new UserErrorException("Command only works via dbus");
         }
 
             throw new UserErrorException("Command only works via dbus");
         }
 
-        handleLocalCommand((LocalCommand) command, username, dataPath, serviceEnvironment);
+        handleLocalCommand((LocalCommand) command, username, dataPath, serviceEnvironment, outputWriter);
     }
 
     private void handleProvisioningCommand(
     }
 
     private void handleProvisioningCommand(
-            final ProvisioningCommand command, final File dataPath, final ServiceEnvironment serviceEnvironment
+            final ProvisioningCommand command,
+            final File dataPath,
+            final ServiceEnvironment serviceEnvironment,
+            final OutputWriter outputWriter
     ) throws CommandException {
         var pm = ProvisioningManager.init(dataPath, serviceEnvironment, BaseConfig.USER_AGENT);
     ) throws CommandException {
         var pm = ProvisioningManager.init(dataPath, serviceEnvironment, BaseConfig.USER_AGENT);
-        command.handleCommand(ns, pm);
+        command.handleCommand(ns, pm, outputWriter);
     }
 
     private void handleRegistrationCommand(
     }
 
     private void handleRegistrationCommand(
@@ -212,10 +219,11 @@ public class App {
             final LocalCommand command,
             final String username,
             final File dataPath,
             final LocalCommand command,
             final String username,
             final File dataPath,
-            final ServiceEnvironment serviceEnvironment
+            final ServiceEnvironment serviceEnvironment,
+            final OutputWriter outputWriter
     ) throws CommandException {
         try (var m = loadManager(username, dataPath, serviceEnvironment)) {
     ) throws CommandException {
         try (var m = loadManager(username, dataPath, serviceEnvironment)) {
-            command.handleCommand(ns, m);
+            command.handleCommand(ns, m, outputWriter);
         } catch (IOException e) {
             logger.warn("Cleanup failed", e);
         }
         } catch (IOException e) {
             logger.warn("Cleanup failed", e);
         }
@@ -225,7 +233,8 @@ public class App {
             final MultiLocalCommand command,
             final File dataPath,
             final ServiceEnvironment serviceEnvironment,
             final MultiLocalCommand command,
             final File dataPath,
             final ServiceEnvironment serviceEnvironment,
-            final List<String> usernames
+            final List<String> usernames,
+            final OutputWriter outputWriter
     ) throws CommandException {
         final var managers = new ArrayList<Manager>();
         for (String u : usernames) {
     ) throws CommandException {
         final var managers = new ArrayList<Manager>();
         for (String u : usernames) {
@@ -246,7 +255,7 @@ public class App {
             public RegistrationManager getNewRegistrationManager(String username) throws IOException {
                 return RegistrationManager.init(username, dataPath, serviceEnvironment, BaseConfig.USER_AGENT);
             }
             public RegistrationManager getNewRegistrationManager(String username) throws IOException {
                 return RegistrationManager.init(username, dataPath, serviceEnvironment, BaseConfig.USER_AGENT);
             }
-        });
+        }, outputWriter);
 
         for (var m : managers) {
             try {
 
         for (var m : managers) {
             try {
@@ -286,7 +295,7 @@ public class App {
     }
 
     private void initDbusClient(
     }
 
     private void initDbusClient(
-            final Command command, final String username, final boolean systemBus
+            final Command command, final String username, final boolean systemBus, final OutputWriter outputWriter
     ) throws CommandException {
         try {
             DBusConnection.DBusBusType busType;
     ) throws CommandException {
         try {
             DBusConnection.DBusBusType busType;
@@ -300,7 +309,7 @@ public class App {
                         DbusConfig.getObjectPath(username),
                         Signal.class);
 
                         DbusConfig.getObjectPath(username),
                         Signal.class);
 
-                handleCommand(command, ts, dBusConn);
+                handleCommand(command, ts, dBusConn, outputWriter);
             }
         } catch (DBusException | IOException e) {
             logger.error("Dbus client failed", e);
             }
         } catch (DBusException | IOException e) {
             logger.error("Dbus client failed", e);
@@ -308,11 +317,13 @@ public class App {
         }
     }
 
         }
     }
 
-    private void handleCommand(Command command, Signal ts, DBusConnection dBusConn) throws CommandException {
+    private void handleCommand(
+            Command command, Signal ts, DBusConnection dBusConn, OutputWriter outputWriter
+    ) throws CommandException {
         if (command instanceof ExtendedDbusCommand) {
         if (command instanceof ExtendedDbusCommand) {
-            ((ExtendedDbusCommand) command).handleCommand(ns, ts, dBusConn);
+            ((ExtendedDbusCommand) command).handleCommand(ns, ts, dBusConn, outputWriter);
         } else if (command instanceof DbusCommand) {
         } else if (command instanceof DbusCommand) {
-            ((DbusCommand) command).handleCommand(ns, ts);
+            ((DbusCommand) command).handleCommand(ns, ts, outputWriter);
         } else {
             throw new UserErrorException("Command is not yet implemented via dbus");
         }
         } else {
             throw new UserErrorException("Command is not yet implemented via dbus");
         }
index 31b3c7ef66671215e2017cc2d32a16e39da7a2ff..1616a01ff1f01a828d492409c33a1d1a290a2722 100644 (file)
@@ -21,18 +21,23 @@ public class AddDeviceCommand implements JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(AddDeviceCommand.class);
 
 
     private final static Logger logger = LoggerFactory.getLogger(AddDeviceCommand.class);
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public String getName() {
+        return "addDevice";
+    }
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Link another device to this device. Only works, if this is the master device.");
         subparser.addArgument("--uri")
                 .required(true)
                 .help("Specify the uri contained in the QR code shown by the new device.");
     }
 
         subparser.help("Link another device to this device. Only works, if this is the master device.");
         subparser.addArgument("--uri")
                 .required(true)
                 .help("Specify the uri contained in the QR code shown by the new device.");
     }
 
-    public AddDeviceCommand(final OutputWriter outputWriter) {
-    }
-
     @Override
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         try {
             m.addDeviceLink(new URI(ns.getString("uri")));
         } catch (IOException e) {
         try {
             m.addDeviceLink(new URI(ns.getString("uri")));
         } catch (IOException e) {
index 7229c2e1b89ae21a7f40ac8fbb0195666d67bd1e..0710a7e5cb9d8386e6c1779397410ed97f38f4e3 100644 (file)
@@ -19,17 +19,22 @@ public class BlockCommand implements JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(BlockCommand.class);
 
 
     private final static Logger logger = LoggerFactory.getLogger(BlockCommand.class);
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public String getName() {
+        return "block";
+    }
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Block the given contacts or groups (no messages will be received)");
         subparser.addArgument("contact").help("Contact number").nargs("*");
         subparser.addArgument("-g", "--group-id", "--group").help("Group ID").nargs("*");
     }
 
         subparser.help("Block the given contacts or groups (no messages will be received)");
         subparser.addArgument("contact").help("Contact number").nargs("*");
         subparser.addArgument("-g", "--group-id", "--group").help("Group ID").nargs("*");
     }
 
-    public BlockCommand(final OutputWriter outputWriter) {
-    }
-
     @Override
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         for (var contactNumber : ns.<String>getList("contact")) {
             try {
                 m.setContactBlocked(contactNumber, true);
         for (var contactNumber : ns.<String>getList("contact")) {
             try {
                 m.setContactBlocked(contactNumber, true);
diff --git a/src/main/java/org/asamk/signal/commands/CliCommand.java b/src/main/java/org/asamk/signal/commands/CliCommand.java
new file mode 100644 (file)
index 0000000..b5a60d3
--- /dev/null
@@ -0,0 +1,8 @@
+package org.asamk.signal.commands;
+
+import net.sourceforge.argparse4j.inf.Subparser;
+
+public interface CliCommand extends Command {
+
+    void attachToSubparser(Subparser subparser);
+}
index 9d054616f61727d9d4377479c3c4c6d148beed71..2e4c761dedfc29aeb2e8555435ef557340cc863d 100644 (file)
@@ -2,11 +2,13 @@ package org.asamk.signal.commands;
 
 import org.asamk.signal.OutputType;
 
 
 import org.asamk.signal.OutputType;
 
-import java.util.Set;
+import java.util.List;
 
 public interface Command {
 
 
 public interface Command {
 
-    default Set<OutputType> getSupportedOutputTypes() {
-        return Set.of(OutputType.PLAIN_TEXT);
+    String getName();
+
+    default List<OutputType> getSupportedOutputTypes() {
+        return List.of(OutputType.PLAIN_TEXT);
     }
 }
     }
 }
index 33caf8ba3caec1d4fc9a393c1798929aec8d7bc4..d46d6b8bb5531a00810efc85cfaf7d944cf698fd 100644 (file)
@@ -1,74 +1,65 @@
 package org.asamk.signal.commands;
 
 package org.asamk.signal.commands;
 
-import org.asamk.signal.OutputWriter;
-
 import java.util.HashMap;
 import java.util.Map;
 import java.util.TreeMap;
 
 public class Commands {
 
 import java.util.HashMap;
 import java.util.Map;
 import java.util.TreeMap;
 
 public class Commands {
 
-    private static final Map<String, CommandConstructor> commands = new HashMap<>();
+    private static final Map<String, Command> commands = new HashMap<>();
     private static final Map<String, SubparserAttacher> commandSubparserAttacher = new TreeMap<>();
 
     static {
     private static final Map<String, SubparserAttacher> commandSubparserAttacher = new TreeMap<>();
 
     static {
-        addCommand("addDevice", AddDeviceCommand::new, AddDeviceCommand::attachToSubparser);
-        addCommand("block", BlockCommand::new, BlockCommand::attachToSubparser);
-        addCommand("daemon", DaemonCommand::new, DaemonCommand::attachToSubparser);
-        addCommand("getUserStatus", GetUserStatusCommand::new, GetUserStatusCommand::attachToSubparser);
-        addCommand("jsonRpc", JsonRpcDispatcherCommand::new, JsonRpcDispatcherCommand::attachToSubparser);
-        addCommand("link", LinkCommand::new, LinkCommand::attachToSubparser);
-        addCommand("listContacts", ListContactsCommand::new, ListContactsCommand::attachToSubparser);
-        addCommand("listDevices", ListDevicesCommand::new, ListDevicesCommand::attachToSubparser);
-        addCommand("listGroups", ListGroupsCommand::new, ListGroupsCommand::attachToSubparser);
-        addCommand("listIdentities", ListIdentitiesCommand::new, ListIdentitiesCommand::attachToSubparser);
-        addCommand("joinGroup", JoinGroupCommand::new, JoinGroupCommand::attachToSubparser);
-        addCommand("quitGroup", QuitGroupCommand::new, QuitGroupCommand::attachToSubparser);
-        addCommand("receive", ReceiveCommand::new, ReceiveCommand::attachToSubparser);
-        addCommand("register", RegisterCommand::new, RegisterCommand::attachToSubparser);
-        addCommand("removeDevice", RemoveDeviceCommand::new, RemoveDeviceCommand::attachToSubparser);
-        addCommand("remoteDelete", RemoteDeleteCommand::new, RemoteDeleteCommand::attachToSubparser);
-        addCommand("removePin", RemovePinCommand::new, RemovePinCommand::attachToSubparser);
-        addCommand("send", SendCommand::new, SendCommand::attachToSubparser);
-        addCommand("sendContacts", SendContactsCommand::new, SendContactsCommand::attachToSubparser);
-        addCommand("sendReaction", SendReactionCommand::new, SendReactionCommand::attachToSubparser);
-        addCommand("sendSyncRequest", SendSyncRequestCommand::new, SendSyncRequestCommand::attachToSubparser);
-        addCommand("sendTyping", SendTypingCommand::new, SendTypingCommand::attachToSubparser);
-        addCommand("setPin", SetPinCommand::new, SetPinCommand::attachToSubparser);
-        addCommand("trust", TrustCommand::new, TrustCommand::attachToSubparser);
-        addCommand("unblock", UnblockCommand::new, UnblockCommand::attachToSubparser);
-        addCommand("unregister", UnregisterCommand::new, UnregisterCommand::attachToSubparser);
-        addCommand("updateAccount", UpdateAccountCommand::new, UpdateAccountCommand::attachToSubparser);
-        addCommand("updateContact", UpdateContactCommand::new, UpdateContactCommand::attachToSubparser);
-        addCommand("updateGroup", UpdateGroupCommand::new, UpdateGroupCommand::attachToSubparser);
-        addCommand("updateProfile", UpdateProfileCommand::new, UpdateProfileCommand::attachToSubparser);
-        addCommand("uploadStickerPack", UploadStickerPackCommand::new, UploadStickerPackCommand::attachToSubparser);
-        addCommand("verify", VerifyCommand::new, VerifyCommand::attachToSubparser);
-        addCommand("version", VersionCommand::new, null);
+        addCommand(new AddDeviceCommand());
+        addCommand(new BlockCommand());
+        addCommand(new DaemonCommand());
+        addCommand(new GetUserStatusCommand());
+        addCommand(new JoinGroupCommand());
+        addCommand(new JsonRpcDispatcherCommand());
+        addCommand(new LinkCommand());
+        addCommand(new ListContactsCommand());
+        addCommand(new ListDevicesCommand());
+        addCommand(new ListGroupsCommand());
+        addCommand(new ListIdentitiesCommand());
+        addCommand(new QuitGroupCommand());
+        addCommand(new ReceiveCommand());
+        addCommand(new RegisterCommand());
+        addCommand(new RemoveDeviceCommand());
+        addCommand(new RemoteDeleteCommand());
+        addCommand(new RemovePinCommand());
+        addCommand(new SendCommand());
+        addCommand(new SendContactsCommand());
+        addCommand(new SendReactionCommand());
+        addCommand(new SendSyncRequestCommand());
+        addCommand(new SendTypingCommand());
+        addCommand(new SetPinCommand());
+        addCommand(new TrustCommand());
+        addCommand(new UnblockCommand());
+        addCommand(new UnregisterCommand());
+        addCommand(new UpdateAccountCommand());
+        addCommand(new UpdateContactCommand());
+        addCommand(new UpdateGroupCommand());
+        addCommand(new UpdateProfileCommand());
+        addCommand(new UploadStickerPackCommand());
+        addCommand(new VerifyCommand());
+        addCommand(new VersionCommand());
     }
 
     public static Map<String, SubparserAttacher> getCommandSubparserAttachers() {
         return commandSubparserAttacher;
     }
 
     }
 
     public static Map<String, SubparserAttacher> getCommandSubparserAttachers() {
         return commandSubparserAttacher;
     }
 
-    public static Command getCommand(String commandKey, OutputWriter outputWriter) {
+    public static Command getCommand(String commandKey) {
         if (!commands.containsKey(commandKey)) {
             return null;
         }
         if (!commands.containsKey(commandKey)) {
             return null;
         }
-        return commands.get(commandKey).constructCommand(outputWriter);
+        return commands.get(commandKey);
     }
 
     }
 
-    private static void addCommand(
-            String name, CommandConstructor commandConstructor, SubparserAttacher subparserAttacher
-    ) {
-        commands.put(name, commandConstructor);
-        if (subparserAttacher != null) {
-            commandSubparserAttacher.put(name, subparserAttacher);
+    private static void addCommand(Command command) {
+        commands.put(command.getName(), command);
+        if (command instanceof CliCommand) {
+            commandSubparserAttacher.put(command.getName(), ((CliCommand) command)::attachToSubparser);
         }
     }
         }
     }
-
-    private interface CommandConstructor {
-
-        Command constructCommand(OutputWriter outputWriter);
-    }
 }
 }
index 7b6f243d74c24cdc66d6378b3ebd4cd7217c25c9..494892930eec05576c19d616e6e3360bc47fb1ae 100644 (file)
@@ -23,15 +23,19 @@ import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.List;
 
 import java.io.IOException;
 import java.util.List;
-import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 public class DaemonCommand implements MultiLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(DaemonCommand.class);
 import java.util.concurrent.TimeUnit;
 
 public class DaemonCommand implements MultiLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(DaemonCommand.class);
-    private final OutputWriter outputWriter;
 
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public String getName() {
+        return "daemon";
+    }
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Run in daemon mode and provide an experimental dbus interface.");
         subparser.addArgument("--system")
                 .action(Arguments.storeTrue())
         subparser.help("Run in daemon mode and provide an experimental dbus interface.");
         subparser.addArgument("--system")
                 .action(Arguments.storeTrue())
@@ -41,17 +45,15 @@ public class DaemonCommand implements MultiLocalCommand {
                 .action(Arguments.storeTrue());
     }
 
                 .action(Arguments.storeTrue());
     }
 
-    public DaemonCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
-    }
-
     @Override
     @Override
-    public Set<OutputType> getSupportedOutputTypes() {
-        return Set.of(OutputType.PLAIN_TEXT, OutputType.JSON);
+    public List<OutputType> getSupportedOutputTypes() {
+        return List.of(OutputType.PLAIN_TEXT, OutputType.JSON);
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         boolean ignoreAttachments = ns.getBoolean("ignore-attachments");
 
         DBusConnection.DBusBusType busType;
         boolean ignoreAttachments = ns.getBoolean("ignore-attachments");
 
         DBusConnection.DBusBusType busType;
@@ -63,7 +65,7 @@ public class DaemonCommand implements MultiLocalCommand {
 
         try (var conn = DBusConnection.getConnection(busType)) {
             var objectPath = DbusConfig.getObjectPath();
 
         try (var conn = DBusConnection.getConnection(busType)) {
             var objectPath = DbusConfig.getObjectPath();
-            var t = run(conn, objectPath, m, ignoreAttachments);
+            var t = run(conn, objectPath, m, outputWriter, ignoreAttachments);
 
             conn.requestBusName(DbusConfig.getBusname());
 
 
             conn.requestBusName(DbusConfig.getBusname());
 
@@ -79,7 +81,7 @@ public class DaemonCommand implements MultiLocalCommand {
 
     @Override
     public void handleCommand(
 
     @Override
     public void handleCommand(
-            final Namespace ns, final List<Manager> managers, SignalCreator c
+            final Namespace ns, final List<Manager> managers, final SignalCreator c, final OutputWriter outputWriter
     ) throws CommandException {
         boolean ignoreAttachments = ns.getBoolean("ignore-attachments");
 
     ) throws CommandException {
         boolean ignoreAttachments = ns.getBoolean("ignore-attachments");
 
@@ -94,7 +96,7 @@ public class DaemonCommand implements MultiLocalCommand {
             final var signalControl = new DbusSignalControlImpl(c, m -> {
                 try {
                     final var objectPath = DbusConfig.getObjectPath(m.getUsername());
             final var signalControl = new DbusSignalControlImpl(c, m -> {
                 try {
                     final var objectPath = DbusConfig.getObjectPath(m.getUsername());
-                    return run(conn, objectPath, m, ignoreAttachments);
+                    return run(conn, objectPath, m, outputWriter, ignoreAttachments);
                 } catch (DBusException e) {
                     logger.error("Failed to export object", e);
                     return null;
                 } catch (DBusException e) {
                     logger.error("Failed to export object", e);
                     return null;
@@ -116,7 +118,7 @@ public class DaemonCommand implements MultiLocalCommand {
     }
 
     private Thread run(
     }
 
     private Thread run(
-            DBusConnection conn, String objectPath, Manager m, boolean ignoreAttachments
+            DBusConnection conn, String objectPath, Manager m, OutputWriter outputWriter, boolean ignoreAttachments
     ) throws DBusException {
         conn.exportObject(new DbusSignalImpl(m, objectPath));
 
     ) throws DBusException {
         conn.exportObject(new DbusSignalImpl(m, objectPath));
 
index 1a949c81b3b02d47dafcb3646d58a31b0b0a4ad9..9f676a39f69399aef909842e605cdd4b32953650 100644 (file)
@@ -3,15 +3,18 @@ package org.asamk.signal.commands;
 import net.sourceforge.argparse4j.inf.Namespace;
 
 import org.asamk.Signal;
 import net.sourceforge.argparse4j.inf.Namespace;
 
 import org.asamk.Signal;
+import org.asamk.signal.OutputWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.dbus.DbusSignalImpl;
 import org.asamk.signal.manager.Manager;
 
 public interface DbusCommand extends LocalCommand {
 
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.dbus.DbusSignalImpl;
 import org.asamk.signal.manager.Manager;
 
 public interface DbusCommand extends LocalCommand {
 
-    void handleCommand(Namespace ns, Signal signal) throws CommandException;
+    void handleCommand(Namespace ns, Signal signal, OutputWriter outputWriter) throws CommandException;
 
 
-    default void handleCommand(final Namespace ns, final Manager m) throws CommandException {
-        handleCommand(ns, new DbusSignalImpl(m, null));
+    default void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
+        handleCommand(ns, new DbusSignalImpl(m, null), outputWriter);
     }
 }
     }
 }
index 1d454f4de9ad74be3cd61234d1148711a649e697..444e4cb6f2750421a636c17a5e855ab396387bf5 100644 (file)
@@ -3,10 +3,13 @@ package org.asamk.signal.commands;
 import net.sourceforge.argparse4j.inf.Namespace;
 
 import org.asamk.Signal;
 import net.sourceforge.argparse4j.inf.Namespace;
 
 import org.asamk.Signal;
+import org.asamk.signal.OutputWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.freedesktop.dbus.connections.impl.DBusConnection;
 
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.freedesktop.dbus.connections.impl.DBusConnection;
 
-public interface ExtendedDbusCommand extends Command {
+public interface ExtendedDbusCommand extends CliCommand {
 
 
-    void handleCommand(Namespace ns, Signal signal, DBusConnection dbusconnection) throws CommandException;
+    void handleCommand(
+            Namespace ns, Signal signal, DBusConnection dbusconnection, final OutputWriter outputWriter
+    ) throws CommandException;
 }
 }
index 91e6e47cfad1fca658c2c7a08db1d52977d75260..05bbea478696558c848dc31324806322bdd22de0 100644 (file)
@@ -20,19 +20,22 @@ import java.util.stream.Collectors;
 public class GetUserStatusCommand implements JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(GetUserStatusCommand.class);
 public class GetUserStatusCommand implements JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(GetUserStatusCommand.class);
-    private final OutputWriter outputWriter;
 
 
-    public static void attachToSubparser(final Subparser subparser) {
-        subparser.help("Check if the specified phone number/s have been registered");
-        subparser.addArgument("number").help("Phone number").nargs("+");
+    @Override
+    public String getName() {
+        return "getUserStatus";
     }
 
     }
 
-    public GetUserStatusCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
+        subparser.help("Check if the specified phone number/s have been registered");
+        subparser.addArgument("number").help("Phone number").nargs("+");
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         // Get a map of registration statuses
         Map<String, Boolean> registered;
         try {
         // Get a map of registration statuses
         Map<String, Boolean> registered;
         try {
index e5a872e07544e697c3081ed20a8d6e5e1984fad2..543d9cc7b64a5c064dd1be1b0ba53dedb2df54f6 100644 (file)
@@ -23,19 +23,21 @@ import static org.asamk.signal.util.ErrorUtils.handleSendMessageResults;
 
 public class JoinGroupCommand implements JsonRpcLocalCommand {
 
 
 public class JoinGroupCommand implements JsonRpcLocalCommand {
 
-    private final OutputWriter outputWriter;
-
-    public JoinGroupCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "joinGroup";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Join a group via an invitation link.");
         subparser.addArgument("--uri").required(true).help("Specify the uri with the group invitation link.");
     }
 
     @Override
         subparser.help("Join a group via an invitation link.");
         subparser.addArgument("--uri").required(true).help("Specify the uri with the group invitation link.");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         final GroupInviteLinkUrl linkUrl;
         var uri = ns.getString("uri");
         try {
         final GroupInviteLinkUrl linkUrl;
         var uri = ns.getString("uri");
         try {
index 394b0f8bdc8fc8c3e425b35d4d2899063e634259..940a89daa1ab5d076843c6246c526b9e8c9e1b11 100644 (file)
@@ -3,10 +3,11 @@ package org.asamk.signal.commands;
 import com.fasterxml.jackson.core.type.TypeReference;
 
 import org.asamk.signal.OutputType;
 import com.fasterxml.jackson.core.type.TypeReference;
 
 import org.asamk.signal.OutputType;
+import org.asamk.signal.OutputWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
 
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
 
-import java.util.Set;
+import java.util.List;
 
 public interface JsonRpcCommand<T> extends Command {
 
 
 public interface JsonRpcCommand<T> extends Command {
 
@@ -14,9 +15,9 @@ public interface JsonRpcCommand<T> extends Command {
         return null;
     }
 
         return null;
     }
 
-    void handleCommand(T request, Manager m) throws CommandException;
+    void handleCommand(T request, Manager m, OutputWriter outputWriter) throws CommandException;
 
 
-    default Set<OutputType> getSupportedOutputTypes() {
-        return Set.of(OutputType.JSON);
+    default List<OutputType> getSupportedOutputTypes() {
+        return List.of(OutputType.JSON);
     }
 }
     }
 }
index 4ca906285f5e252c6abaa6350aedd362f6d929ba..6b5361e5b7943251956fdf0171219de4af321c14 100644 (file)
@@ -31,8 +31,8 @@ import org.slf4j.LoggerFactory;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 public class JsonRpcDispatcherCommand implements LocalCommand {
 import java.util.concurrent.TimeUnit;
 
 public class JsonRpcDispatcherCommand implements LocalCommand {
@@ -43,26 +43,28 @@ public class JsonRpcDispatcherCommand implements LocalCommand {
     private static final int IO_ERROR = -3;
     private static final int UNTRUSTED_KEY_ERROR = -4;
 
     private static final int IO_ERROR = -3;
     private static final int UNTRUSTED_KEY_ERROR = -4;
 
-    private final OutputWriter outputWriter;
+    @Override
+    public String getName() {
+        return "jsonRpc";
+    }
 
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Take commands from standard input as line-delimited JSON RPC while receiving messages.");
         subparser.addArgument("--ignore-attachments")
                 .help("Don’t download attachments of received messages.")
                 .action(Arguments.storeTrue());
     }
 
         subparser.help("Take commands from standard input as line-delimited JSON RPC while receiving messages.");
         subparser.addArgument("--ignore-attachments")
                 .help("Don’t download attachments of received messages.")
                 .action(Arguments.storeTrue());
     }
 
-    public JsonRpcDispatcherCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
-    }
-
     @Override
     @Override
-    public Set<OutputType> getSupportedOutputTypes() {
-        return Set.of(OutputType.JSON);
+    public List<OutputType> getSupportedOutputTypes() {
+        return List.of(OutputType.JSON);
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         final boolean ignoreAttachments = ns.getBoolean("ignore-attachments");
 
         final var objectMapper = Util.createJsonObjectMapper();
         final boolean ignoreAttachments = ns.getBoolean("ignore-attachments");
 
         final var objectMapper = Util.createJsonObjectMapper();
@@ -104,7 +106,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand {
             result[0] = s;
         };
 
             result[0] = s;
         };
 
-        var command = Commands.getCommand(method, commandOutputWriter);
+        var command = Commands.getCommand(method);
         if (!(command instanceof JsonRpcCommand)) {
             throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.METHOD_NOT_FOUND,
                     "Method not implemented",
         if (!(command instanceof JsonRpcCommand)) {
             throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.METHOD_NOT_FOUND,
                     "Method not implemented",
@@ -112,7 +114,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand {
         }
 
         try {
         }
 
         try {
-            parseParamsAndRunCommand(m, objectMapper, params, (JsonRpcCommand<?>) command);
+            parseParamsAndRunCommand(m, objectMapper, params, commandOutputWriter, (JsonRpcCommand<?>) command);
         } catch (JsonMappingException e) {
             throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_REQUEST,
                     e.getMessage(),
         } catch (JsonMappingException e) {
             throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_REQUEST,
                     e.getMessage(),
@@ -135,7 +137,11 @@ public class JsonRpcDispatcherCommand implements LocalCommand {
     }
 
     private <T> void parseParamsAndRunCommand(
     }
 
     private <T> void parseParamsAndRunCommand(
-            final Manager m, final ObjectMapper objectMapper, final TreeNode params, final JsonRpcCommand<T> command
+            final Manager m,
+            final ObjectMapper objectMapper,
+            final TreeNode params,
+            final OutputWriter outputWriter,
+            final JsonRpcCommand<T> command
     ) throws CommandException, JsonMappingException {
         T requestParams = null;
         final var requestType = command.getRequestType();
     ) throws CommandException, JsonMappingException {
         T requestParams = null;
         final var requestType = command.getRequestType();
@@ -148,7 +154,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand {
                 throw new AssertionError(e);
             }
         }
                 throw new AssertionError(e);
             }
         }
-        command.handleCommand(requestParams, m);
+        command.handleCommand(requestParams, m, outputWriter);
     }
 
     private Thread receiveMessages(
     }
 
     private Thread receiveMessages(
index abe4e74db4dbc57194e90af11eadc69810825053..06124ffd4ae85561e4d85079a23079d292648d44 100644 (file)
@@ -5,13 +5,13 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import net.sourceforge.argparse4j.inf.Namespace;
 
 import org.asamk.signal.OutputType;
 import net.sourceforge.argparse4j.inf.Namespace;
 
 import org.asamk.signal.OutputType;
+import org.asamk.signal.OutputWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.util.Util;
 
 import java.util.List;
 import java.util.Map;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.util.Util;
 
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 public interface JsonRpcLocalCommand extends JsonRpcCommand<Map<String, Object>>, LocalCommand {
 
 
 public interface JsonRpcLocalCommand extends JsonRpcCommand<Map<String, Object>>, LocalCommand {
 
@@ -20,13 +20,15 @@ public interface JsonRpcLocalCommand extends JsonRpcCommand<Map<String, Object>>
         };
     }
 
         };
     }
 
-    default void handleCommand(Map<String, Object> request, Manager m) throws CommandException {
+    default void handleCommand(
+            Map<String, Object> request, Manager m, OutputWriter outputWriter
+    ) throws CommandException {
         Namespace commandNamespace = new JsonRpcNamespace(request == null ? Map.of() : request);
         Namespace commandNamespace = new JsonRpcNamespace(request == null ? Map.of() : request);
-        handleCommand(commandNamespace, m);
+        handleCommand(commandNamespace, m, outputWriter);
     }
 
     }
 
-    default Set<OutputType> getSupportedOutputTypes() {
-        return Set.of(OutputType.PLAIN_TEXT, OutputType.JSON);
+    default List<OutputType> getSupportedOutputTypes() {
+        return List.of(OutputType.PLAIN_TEXT, OutputType.JSON);
     }
 
     /**
     }
 
     /**
index f117436c913874f247cb4b1267749ab7b0a134c8..9fcaf04d03b93f01bb3713c40f89a88932a371fe 100644 (file)
@@ -19,19 +19,22 @@ import java.util.concurrent.TimeoutException;
 public class LinkCommand implements ProvisioningCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(LinkCommand.class);
 public class LinkCommand implements ProvisioningCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(LinkCommand.class);
-    private final OutputWriter outputWriter;
 
 
-    public LinkCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "link";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Link to an existing device, instead of registering a new number.");
         subparser.addArgument("-n", "--name").help("Specify a name to describe this new device.");
     }
 
     @Override
         subparser.help("Link to an existing device, instead of registering a new number.");
         subparser.addArgument("-n", "--name").help("Specify a name to describe this new device.");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final ProvisioningManager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final ProvisioningManager m, final OutputWriter outputWriter
+    ) throws CommandException {
         final var writer = (PlainTextWriter) outputWriter;
 
         var deviceName = ns.getString("name");
         final var writer = (PlainTextWriter) outputWriter;
 
         var deviceName = ns.getString("name");
index f9a5e0c2de6da5d572a7f004b74d4b1cc6aced11..aaf0e0b3f378f0394ccf7986fa6a1688a0ac50e3 100644 (file)
@@ -11,18 +11,18 @@ import static org.asamk.signal.util.Util.getLegacyIdentifier;
 
 public class ListContactsCommand implements LocalCommand {
 
 
 public class ListContactsCommand implements LocalCommand {
 
-    private final OutputWriter outputWriter;
-
-    public ListContactsCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "listContacts";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Show a list of known contacts with names.");
     }
 
     @Override
         subparser.help("Show a list of known contacts with names.");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) {
+    public void handleCommand(final Namespace ns, final Manager m, final OutputWriter outputWriter) {
         final var writer = (PlainTextWriter) outputWriter;
 
         var contacts = m.getContacts();
         final var writer = (PlainTextWriter) outputWriter;
 
         var contacts = m.getContacts();
index cb2019e24c02b68aa18833c76c5c0ac4a843d3a9..16f602f1b490316e01888467b69ada0cb53625ee 100644 (file)
@@ -19,18 +19,21 @@ import java.util.List;
 public class ListDevicesCommand implements LocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(ListDevicesCommand.class);
 public class ListDevicesCommand implements LocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(ListDevicesCommand.class);
-    private final OutputWriter outputWriter;
 
 
-    public ListDevicesCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "listDevices";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Show a list of linked devices.");
     }
 
     @Override
         subparser.help("Show a list of linked devices.");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         final var writer = (PlainTextWriter) outputWriter;
 
         List<Device> devices;
         final var writer = (PlainTextWriter) outputWriter;
 
         List<Device> devices;
index e9da8099ee7c483f4ca45f16a213d08694abc461..b912263f595ce54cc5b68aeeec6b382ed0629ba2 100644 (file)
@@ -22,7 +22,13 @@ public class ListGroupsCommand implements JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(ListGroupsCommand.class);
 
 
     private final static Logger logger = LoggerFactory.getLogger(ListGroupsCommand.class);
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public String getName() {
+        return "listGroups";
+    }
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("List group information including names, ids, active status, blocked status and members");
         subparser.addArgument("-d", "--detailed")
                 .action(Arguments.storeTrue())
         subparser.help("List group information including names, ids, active status, blocked status and members");
         subparser.addArgument("-d", "--detailed")
                 .action(Arguments.storeTrue())
@@ -63,14 +69,10 @@ public class ListGroupsCommand implements JsonRpcLocalCommand {
         }
     }
 
         }
     }
 
-    private final OutputWriter outputWriter;
-
-    public ListGroupsCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
-    }
-
     @Override
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         final var groups = m.getGroups();
 
         if (outputWriter instanceof JsonWriter) {
         final var groups = m.getGroups();
 
         if (outputWriter instanceof JsonWriter) {
index 2b0b1f96a4948aad90ca6ab6a5276dc2e6e7f9aa..f996f3b5633bd029786d39c5d59ac1ebf0ca2934 100644 (file)
@@ -21,10 +21,10 @@ import java.util.List;
 public class ListIdentitiesCommand implements LocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(ListIdentitiesCommand.class);
 public class ListIdentitiesCommand implements LocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(ListIdentitiesCommand.class);
-    private final OutputWriter outputWriter;
 
 
-    public ListIdentitiesCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "listIdentities";
     }
 
     private static void printIdentityFingerprint(PlainTextWriter writer, Manager m, IdentityInfo theirId) {
     }
 
     private static void printIdentityFingerprint(PlainTextWriter writer, Manager m, IdentityInfo theirId) {
@@ -38,13 +38,16 @@ public class ListIdentitiesCommand implements LocalCommand {
                 digits);
     }
 
                 digits);
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("List all known identity keys and their trust status, fingerprint and safety number.");
         subparser.addArgument("-n", "--number").help("Only show identity keys for the given phone number.");
     }
 
     @Override
         subparser.help("List all known identity keys and their trust status, fingerprint and safety number.");
         subparser.addArgument("-n", "--number").help("Only show identity keys for the given phone number.");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         final var writer = (PlainTextWriter) outputWriter;
 
         var number = ns.getString("number");
         final var writer = (PlainTextWriter) outputWriter;
 
         var number = ns.getString("number");
index a7c64dc131af7da3f96134e52bc98942a281b737..b0e9906bcb1cfad8fe48221dfe2edd4f1de8e176 100644 (file)
@@ -2,10 +2,11 @@ package org.asamk.signal.commands;
 
 import net.sourceforge.argparse4j.inf.Namespace;
 
 
 import net.sourceforge.argparse4j.inf.Namespace;
 
+import org.asamk.signal.OutputWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
 
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
 
-public interface LocalCommand extends Command {
+public interface LocalCommand extends CliCommand {
 
 
-    void handleCommand(Namespace ns, Manager m) throws CommandException;
+    void handleCommand(Namespace ns, Manager m, OutputWriter outputWriter) throws CommandException;
 }
 }
index 58416e50cb574e9288c365f7c23e04d47342d1d4..1c01a6aec994d9678db214b71c56a408c068ad13 100644 (file)
@@ -2,6 +2,7 @@ package org.asamk.signal.commands;
 
 import net.sourceforge.argparse4j.inf.Namespace;
 
 
 import net.sourceforge.argparse4j.inf.Namespace;
 
+import org.asamk.signal.OutputWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
 
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
 
@@ -9,10 +10,14 @@ import java.util.List;
 
 public interface MultiLocalCommand extends LocalCommand {
 
 
 public interface MultiLocalCommand extends LocalCommand {
 
-    void handleCommand(Namespace ns, List<Manager> m, final SignalCreator c) throws CommandException;
+    void handleCommand(
+            Namespace ns, List<Manager> m, SignalCreator c, OutputWriter outputWriter
+    ) throws CommandException;
 
     @Override
 
     @Override
-    default void handleCommand(final Namespace ns, final Manager m) throws CommandException {
-        handleCommand(ns, List.of(m), null);
+    default void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
+        handleCommand(ns, List.of(m), null, outputWriter);
     }
 }
     }
 }
index 354e4af38eadb693ae36d848dc3c39d728519707..df68de598e099e8c9d66f85a9aef1893414e9de9 100644 (file)
@@ -2,10 +2,11 @@ package org.asamk.signal.commands;
 
 import net.sourceforge.argparse4j.inf.Namespace;
 
 
 import net.sourceforge.argparse4j.inf.Namespace;
 
+import org.asamk.signal.OutputWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.ProvisioningManager;
 
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.ProvisioningManager;
 
-public interface ProvisioningCommand extends Command {
+public interface ProvisioningCommand extends CliCommand {
 
 
-    void handleCommand(Namespace ns, ProvisioningManager m) throws CommandException;
+    void handleCommand(Namespace ns, ProvisioningManager m, final OutputWriter outputWriter) throws CommandException;
 }
 }
index af5d600c62df728dc82233c117e52b728ce643b0..c5c7472c4ff8db44c7bd483662043a2e49771535 100644 (file)
@@ -31,13 +31,14 @@ import static org.asamk.signal.util.ErrorUtils.handleSendMessageResults;
 public class QuitGroupCommand implements JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(QuitGroupCommand.class);
 public class QuitGroupCommand implements JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(QuitGroupCommand.class);
-    private final OutputWriter outputWriter;
 
 
-    public QuitGroupCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "quitGroup";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Send a quit group message to all group members and remove self from member list.");
         subparser.addArgument("-g", "--group-id", "--group").required(true).help("Specify the recipient group ID.");
         subparser.addArgument("--delete")
         subparser.help("Send a quit group message to all group members and remove self from member list.");
         subparser.addArgument("-g", "--group-id", "--group").required(true).help("Specify the recipient group ID.");
         subparser.addArgument("--delete")
@@ -49,7 +50,9 @@ public class QuitGroupCommand implements JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         final GroupId groupId;
         try {
             groupId = Util.decodeGroupId(ns.getString("group-id"));
         final GroupId groupId;
         try {
             groupId = Util.decodeGroupId(ns.getString("group-id"));
@@ -64,7 +67,7 @@ public class QuitGroupCommand implements JsonRpcLocalCommand {
                 final var results = m.sendQuitGroupMessage(groupId,
                         groupAdmins == null ? Set.of() : new HashSet<>(groupAdmins));
                 final var timestamp = results.first();
                 final var results = m.sendQuitGroupMessage(groupId,
                         groupAdmins == null ? Set.of() : new HashSet<>(groupAdmins));
                 final var timestamp = results.first();
-                outputResult(timestamp);
+                outputResult(outputWriter, timestamp);
                 handleSendMessageResults(results.second());
             } catch (NotAGroupMemberException e) {
                 logger.info("User is not a group member");
                 handleSendMessageResults(results.second());
             } catch (NotAGroupMemberException e) {
                 logger.info("User is not a group member");
@@ -84,7 +87,7 @@ public class QuitGroupCommand implements JsonRpcLocalCommand {
         }
     }
 
         }
     }
 
-    private void outputResult(final long timestamp) {
+    private void outputResult(final OutputWriter outputWriter, final long timestamp) {
         if (outputWriter instanceof PlainTextWriter) {
             final var writer = (PlainTextWriter) outputWriter;
             writer.println("{}", timestamp);
         if (outputWriter instanceof PlainTextWriter) {
             final var writer = (PlainTextWriter) outputWriter;
             writer.println("{}", timestamp);
index c71225e07456d76d8e8148aaf0c83a8234b003f5..82bd5d8f274f5c2f21d9173d02dc08ada8ced7c7 100644 (file)
@@ -24,16 +24,21 @@ import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.Base64;
 
 import java.io.IOException;
 import java.util.Base64;
+import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 public class ReceiveCommand implements ExtendedDbusCommand, LocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(ReceiveCommand.class);
 import java.util.concurrent.TimeUnit;
 
 public class ReceiveCommand implements ExtendedDbusCommand, LocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(ReceiveCommand.class);
-    private final OutputWriter outputWriter;
 
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public String getName() {
+        return "receive";
+    }
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Query the server for new messages.");
         subparser.addArgument("-t", "--timeout")
                 .type(double.class)
         subparser.help("Query the server for new messages.");
         subparser.addArgument("-t", "--timeout")
                 .type(double.class)
@@ -44,17 +49,13 @@ public class ReceiveCommand implements ExtendedDbusCommand, LocalCommand {
                 .action(Arguments.storeTrue());
     }
 
                 .action(Arguments.storeTrue());
     }
 
-    public ReceiveCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
-    }
-
     @Override
     @Override
-    public Set<OutputType> getSupportedOutputTypes() {
-        return Set.of(OutputType.PLAIN_TEXT, OutputType.JSON);
+    public List<OutputType> getSupportedOutputTypes() {
+        return List.of(OutputType.PLAIN_TEXT, OutputType.JSON);
     }
 
     public void handleCommand(
     }
 
     public void handleCommand(
-            final Namespace ns, final Signal signal, DBusConnection dbusconnection
+            final Namespace ns, final Signal signal, DBusConnection dbusconnection, final OutputWriter outputWriter
     ) throws CommandException {
         try {
             if (outputWriter instanceof JsonWriter) {
     ) throws CommandException {
         try {
             if (outputWriter instanceof JsonWriter) {
@@ -137,7 +138,9 @@ public class ReceiveCommand implements ExtendedDbusCommand, LocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         double timeout = ns.getDouble("timeout");
         var returnOnTimeout = true;
         if (timeout < 0) {
         double timeout = ns.getDouble("timeout");
         var returnOnTimeout = true;
         if (timeout < 0) {
index cd23c8abf0eff0ee7ea222c635b488da62e2f099..dad692d213b35516c6954a0f7008a845404bd836 100644 (file)
@@ -4,7 +4,6 @@ import net.sourceforge.argparse4j.impl.Arguments;
 import net.sourceforge.argparse4j.inf.Namespace;
 import net.sourceforge.argparse4j.inf.Subparser;
 
 import net.sourceforge.argparse4j.inf.Namespace;
 import net.sourceforge.argparse4j.inf.Subparser;
 
-import org.asamk.signal.OutputWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.commands.exceptions.IOErrorException;
 import org.asamk.signal.commands.exceptions.UserErrorException;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.commands.exceptions.IOErrorException;
 import org.asamk.signal.commands.exceptions.UserErrorException;
@@ -15,10 +14,13 @@ import java.io.IOException;
 
 public class RegisterCommand implements RegistrationCommand {
 
 
 public class RegisterCommand implements RegistrationCommand {
 
-    public RegisterCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "register";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Register a phone number with SMS or voice verification.");
         subparser.addArgument("-v", "--voice")
                 .help("The verification should be done over voice, not SMS.")
         subparser.help("Register a phone number with SMS or voice verification.");
         subparser.addArgument("-v", "--voice")
                 .help("The verification should be done over voice, not SMS.")
index 425ac71d2feac71676deaa43e22ede4403464d48..ce81845c83f5c0f69f7132778324ba6077df12a2 100644 (file)
@@ -5,7 +5,7 @@ import net.sourceforge.argparse4j.inf.Namespace;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.RegistrationManager;
 
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.RegistrationManager;
 
-public interface RegistrationCommand extends Command {
+public interface RegistrationCommand extends CliCommand {
 
     void handleCommand(Namespace ns, RegistrationManager m) throws CommandException;
 }
 
     void handleCommand(Namespace ns, RegistrationManager m) throws CommandException;
 }
index 37c55fe7c243a28b4623caa9452171acbba4d3fe..991004079465850fe3c50ecc79073b01e7230a4e 100644 (file)
@@ -22,13 +22,13 @@ import java.util.Map;
 
 public class RemoteDeleteCommand implements DbusCommand, JsonRpcLocalCommand {
 
 
 public class RemoteDeleteCommand implements DbusCommand, JsonRpcLocalCommand {
 
-    private final OutputWriter outputWriter;
-
-    public RemoteDeleteCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "remoteDelete";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Remotely delete a previously sent message.");
         subparser.addArgument("-t", "--target-timestamp")
                 .required(true)
         subparser.help("Remotely delete a previously sent message.");
         subparser.addArgument("-t", "--target-timestamp")
                 .required(true)
@@ -39,7 +39,9 @@ public class RemoteDeleteCommand implements DbusCommand, JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Signal signal) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Signal signal, final OutputWriter outputWriter
+    ) throws CommandException {
         final List<String> recipients = ns.getList("recipient");
         final var groupIdString = ns.getString("group-id");
 
         final List<String> recipients = ns.getList("recipient");
         final var groupIdString = ns.getString("group-id");
 
@@ -69,7 +71,7 @@ public class RemoteDeleteCommand implements DbusCommand, JsonRpcLocalCommand {
             } else {
                 timestamp = signal.sendRemoteDeleteMessage(targetTimestamp, recipients);
             }
             } else {
                 timestamp = signal.sendRemoteDeleteMessage(targetTimestamp, recipients);
             }
-            outputResult(timestamp);
+            outputResult(outputWriter, timestamp);
         } catch (UnknownObject e) {
             throw new UserErrorException("Failed to find dbus object, maybe missing the -u flag: " + e.getMessage());
         } catch (Signal.Error.InvalidNumber e) {
         } catch (UnknownObject e) {
             throw new UserErrorException("Failed to find dbus object, maybe missing the -u flag: " + e.getMessage());
         } catch (Signal.Error.InvalidNumber e) {
@@ -82,11 +84,13 @@ public class RemoteDeleteCommand implements DbusCommand, JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
-        handleCommand(ns, new DbusSignalImpl(m, null));
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
+        handleCommand(ns, new DbusSignalImpl(m, null), outputWriter);
     }
 
     }
 
-    private void outputResult(final long timestamp) {
+    private void outputResult(final OutputWriter outputWriter, final long timestamp) {
         if (outputWriter instanceof PlainTextWriter) {
             final var writer = (PlainTextWriter) outputWriter;
             writer.println("{}", timestamp);
         if (outputWriter instanceof PlainTextWriter) {
             final var writer = (PlainTextWriter) outputWriter;
             writer.println("{}", timestamp);
index 8295acee4eda8d0054bb381279048cd7f9f1ebdb..1f47e2b30486a39a4cbb04f5ced8103816dd72eb 100644 (file)
@@ -12,10 +12,13 @@ import java.io.IOException;
 
 public class RemoveDeviceCommand implements JsonRpcLocalCommand {
 
 
 public class RemoveDeviceCommand implements JsonRpcLocalCommand {
 
-    public RemoveDeviceCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "removeDevice";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Remove a linked device.");
         subparser.addArgument("-d", "--device-id", "--deviceId")
                 .type(int.class)
         subparser.help("Remove a linked device.");
         subparser.addArgument("-d", "--device-id", "--deviceId")
                 .type(int.class)
@@ -24,7 +27,9 @@ public class RemoveDeviceCommand implements JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         try {
             int deviceId = ns.getInt("device-id");
             m.removeLinkedDevices(deviceId);
         try {
             int deviceId = ns.getInt("device-id");
             m.removeLinkedDevices(deviceId);
index 6f335179da5e17fb48cba5aded4b09cb699365b3..42ca88804dd7df97dc54e9ec794d7686a068a79a 100644 (file)
@@ -15,15 +15,20 @@ import java.io.IOException;
 
 public class RemovePinCommand implements JsonRpcLocalCommand {
 
 
 public class RemovePinCommand implements JsonRpcLocalCommand {
 
-    public RemovePinCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "removePin";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Remove the registration lock pin.");
     }
 
     @Override
         subparser.help("Remove the registration lock pin.");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         try {
             m.setRegistrationLockPin(Optional.absent());
         } catch (UnauthenticatedResponseException e) {
         try {
             m.setRegistrationLockPin(Optional.absent());
         } catch (UnauthenticatedResponseException e) {
index 8459118cf28044686ceaff92734a4a0c7a8a802d..dbb02248a5907a75d82ca3aa370e66dce19cbc27 100644 (file)
@@ -30,13 +30,14 @@ import java.util.Map;
 public class SendCommand implements DbusCommand, JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(SendCommand.class);
 public class SendCommand implements DbusCommand, JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(SendCommand.class);
-    private final OutputWriter outputWriter;
 
 
-    public SendCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "send";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Send a message to another user or group.");
         subparser.addArgument("recipient").help("Specify the recipients' phone number.").nargs("*");
         final var mutuallyExclusiveGroup = subparser.addMutuallyExclusiveGroup();
         subparser.help("Send a message to another user or group.");
         subparser.addArgument("recipient").help("Specify the recipients' phone number.").nargs("*");
         final var mutuallyExclusiveGroup = subparser.addMutuallyExclusiveGroup();
@@ -53,7 +54,9 @@ public class SendCommand implements DbusCommand, JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Signal signal) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Signal signal, final OutputWriter outputWriter
+    ) throws CommandException {
         final List<String> recipients = ns.getList("recipient");
         final var isEndSession = ns.getBoolean("end-session");
         final var groupIdString = ns.getString("group-id");
         final List<String> recipients = ns.getList("recipient");
         final var isEndSession = ns.getBoolean("end-session");
         final var groupIdString = ns.getString("group-id");
@@ -106,7 +109,7 @@ public class SendCommand implements DbusCommand, JsonRpcLocalCommand {
 
             try {
                 var timestamp = signal.sendGroupMessage(messageText, attachments, groupId);
 
             try {
                 var timestamp = signal.sendGroupMessage(messageText, attachments, groupId);
-                outputResult(timestamp);
+                outputResult(outputWriter, timestamp);
                 return;
             } catch (DBusExecutionException e) {
                 throw new UnexpectedErrorException("Failed to send group message: " + e.getMessage());
                 return;
             } catch (DBusExecutionException e) {
                 throw new UnexpectedErrorException("Failed to send group message: " + e.getMessage());
@@ -116,7 +119,7 @@ public class SendCommand implements DbusCommand, JsonRpcLocalCommand {
         if (isNoteToSelf) {
             try {
                 var timestamp = signal.sendNoteToSelfMessage(messageText, attachments);
         if (isNoteToSelf) {
             try {
                 var timestamp = signal.sendNoteToSelfMessage(messageText, attachments);
-                outputResult(timestamp);
+                outputResult(outputWriter, timestamp);
                 return;
             } catch (Signal.Error.UntrustedIdentity e) {
                 throw new UntrustedKeyErrorException("Failed to send message: " + e.getMessage());
                 return;
             } catch (Signal.Error.UntrustedIdentity e) {
                 throw new UntrustedKeyErrorException("Failed to send message: " + e.getMessage());
@@ -127,7 +130,7 @@ public class SendCommand implements DbusCommand, JsonRpcLocalCommand {
 
         try {
             var timestamp = signal.sendMessage(messageText, attachments, recipients);
 
         try {
             var timestamp = signal.sendMessage(messageText, attachments, recipients);
-            outputResult(timestamp);
+            outputResult(outputWriter, timestamp);
         } catch (UnknownObject e) {
             throw new UserErrorException("Failed to find dbus object, maybe missing the -u flag: " + e.getMessage());
         } catch (Signal.Error.UntrustedIdentity e) {
         } catch (UnknownObject e) {
             throw new UserErrorException("Failed to find dbus object, maybe missing the -u flag: " + e.getMessage());
         } catch (Signal.Error.UntrustedIdentity e) {
@@ -137,7 +140,7 @@ public class SendCommand implements DbusCommand, JsonRpcLocalCommand {
         }
     }
 
         }
     }
 
-    private void outputResult(final long timestamp) {
+    private void outputResult(final OutputWriter outputWriter, final long timestamp) {
         if (outputWriter instanceof PlainTextWriter) {
             final var writer = (PlainTextWriter) outputWriter;
             writer.println("{}", timestamp);
         if (outputWriter instanceof PlainTextWriter) {
             final var writer = (PlainTextWriter) outputWriter;
             writer.println("{}", timestamp);
@@ -148,7 +151,9 @@ public class SendCommand implements DbusCommand, JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
-        handleCommand(ns, new DbusSignalImpl(m, null));
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
+        handleCommand(ns, new DbusSignalImpl(m, null), outputWriter);
     }
 }
     }
 }
index edd5db34680b1690c6ef7570ac2917a082f20790..0fcae322814c7787f72192985fd7bc8738a83b57 100644 (file)
@@ -14,15 +14,20 @@ import java.io.IOException;
 
 public class SendContactsCommand implements JsonRpcLocalCommand {
 
 
 public class SendContactsCommand implements JsonRpcLocalCommand {
 
-    public SendContactsCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "sendContacts";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Send a synchronization message with the local contacts list to all linked devices.");
     }
 
     @Override
         subparser.help("Send a synchronization message with the local contacts list to all linked devices.");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         try {
             m.sendContacts();
         } catch (UntrustedIdentityException e) {
         try {
             m.sendContacts();
         } catch (UntrustedIdentityException e) {
index 44423749be999432acd7edf025ce01966d47e8d0..fedded4263e60de35831fc5965bd0a3014eb175f 100644 (file)
@@ -23,13 +23,13 @@ import java.util.Map;
 
 public class SendReactionCommand implements DbusCommand, JsonRpcLocalCommand {
 
 
 public class SendReactionCommand implements DbusCommand, JsonRpcLocalCommand {
 
-    private final OutputWriter outputWriter;
-
-    public SendReactionCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "sendReaction";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Send reaction to a previously received or sent message.");
         subparser.addArgument("-g", "--group-id", "--group").help("Specify the recipient group ID.");
         subparser.addArgument("recipient").help("Specify the recipients' phone number.").nargs("*");
         subparser.help("Send reaction to a previously received or sent message.");
         subparser.addArgument("-g", "--group-id", "--group").help("Specify the recipient group ID.");
         subparser.addArgument("recipient").help("Specify the recipients' phone number.").nargs("*");
@@ -47,7 +47,9 @@ public class SendReactionCommand implements DbusCommand, JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Signal signal) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Signal signal, final OutputWriter outputWriter
+    ) throws CommandException {
         final List<String> recipients = ns.getList("recipient");
         final var groupIdString = ns.getString("group-id");
 
         final List<String> recipients = ns.getList("recipient");
         final var groupIdString = ns.getString("group-id");
 
@@ -80,7 +82,7 @@ public class SendReactionCommand implements DbusCommand, JsonRpcLocalCommand {
             } else {
                 timestamp = signal.sendMessageReaction(emoji, isRemove, targetAuthor, targetTimestamp, recipients);
             }
             } else {
                 timestamp = signal.sendMessageReaction(emoji, isRemove, targetAuthor, targetTimestamp, recipients);
             }
-            outputResult(timestamp);
+            outputResult(outputWriter, timestamp);
         } catch (UnknownObject e) {
             throw new UserErrorException("Failed to find dbus object, maybe missing the -u flag: " + e.getMessage());
         } catch (Signal.Error.InvalidNumber e) {
         } catch (UnknownObject e) {
             throw new UserErrorException("Failed to find dbus object, maybe missing the -u flag: " + e.getMessage());
         } catch (Signal.Error.InvalidNumber e) {
@@ -93,11 +95,13 @@ public class SendReactionCommand implements DbusCommand, JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
-        handleCommand(ns, new DbusSignalImpl(m, null));
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
+        handleCommand(ns, new DbusSignalImpl(m, null), outputWriter);
     }
 
     }
 
-    private void outputResult(final long timestamp) {
+    private void outputResult(final OutputWriter outputWriter, final long timestamp) {
         if (outputWriter instanceof PlainTextWriter) {
             final var writer = (PlainTextWriter) outputWriter;
             writer.println("{}", timestamp);
         if (outputWriter instanceof PlainTextWriter) {
             final var writer = (PlainTextWriter) outputWriter;
             writer.println("{}", timestamp);
index 4072be15feca44163d180fc9d0be5387bc6d632d..e9a2f94efbb5601f45a1822ef38006158381087e 100644 (file)
@@ -12,15 +12,20 @@ import java.io.IOException;
 
 public class SendSyncRequestCommand implements JsonRpcLocalCommand {
 
 
 public class SendSyncRequestCommand implements JsonRpcLocalCommand {
 
-    public SendSyncRequestCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "sendSyncRequest";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Send a synchronization request message to master device (for group, contacts, ...).");
     }
 
     @Override
         subparser.help("Send a synchronization request message to master device (for group, contacts, ...).");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         try {
             m.requestAllSyncData();
         } catch (IOException e) {
         try {
             m.requestAllSyncData();
         } catch (IOException e) {
index cb4a4f50c4994c43a1923b22b1202add4fcb4f62..d5a686041c16118c18026d49f9b3a8af86c5d33e 100644 (file)
@@ -22,10 +22,13 @@ import java.util.HashSet;
 
 public class SendTypingCommand implements JsonRpcLocalCommand {
 
 
 public class SendTypingCommand implements JsonRpcLocalCommand {
 
-    public SendTypingCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "sendTyping";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help(
                 "Send typing message to trigger a typing indicator for the recipient. Indicator will be shown for 15seconds unless a typing STOP message is sent first.");
         subparser.addArgument("-g", "--group-id", "--group").help("Specify the recipient group ID.");
         subparser.help(
                 "Send typing message to trigger a typing indicator for the recipient. Indicator will be shown for 15seconds unless a typing STOP message is sent first.");
         subparser.addArgument("-g", "--group-id", "--group").help("Specify the recipient group ID.");
@@ -34,7 +37,9 @@ public class SendTypingCommand implements JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         final var recipients = ns.<String>getList("recipient");
         final var groupIdString = ns.getString("group-id");
 
         final var recipients = ns.<String>getList("recipient");
         final var groupIdString = ns.getString("group-id");
 
index 3c018cbc7db206d95ab10b933674d69c326130ca..3636a8b1e97ec64f6afdc1240183d3d0ded876b9 100644 (file)
@@ -15,17 +15,22 @@ import java.io.IOException;
 
 public class SetPinCommand implements JsonRpcLocalCommand {
 
 
 public class SetPinCommand implements JsonRpcLocalCommand {
 
-    public SetPinCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "setPin";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Set a registration lock pin, to prevent others from registering this number.");
         subparser.addArgument("pin")
                 .help("The registration lock PIN, that will be required for new registrations (resets after 7 days of inactivity)");
     }
 
     @Override
         subparser.help("Set a registration lock pin, to prevent others from registering this number.");
         subparser.addArgument("pin")
                 .help("The registration lock PIN, that will be required for new registrations (resets after 7 days of inactivity)");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         try {
             var registrationLockPin = ns.getString("pin");
             m.setRegistrationLockPin(Optional.of(registrationLockPin));
         try {
             var registrationLockPin = ns.getString("pin");
             m.setRegistrationLockPin(Optional.of(registrationLockPin));
index 62f5190c7eeddd0f0e62c3adfebae75528df6c31..78f22c190d2f0b731e4928469cd8d92256f2d981 100644 (file)
@@ -15,10 +15,13 @@ import java.util.Locale;
 
 public class TrustCommand implements JsonRpcLocalCommand {
 
 
 public class TrustCommand implements JsonRpcLocalCommand {
 
-    public TrustCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "trust";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Set the trust level of a given number.");
         subparser.addArgument("number").help("Specify the phone number, for which to set the trust.").required(true);
         var mutTrust = subparser.addMutuallyExclusiveGroup();
         subparser.help("Set the trust level of a given number.");
         subparser.addArgument("number").help("Specify the phone number, for which to set the trust.").required(true);
         var mutTrust = subparser.addMutuallyExclusiveGroup();
@@ -30,7 +33,9 @@ public class TrustCommand implements JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         var number = ns.getString("number");
         if (ns.getBoolean("trust-all-known-keys")) {
             boolean res;
         var number = ns.getString("number");
         if (ns.getBoolean("trust-all-known-keys")) {
             boolean res;
index 6388aeee86acf3f648c3198e6defbc0b93fa690d..830147bc69be1bbad9f64d5bf6d3bc47d5029667 100644 (file)
@@ -19,17 +19,22 @@ public class UnblockCommand implements JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(UnblockCommand.class);
 
 
     private final static Logger logger = LoggerFactory.getLogger(UnblockCommand.class);
 
-    public UnblockCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "unblock";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Unblock the given contacts or groups (messages will be received again)");
         subparser.addArgument("contact").help("Contact number").nargs("*");
         subparser.addArgument("-g", "--group-id", "--group").help("Group ID").nargs("*");
     }
 
     @Override
         subparser.help("Unblock the given contacts or groups (messages will be received again)");
         subparser.addArgument("contact").help("Contact number").nargs("*");
         subparser.addArgument("-g", "--group-id", "--group").help("Group ID").nargs("*");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         for (var contactNumber : ns.<String>getList("contact")) {
             try {
                 m.setContactBlocked(contactNumber, false);
         for (var contactNumber : ns.<String>getList("contact")) {
             try {
                 m.setContactBlocked(contactNumber, false);
index dbb8b53541f5af2fcf6f17a794f94594557ae881..cf09c48012514beb84dd1caa581af954742a6a76 100644 (file)
@@ -13,10 +13,13 @@ import java.io.IOException;
 
 public class UnregisterCommand implements LocalCommand {
 
 
 public class UnregisterCommand implements LocalCommand {
 
-    public UnregisterCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "unregister";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Unregister the current device from the signal server.");
         subparser.addArgument("--delete-account")
                 .help("Delete account completely from server. CAUTION: Only do this if you won't use this number again!")
         subparser.help("Unregister the current device from the signal server.");
         subparser.addArgument("--delete-account")
                 .help("Delete account completely from server. CAUTION: Only do this if you won't use this number again!")
@@ -24,7 +27,9 @@ public class UnregisterCommand implements LocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         try {
             if (ns.getBoolean("delete-account")) {
                 m.deleteAccount();
         try {
             if (ns.getBoolean("delete-account")) {
                 m.deleteAccount();
index 96b90e4181b45cc8cd0a23fe70b8d91a0c0c0e80..f2ed6a98dfb47b59e71aa72ead17870296a7a277 100644 (file)
@@ -12,15 +12,20 @@ import java.io.IOException;
 
 public class UpdateAccountCommand implements JsonRpcLocalCommand {
 
 
 public class UpdateAccountCommand implements JsonRpcLocalCommand {
 
-    public UpdateAccountCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "updateAccount";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Update the account attributes on the signal server.");
     }
 
     @Override
         subparser.help("Update the account attributes on the signal server.");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         try {
             m.updateAccountAttributes();
         } catch (IOException e) {
         try {
             m.updateAccountAttributes();
         } catch (IOException e) {
index 687619b02c777539d0aff475ea4fb6c565f524dd..462ba8d214fe14605e7777b593fd28d5952ee42c 100644 (file)
@@ -15,10 +15,13 @@ import java.io.IOException;
 
 public class UpdateContactCommand implements JsonRpcLocalCommand {
 
 
 public class UpdateContactCommand implements JsonRpcLocalCommand {
 
-    public UpdateContactCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "updateContact";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Update the details of a given contact");
         subparser.addArgument("number").help("Contact number");
         subparser.addArgument("-n", "--name").help("New contact name");
         subparser.help("Update the details of a given contact");
         subparser.addArgument("number").help("Contact number");
         subparser.addArgument("-n", "--name").help("New contact name");
@@ -26,7 +29,9 @@ public class UpdateContactCommand implements JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         var number = ns.getString("number");
 
         try {
         var number = ns.getString("number");
 
         try {
index 0aa2cf1e14319e85311ed246e586635e76f88314..397d1fe37d90be94f73fd3e958d590bd42bda515 100644 (file)
@@ -35,13 +35,14 @@ import java.util.List;
 public class UpdateGroupCommand implements DbusCommand, JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(UpdateGroupCommand.class);
 public class UpdateGroupCommand implements DbusCommand, JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(UpdateGroupCommand.class);
-    private final OutputWriter outputWriter;
 
 
-    public UpdateGroupCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "updateGroup";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Create or update a group.");
         subparser.addArgument("-g", "--group-id", "--group").help("Specify the group ID.");
         subparser.addArgument("-n", "--name").help("Specify the new group name.");
         subparser.help("Create or update a group.");
         subparser.addArgument("-g", "--group-id", "--group").help("Specify the group ID.");
         subparser.addArgument("-n", "--name").help("Specify the new group name.");
@@ -107,7 +108,9 @@ public class UpdateGroupCommand implements DbusCommand, JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         GroupId groupId = null;
         final var groupIdString = ns.getString("group-id");
         if (groupIdString != null) {
         GroupId groupId = null;
         final var groupIdString = ns.getString("group-id");
         if (groupIdString != null) {
@@ -163,7 +166,7 @@ public class UpdateGroupCommand implements DbusCommand, JsonRpcLocalCommand {
                 timestamp = results.first();
                 ErrorUtils.handleSendMessageResults(results.second());
             }
                 timestamp = results.first();
                 ErrorUtils.handleSendMessageResults(results.second());
             }
-            outputResult(timestamp, isNewGroup ? groupId : null);
+            outputResult(outputWriter, timestamp, isNewGroup ? groupId : null);
         } catch (AttachmentInvalidException e) {
             throw new UserErrorException("Failed to add avatar attachment for group\": " + e.getMessage());
         } catch (GroupNotFoundException e) {
         } catch (AttachmentInvalidException e) {
             throw new UserErrorException("Failed to add avatar attachment for group\": " + e.getMessage());
         } catch (GroupNotFoundException e) {
@@ -178,7 +181,9 @@ public class UpdateGroupCommand implements DbusCommand, JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Signal signal) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Signal signal, final OutputWriter outputWriter
+    ) throws CommandException {
         byte[] groupId = null;
         if (ns.getString("group-id") != null) {
             try {
         byte[] groupId = null;
         if (ns.getString("group-id") != null) {
             try {
@@ -209,7 +214,7 @@ public class UpdateGroupCommand implements DbusCommand, JsonRpcLocalCommand {
         try {
             var newGroupId = signal.updateGroup(groupId, groupName, groupMembers, groupAvatar);
             if (groupId.length != newGroupId.length) {
         try {
             var newGroupId = signal.updateGroup(groupId, groupName, groupMembers, groupAvatar);
             if (groupId.length != newGroupId.length) {
-                outputResult(null, GroupId.unknownVersion(newGroupId));
+                outputResult(outputWriter, null, GroupId.unknownVersion(newGroupId));
             }
         } catch (Signal.Error.AttachmentInvalid e) {
             throw new UserErrorException("Failed to add avatar attachment for group\": " + e.getMessage());
             }
         } catch (Signal.Error.AttachmentInvalid e) {
             throw new UserErrorException("Failed to add avatar attachment for group\": " + e.getMessage());
@@ -218,7 +223,7 @@ public class UpdateGroupCommand implements DbusCommand, JsonRpcLocalCommand {
         }
     }
 
         }
     }
 
-    private void outputResult(final Long timestamp, final GroupId groupId) {
+    private void outputResult(final OutputWriter outputWriter, final Long timestamp, final GroupId groupId) {
         if (outputWriter instanceof PlainTextWriter) {
             final var writer = (PlainTextWriter) outputWriter;
             if (groupId != null) {
         if (outputWriter instanceof PlainTextWriter) {
             final var writer = (PlainTextWriter) outputWriter;
             if (groupId != null) {
index ff9e899688d2dce8cbced8c9295fc184e9134dbd..15c29e85373b3cc048016230cda6877a1df2bc79 100644 (file)
@@ -15,10 +15,13 @@ import java.io.IOException;
 
 public class UpdateProfileCommand implements JsonRpcLocalCommand {
 
 
 public class UpdateProfileCommand implements JsonRpcLocalCommand {
 
-    public UpdateProfileCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "updateProfile";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Set a name, about and avatar image for the user profile");
         subparser.addArgument("--given-name", "--name").help("New profile (given) name");
         subparser.addArgument("--family-name").help("New profile family name (optional)");
         subparser.help("Set a name, about and avatar image for the user profile");
         subparser.addArgument("--given-name", "--name").help("New profile (given) name");
         subparser.addArgument("--family-name").help("New profile family name (optional)");
@@ -31,7 +34,9 @@ public class UpdateProfileCommand implements JsonRpcLocalCommand {
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         var givenName = ns.getString("given-name");
         var familyName = ns.getString("family-name");
         var about = ns.getString("about");
         var givenName = ns.getString("given-name");
         var familyName = ns.getString("family-name");
         var about = ns.getString("about");
index 993e37c48c3d83f754217846d993df5d7746be72..a58392389623f75743dd2b1b19d7813730b010ac 100644 (file)
@@ -19,20 +19,23 @@ import java.io.IOException;
 public class UploadStickerPackCommand implements LocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(UploadStickerPackCommand.class);
 public class UploadStickerPackCommand implements LocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(UploadStickerPackCommand.class);
-    private final OutputWriter outputWriter;
 
 
-    public UploadStickerPackCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "uploadStickerPack";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Upload a new sticker pack, consisting of a manifest file and the stickers images.");
         subparser.addArgument("path")
                 .help("The path of the manifest.json or a zip file containing the sticker pack you wish to upload.");
     }
 
     @Override
         subparser.help("Upload a new sticker pack, consisting of a manifest file and the stickers images.");
         subparser.addArgument("path")
                 .help("The path of the manifest.json or a zip file containing the sticker pack you wish to upload.");
     }
 
     @Override
-    public void handleCommand(final Namespace ns, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Namespace ns, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         final var writer = (PlainTextWriter) outputWriter;
         var path = new File(ns.getString("path"));
 
         final var writer = (PlainTextWriter) outputWriter;
         var path = new File(ns.getString("path"));
 
index f32139bdccde69b8695db0fa0559b90ea86efdd3..2f9388ba120ef2286dd16aa45495cb8ca2422814 100644 (file)
@@ -3,7 +3,6 @@ package org.asamk.signal.commands;
 import net.sourceforge.argparse4j.inf.Namespace;
 import net.sourceforge.argparse4j.inf.Subparser;
 
 import net.sourceforge.argparse4j.inf.Namespace;
 import net.sourceforge.argparse4j.inf.Subparser;
 
-import org.asamk.signal.OutputWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.commands.exceptions.IOErrorException;
 import org.asamk.signal.commands.exceptions.UnexpectedErrorException;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.commands.exceptions.IOErrorException;
 import org.asamk.signal.commands.exceptions.UnexpectedErrorException;
@@ -17,10 +16,13 @@ import java.io.IOException;
 
 public class VerifyCommand implements RegistrationCommand {
 
 
 public class VerifyCommand implements RegistrationCommand {
 
-    public VerifyCommand(final OutputWriter outputWriter) {
+    @Override
+    public String getName() {
+        return "verify";
     }
 
     }
 
-    public static void attachToSubparser(final Subparser subparser) {
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
         subparser.help("Verify the number using the code received via SMS or voice.");
         subparser.addArgument("verificationCode").help("The verification code you received via sms or voice call.");
         subparser.addArgument("-p", "--pin").help("The registration lock PIN, that was set by the user (Optional)");
         subparser.help("Verify the number using the code received via SMS or voice.");
         subparser.addArgument("verificationCode").help("The verification code you received via sms or voice call.");
         subparser.addArgument("-p", "--pin").help("The registration lock PIN, that was set by the user (Optional)");
index 1b6d6477805bb65196f9233cf15e80beedf2a4a7..fd1e6fb222424b1a75be341d61394787be82fe37 100644 (file)
@@ -10,14 +10,15 @@ import java.util.Map;
 
 public class VersionCommand implements JsonRpcCommand<Void> {
 
 
 public class VersionCommand implements JsonRpcCommand<Void> {
 
-    private final OutputWriter outputWriter;
-
-    public VersionCommand(final OutputWriter outputWriter) {
-        this.outputWriter = outputWriter;
+    @Override
+    public String getName() {
+        return "version";
     }
 
     @Override
     }
 
     @Override
-    public void handleCommand(final Void request, final Manager m) throws CommandException {
+    public void handleCommand(
+            final Void request, final Manager m, final OutputWriter outputWriter
+    ) throws CommandException {
         final var jsonWriter = (JsonWriter) outputWriter;
         jsonWriter.write(Map.of("version", BaseConfig.PROJECT_VERSION));
     }
         final var jsonWriter = (JsonWriter) outputWriter;
         jsonWriter.write(Map.of("version", BaseConfig.PROJECT_VERSION));
     }