]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/SendReceiptCommand.java
Make send behavior more deterministic if there are unregistered recipients
[signal-cli] / src / main / java / org / asamk / signal / commands / SendReceiptCommand.java
1 package org.asamk.signal.commands;
2
3 import net.sourceforge.argparse4j.inf.Namespace;
4 import net.sourceforge.argparse4j.inf.Subparser;
5
6 import org.asamk.signal.JsonWriter;
7 import org.asamk.signal.OutputWriter;
8 import org.asamk.signal.PlainTextWriter;
9 import org.asamk.signal.commands.exceptions.CommandException;
10 import org.asamk.signal.commands.exceptions.UserErrorException;
11 import org.asamk.signal.manager.Manager;
12 import org.asamk.signal.manager.api.SendMessageResults;
13 import org.asamk.signal.util.CommandUtil;
14 import org.asamk.signal.util.ErrorUtils;
15
16 import java.io.IOException;
17 import java.util.Map;
18
19 public class SendReceiptCommand implements JsonRpcLocalCommand {
20
21 @Override
22 public String getName() {
23 return "sendReceipt";
24 }
25
26 @Override
27 public void attachToSubparser(final Subparser subparser) {
28 subparser.help("Send a read or viewed receipt to a previously received message.");
29 subparser.addArgument("recipient").help("Specify the sender's phone number.").required(true);
30 subparser.addArgument("-t", "--target-timestamp")
31 .type(long.class)
32 .nargs("+")
33 .help("Specify the timestamp of the messages for which a receipt should be sent.");
34 subparser.addArgument("--type")
35 .help("Specify the receipt type (default is read receipt).")
36 .choices("read", "viewed");
37 }
38
39 @Override
40 public void handleCommand(
41 final Namespace ns, final Manager m, final OutputWriter outputWriter
42 ) throws CommandException {
43 final var recipientString = ns.getString("recipient");
44 final var recipient = CommandUtil.getSingleRecipientIdentifier(recipientString, m.getSelfNumber());
45
46 final var targetTimestamps = ns.<Long>getList("target-timestamp");
47 final var type = ns.getString("type");
48
49 try {
50 final SendMessageResults results;
51 if (type == null || "read".equals(type)) {
52 results = m.sendReadReceipt(recipient, targetTimestamps);
53 } else if ("viewed".equals(type)) {
54 results = m.sendViewedReceipt(recipient, targetTimestamps);
55 } else {
56 throw new UserErrorException("Unknown receipt type: " + type);
57 }
58 outputResult(outputWriter, results.timestamp());
59 ErrorUtils.handleSendMessageResults(results.results());
60 } catch (IOException e) {
61 throw new UserErrorException("Failed to send message: " + e.getMessage() + " (" + e.getClass()
62 .getSimpleName() + ")");
63 }
64 }
65
66 private void outputResult(final OutputWriter outputWriter, final long timestamp) {
67 if (outputWriter instanceof PlainTextWriter writer) {
68 writer.println("{}", timestamp);
69 } else {
70 final var writer = (JsonWriter) outputWriter;
71 writer.write(Map.of("timestamp", timestamp));
72 }
73 }
74 }