1 package org
.asamk
.signal
.commands
;
3 import net
.sourceforge
.argparse4j
.impl
.Arguments
;
4 import net
.sourceforge
.argparse4j
.inf
.Namespace
;
5 import net
.sourceforge
.argparse4j
.inf
.Subparser
;
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
;
19 import java
.io
.InputStreamReader
;
20 import java
.util
.List
;
21 import java
.util
.function
.Supplier
;
23 public class JsonRpcDispatcherCommand
implements LocalCommand
, MultiLocalCommand
{
25 private final static Logger logger
= LoggerFactory
.getLogger(JsonRpcDispatcherCommand
.class);
28 public String
getName() {
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
);
51 public List
<OutputType
> getSupportedOutputTypes() {
52 return List
.of(OutputType
.JSON
);
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
);
63 final var jsonOutputWriter
= (JsonWriter
) outputWriter
;
64 final var lineSupplier
= getLineSupplier();
66 final var handler
= new SignalJsonRpcDispatcherHandler(jsonOutputWriter
,
68 receiveMode
== ReceiveMode
.MANUAL
);
69 handler
.handleConnection(m
);
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
));
81 final var jsonOutputWriter
= (JsonWriter
) outputWriter
;
82 final var lineSupplier
= getLineSupplier();
84 final var handler
= new SignalJsonRpcDispatcherHandler(jsonOutputWriter
,
86 receiveMode
== ReceiveMode
.MANUAL
);
87 handler
.handleConnection(c
);
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
);
97 private static Supplier
<String
> getLineSupplier() {
98 return IOUtils
.getLineSupplier(new InputStreamReader(System
.in, IOUtils
.getConsoleCharset()));