]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java
166dfcef9cc6661648602480fdd58585d9f89f64
[signal-cli] / src / main / java / org / asamk / signal / commands / JsonRpcDispatcherCommand.java
1 package org.asamk.signal.commands;
2
3 import net.sourceforge.argparse4j.impl.Arguments;
4 import net.sourceforge.argparse4j.inf.Namespace;
5 import net.sourceforge.argparse4j.inf.Subparser;
6
7 import org.asamk.signal.OutputType;
8 import org.asamk.signal.commands.exceptions.CommandException;
9 import org.asamk.signal.jsonrpc.SignalJsonRpcDispatcherHandler;
10 import org.asamk.signal.manager.Manager;
11 import org.asamk.signal.manager.MultiAccountManager;
12 import org.asamk.signal.manager.api.ReceiveConfig;
13 import org.asamk.signal.output.JsonWriter;
14 import org.asamk.signal.output.OutputWriter;
15 import org.asamk.signal.util.IOUtils;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18
19 import java.io.InputStreamReader;
20 import java.util.List;
21 import java.util.function.Supplier;
22
23 public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand {
24
25 private final static Logger logger = LoggerFactory.getLogger(JsonRpcDispatcherCommand.class);
26
27 @Override
28 public String getName() {
29 return "jsonRpc";
30 }
31
32 @Override
33 public void attachToSubparser(final Subparser subparser) {
34 subparser.help("Take commands from standard input as line-delimited JSON RPC while receiving messages.");
35 subparser.addArgument("--ignore-attachments")
36 .help("Don’t download attachments of received messages.")
37 .action(Arguments.storeTrue());
38 subparser.addArgument("--ignore-stories")
39 .help("Don’t receive story messages from the server.")
40 .action(Arguments.storeTrue());
41 subparser.addArgument("--send-read-receipts")
42 .help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)")
43 .action(Arguments.storeTrue());
44 subparser.addArgument("--receive-mode")
45 .help("Specify when to start receiving messages.")
46 .type(Arguments.enumStringType(ReceiveMode.class))
47 .setDefault(ReceiveMode.ON_START);
48 }
49
50 @Override
51 public List<OutputType> getSupportedOutputTypes() {
52 return List.of(OutputType.JSON);
53 }
54
55 @Override
56 public void handleCommand(
57 final Namespace ns, final Manager m, final OutputWriter outputWriter
58 ) throws CommandException {
59 final var receiveMode = ns.<ReceiveMode>get("receive-mode");
60 final var receiveConfig = getReceiveConfig(ns);
61 m.setReceiveConfig(receiveConfig);
62
63 final var jsonOutputWriter = (JsonWriter) outputWriter;
64 final var lineSupplier = getLineSupplier();
65
66 final var handler = new SignalJsonRpcDispatcherHandler(jsonOutputWriter,
67 lineSupplier,
68 receiveMode == ReceiveMode.MANUAL);
69 handler.handleConnection(m);
70 }
71
72 @Override
73 public void handleCommand(
74 final Namespace ns, final MultiAccountManager c, final OutputWriter outputWriter
75 ) throws CommandException {
76 final var receiveMode = ns.<ReceiveMode>get("receive-mode");
77 final var receiveConfig = getReceiveConfig(ns);
78 c.getManagers().forEach(m -> m.setReceiveConfig(receiveConfig));
79 c.addOnManagerAddedHandler(m -> m.setReceiveConfig(receiveConfig));
80
81 final var jsonOutputWriter = (JsonWriter) outputWriter;
82 final var lineSupplier = getLineSupplier();
83
84 final var handler = new SignalJsonRpcDispatcherHandler(jsonOutputWriter,
85 lineSupplier,
86 receiveMode == ReceiveMode.MANUAL);
87 handler.handleConnection(c);
88 }
89
90 private static ReceiveConfig getReceiveConfig(final Namespace ns) {
91 final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments"));
92 final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories"));
93 final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts"));
94 return new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts);
95 }
96
97 private static Supplier<String> getLineSupplier() {
98 return IOUtils.getLineSupplier(new InputStreamReader(System.in, IOUtils.getConsoleCharset()));
99 }
100 }