X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/48b2c7ff8ad7b653c3a0cb42775a5850f593d0a0..19f7b5d78d29544829b25f1cea1ebc24c151f1c3:/src/main/java/org/asamk/signal/App.java diff --git a/src/main/java/org/asamk/signal/App.java b/src/main/java/org/asamk/signal/App.java index 33338a4c..6b31e2bc 100644 --- a/src/main/java/org/asamk/signal/App.java +++ b/src/main/java/org/asamk/signal/App.java @@ -14,6 +14,7 @@ import org.asamk.signal.commands.LocalCommand; import org.asamk.signal.commands.MultiLocalCommand; import org.asamk.signal.commands.ProvisioningCommand; import org.asamk.signal.commands.RegistrationCommand; +import org.asamk.signal.commands.SignalCreator; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.UnexpectedErrorException; import org.asamk.signal.commands.exceptions.UserErrorException; @@ -66,8 +67,7 @@ public class App { parser.addArgument("-o", "--output") .help("Choose to output in plain text or JSON") - .type(Arguments.enumStringType(OutputType.class)) - .setDefault(OutputType.PLAIN_TEXT); + .type(Arguments.enumStringType(OutputType.class)); parser.addArgument("--service-environment") .help("Choose the server environment to use.") @@ -89,19 +89,22 @@ public class App { } public void init() throws CommandException { - var outputType = ns.get("output"); - var outputWriter = outputType == OutputType.JSON - ? new JsonWriter(System.out) - : 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.getSupportedOutputTypes().contains(outputType)) { - throw new UserErrorException("Command doesn't support output type " + outputType.toString()); + var outputTypeInput = ns.get("output"); + var outputType = outputTypeInput == null + ? command.getSupportedOutputTypes().stream().findFirst().orElse(null) + : outputTypeInput; + var outputWriter = outputType == null + ? null + : outputType == OutputType.JSON ? new JsonWriterImpl(System.out) : new PlainTextWriterImpl(System.out); + + if (outputWriter != null && !command.getSupportedOutputTypes().contains(outputType)) { + throw new UserErrorException("Command doesn't support output type " + outputType); } var username = ns.getString("username"); @@ -110,7 +113,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 - initDbusClient(command, username, useDbusSystem); + initDbusClient(command, username, useDbusSystem, outputWriter); return; } @@ -141,7 +144,7 @@ public class App { throw new UserErrorException("You cannot specify a username (phone number) when linking"); } - handleProvisioningCommand((ProvisioningCommand) command, dataPath, serviceEnvironment); + handleProvisioningCommand((ProvisioningCommand) command, dataPath, serviceEnvironment, outputWriter); return; } @@ -149,7 +152,11 @@ public class App { var usernames = Manager.getAllLocalUsernames(dataPath); if (command instanceof MultiLocalCommand) { - handleMultiLocalCommand((MultiLocalCommand) command, dataPath, serviceEnvironment, usernames); + handleMultiLocalCommand((MultiLocalCommand) command, + dataPath, + serviceEnvironment, + usernames, + outputWriter); return; } @@ -174,14 +181,17 @@ public class App { throw new UserErrorException("Command only works via dbus"); } - handleLocalCommand((LocalCommand) command, username, dataPath, serviceEnvironment); + handleLocalCommand((LocalCommand) command, username, dataPath, serviceEnvironment, outputWriter); } 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); - command.handleCommand(ns, pm); + command.handleCommand(ns, pm, outputWriter); } private void handleRegistrationCommand( @@ -211,10 +221,11 @@ public class App { 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)) { - command.handleCommand(ns, m); + command.handleCommand(ns, m, outputWriter); } catch (IOException e) { logger.warn("Cleanup failed", e); } @@ -224,7 +235,8 @@ public class App { final MultiLocalCommand command, final File dataPath, final ServiceEnvironment serviceEnvironment, - final List usernames + final List usernames, + final OutputWriter outputWriter ) throws CommandException { final var managers = new ArrayList(); for (String u : usernames) { @@ -235,7 +247,17 @@ public class App { } } - command.handleCommand(ns, managers); + command.handleCommand(ns, managers, new SignalCreator() { + @Override + public ProvisioningManager getNewProvisioningManager() { + return ProvisioningManager.init(dataPath, serviceEnvironment, BaseConfig.USER_AGENT); + } + + @Override + public RegistrationManager getNewRegistrationManager(String username) throws IOException { + return RegistrationManager.init(username, dataPath, serviceEnvironment, BaseConfig.USER_AGENT); + } + }, outputWriter); for (var m : managers) { try { @@ -275,7 +297,7 @@ public class App { } 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; @@ -289,7 +311,7 @@ public class App { DbusConfig.getObjectPath(username), Signal.class); - handleCommand(command, ts, dBusConn); + handleCommand(command, ts, dBusConn, outputWriter); } } catch (DBusException | IOException e) { logger.error("Dbus client failed", e); @@ -297,11 +319,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) { - ((ExtendedDbusCommand) command).handleCommand(ns, ts, dBusConn); + ((ExtendedDbusCommand) command).handleCommand(ns, ts, dBusConn, outputWriter); } 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"); }