]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ReceiveCommand.java
Implement receive command for JSON-RPC mode
[signal-cli] / src / main / java / org / asamk / signal / commands / ReceiveCommand.java
1 package org.asamk.signal.commands;
2
3 import com.fasterxml.jackson.core.type.TypeReference;
4
5 import net.sourceforge.argparse4j.impl.Arguments;
6 import net.sourceforge.argparse4j.inf.Namespace;
7 import net.sourceforge.argparse4j.inf.Subparser;
8
9 import org.asamk.signal.OutputType;
10 import org.asamk.signal.ReceiveMessageHandler;
11 import org.asamk.signal.commands.exceptions.CommandException;
12 import org.asamk.signal.commands.exceptions.IOErrorException;
13 import org.asamk.signal.json.JsonReceiveMessageHandler;
14 import org.asamk.signal.manager.Manager;
15 import org.asamk.signal.manager.api.ReceiveConfig;
16 import org.asamk.signal.output.JsonWriter;
17 import org.asamk.signal.output.OutputWriter;
18 import org.asamk.signal.output.PlainTextWriter;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
21
22 import java.io.IOException;
23 import java.time.Duration;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.Optional;
27
28 public class ReceiveCommand implements LocalCommand, JsonRpcSingleCommand<ReceiveCommand.ReceiveParams> {
29
30 private final static Logger logger = LoggerFactory.getLogger(ReceiveCommand.class);
31
32 @Override
33 public String getName() {
34 return "receive";
35 }
36
37 @Override
38 public void attachToSubparser(final Subparser subparser) {
39 subparser.help("Query the server for new messages.");
40 subparser.addArgument("-t", "--timeout")
41 .type(double.class)
42 .setDefault(3.0)
43 .help("Number of seconds to wait for new messages (negative values disable timeout)");
44 subparser.addArgument("--max-messages")
45 .type(int.class)
46 .setDefault(-1)
47 .help("Maximum number of messages to receive, before returning.");
48 subparser.addArgument("--ignore-attachments")
49 .help("Don’t download attachments of received messages.")
50 .action(Arguments.storeTrue());
51 subparser.addArgument("--ignore-stories")
52 .help("Don’t receive story messages from the server.")
53 .action(Arguments.storeTrue());
54 subparser.addArgument("--send-read-receipts")
55 .help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)")
56 .action(Arguments.storeTrue());
57 }
58
59 @Override
60 public List<OutputType> getSupportedOutputTypes() {
61 return List.of(OutputType.PLAIN_TEXT, OutputType.JSON);
62 }
63
64 @Override
65 public void handleCommand(
66 final Namespace ns, final Manager m, final OutputWriter outputWriter
67 ) throws CommandException {
68 final var timeout = ns.getDouble("timeout");
69 final var maxMessagesRaw = ns.getInt("max-messages");
70 final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments"));
71 final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories"));
72 final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts"));
73 m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts));
74 try {
75 final var handler = outputWriter instanceof JsonWriter ? new JsonReceiveMessageHandler(m,
76 (JsonWriter) outputWriter) : new ReceiveMessageHandler(m, (PlainTextWriter) outputWriter);
77 final var duration = timeout < 0 ? null : Duration.ofMillis((long) (timeout * 1000));
78 final var maxMessages = maxMessagesRaw < 0 ? null : maxMessagesRaw;
79 m.receiveMessages(Optional.ofNullable(duration), Optional.ofNullable(maxMessages), handler);
80 } catch (IOException e) {
81 throw new IOErrorException("Error while receiving messages: " + e.getMessage(), e);
82 }
83 }
84
85 @Override
86 public TypeReference<ReceiveParams> getRequestType() {
87 return new TypeReference<>() {};
88 }
89
90 @Override
91 public void handleCommand(
92 final ReceiveParams request, final Manager m, final JsonWriter jsonWriter
93 ) throws CommandException {
94 final var timeout = request.timeout() == null ? 3.0 : request.timeout();
95 final var maxMessagesRaw = request.maxMessages() == null ? -1 : request.maxMessages();
96
97 try {
98 final var messages = new ArrayList<>();
99 final var handler = new JsonReceiveMessageHandler(m, messages::add);
100 final var duration = timeout < 0 ? null : Duration.ofMillis((long) (timeout * 1000));
101 final var maxMessages = maxMessagesRaw < 0 ? null : maxMessagesRaw;
102 m.receiveMessages(Optional.ofNullable(duration), Optional.ofNullable(maxMessages), handler);
103 jsonWriter.write(messages);
104 } catch (IOException e) {
105 throw new IOErrorException("Error while receiving messages: " + e.getMessage(), e);
106 }
107 }
108
109 record ReceiveParams(Double timeout, Integer maxMessages) {}
110 }