X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/5dd602614cc44c30ef4a60a1c043e44a8e31a8ca..fe752e0c7998bc8ca66c46d981624e6fbce7abf9:/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java index 4cfa5891..5ce9daf4 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java @@ -4,25 +4,30 @@ import net.sourceforge.argparse4j.impl.Arguments; import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; -import org.asamk.signal.JsonWriter; import org.asamk.signal.OutputType; -import org.asamk.signal.OutputWriter; +import org.asamk.signal.Shutdown; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.jsonrpc.SignalJsonRpcDispatcherHandler; import org.asamk.signal.manager.Manager; +import org.asamk.signal.manager.MultiAccountManager; +import org.asamk.signal.output.JsonWriter; +import org.asamk.signal.output.OutputWriter; +import org.asamk.signal.util.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.BufferedReader; -import java.io.IOException; +import java.io.FileDescriptor; +import java.io.FileInputStream; import java.io.InputStreamReader; -import java.io.Reader; +import java.nio.channels.Channels; import java.util.List; import java.util.function.Supplier; -public class JsonRpcDispatcherCommand implements LocalCommand { +import static org.asamk.signal.util.CommandUtil.getReceiveConfig; - private final static Logger logger = LoggerFactory.getLogger(JsonRpcDispatcherCommand.class); +public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand { + + private static final Logger logger = LoggerFactory.getLogger(JsonRpcDispatcherCommand.class); @Override public String getName() { @@ -35,6 +40,16 @@ public class JsonRpcDispatcherCommand implements LocalCommand { subparser.addArgument("--ignore-attachments") .help("Don’t download attachments of received messages.") .action(Arguments.storeTrue()); + subparser.addArgument("--ignore-stories") + .help("Don’t receive story messages from the server.") + .action(Arguments.storeTrue()); + subparser.addArgument("--send-read-receipts") + .help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)") + .action(Arguments.storeTrue()); + subparser.addArgument("--receive-mode") + .help("Specify when to start receiving messages.") + .type(Arguments.enumStringType(ReceiveMode.class)) + .setDefault(ReceiveMode.ON_START); } @Override @@ -44,26 +59,52 @@ public class JsonRpcDispatcherCommand implements LocalCommand { @Override public void handleCommand( - final Namespace ns, final Manager m, final OutputWriter outputWriter + final Namespace ns, + final Manager m, + final OutputWriter outputWriter + ) throws CommandException { + Shutdown.installHandler(); + final var receiveMode = ns.get("receive-mode"); + final var receiveConfig = getReceiveConfig(ns); + m.setReceiveConfig(receiveConfig); + + final var jsonOutputWriter = (JsonWriter) outputWriter; + final var lineSupplier = getLineSupplier(); + + final var handler = new SignalJsonRpcDispatcherHandler(jsonOutputWriter, + lineSupplier, + receiveMode == ReceiveMode.MANUAL); + final var thread = Thread.currentThread(); + Shutdown.registerShutdownListener(thread::interrupt); + handler.handleConnection(m); + } + + @Override + public void handleCommand( + final Namespace ns, + final MultiAccountManager c, + final OutputWriter outputWriter ) throws CommandException { - final boolean ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); - m.setIgnoreAttachments(ignoreAttachments); + Shutdown.installHandler(); + final var receiveMode = ns.get("receive-mode"); + final var receiveConfig = getReceiveConfig(ns); + c.getManagers().forEach(m -> m.setReceiveConfig(receiveConfig)); + c.addOnManagerAddedHandler(m -> m.setReceiveConfig(receiveConfig)); final var jsonOutputWriter = (JsonWriter) outputWriter; - final Supplier lineSupplier = getLineSupplier(new InputStreamReader(System.in)); - - final var handler = new SignalJsonRpcDispatcherHandler(m, jsonOutputWriter, lineSupplier); - handler.handleConnection(); - - private Supplier getLineSupplier(final Reader reader) { - final var bufferedReader = new BufferedReader(reader); - return () -> { - try { - return bufferedReader.readLine(); - } catch (IOException e) { - logger.error("Error occurred while reading line", e); - return null; - } - }; + final var lineSupplier = getLineSupplier(); + + final var handler = new SignalJsonRpcDispatcherHandler(jsonOutputWriter, + lineSupplier, + receiveMode == ReceiveMode.MANUAL); + final var thread = Thread.currentThread(); + Shutdown.registerShutdownListener(thread::interrupt); + handler.handleConnection(c); + } + + private static Supplier getLineSupplier() { + // Use FileChannel for stdin, because System.in is uninterruptible + final var stdInCh = Channels.newInputStream((new FileInputStream(FileDescriptor.in)).getChannel()); + return IOUtils.getLineSupplier(new InputStreamReader(stdInCh, IOUtils.getConsoleCharset())); } }