]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/SendCommand.java
7320d76d7e2074eb0843747a5ce1eaec3c8b7e51
[signal-cli] / src / main / java / org / asamk / signal / commands / SendCommand.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;
8 import org.asamk.signal.AttachmentInvalidException;
9 import org.asamk.signal.GroupIdFormatException;
10 import org.asamk.signal.GroupNotFoundException;
11 import org.asamk.signal.NotAGroupMemberException;
12 import org.asamk.signal.util.IOUtils;
13 import org.asamk.signal.util.Util;
14 import org.freedesktop.dbus.exceptions.DBusExecutionException;
15 import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
16
17 import java.io.IOException;
18 import java.nio.charset.Charset;
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import static org.asamk.signal.util.ErrorUtils.handleAssertionError;
23 import static org.asamk.signal.util.ErrorUtils.handleDBusExecutionException;
24 import static org.asamk.signal.util.ErrorUtils.handleEncapsulatedExceptions;
25 import static org.asamk.signal.util.ErrorUtils.handleGroupIdFormatException;
26 import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException;
27 import static org.asamk.signal.util.ErrorUtils.handleIOException;
28 import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException;
29
30 public class SendCommand implements DbusCommand {
31
32 @Override
33 public void attachToSubparser(final Subparser subparser) {
34 subparser.addArgument("-g", "--group")
35 .help("Specify the recipient group ID.");
36 subparser.addArgument("recipient")
37 .help("Specify the recipients' phone number.")
38 .nargs("*");
39 subparser.addArgument("-m", "--message")
40 .help("Specify the message, if missing standard input is used.");
41 subparser.addArgument("-a", "--attachment")
42 .nargs("*")
43 .help("Add file as attachment");
44 subparser.addArgument("-e", "--endsession")
45 .help("Clear session state and send end session message.")
46 .action(Arguments.storeTrue());
47 }
48
49 @Override
50 public int handleCommand(final Namespace ns, final Signal signal) {
51 if (!signal.isRegistered()) {
52 System.err.println("User is not registered.");
53 return 1;
54 }
55
56 if ((ns.getList("recipient") == null || ns.getList("recipient").size() == 0) && (ns.getBoolean("endsession") || ns.getString("group") == null)) {
57 System.err.println("No recipients given");
58 System.err.println("Aborting sending.");
59 return 1;
60 }
61
62 if (ns.getBoolean("endsession")) {
63 try {
64 signal.sendEndSessionMessage(ns.<String>getList("recipient"));
65 return 0;
66 } catch (IOException e) {
67 handleIOException(e);
68 return 3;
69 } catch (EncapsulatedExceptions e) {
70 handleEncapsulatedExceptions(e);
71 return 3;
72 } catch (AssertionError e) {
73 handleAssertionError(e);
74 return 1;
75 } catch (DBusExecutionException e) {
76 handleDBusExecutionException(e);
77 return 1;
78 }
79 }
80
81 String messageText = ns.getString("message");
82 if (messageText == null) {
83 try {
84 messageText = IOUtils.readAll(System.in, Charset.defaultCharset());
85 } catch (IOException e) {
86 System.err.println("Failed to read message from stdin: " + e.getMessage());
87 System.err.println("Aborting sending.");
88 return 1;
89 }
90 }
91
92 try {
93 List<String> attachments = ns.getList("attachment");
94 if (attachments == null) {
95 attachments = new ArrayList<>();
96 }
97 if (ns.getString("group") != null) {
98 byte[] groupId = Util.decodeGroupId(ns.getString("group"));
99 signal.sendGroupMessage(messageText, attachments, groupId);
100 } else {
101 signal.sendMessage(messageText, attachments, ns.<String>getList("recipient"));
102 }
103 return 0;
104 } catch (IOException e) {
105 handleIOException(e);
106 return 3;
107 } catch (EncapsulatedExceptions e) {
108 handleEncapsulatedExceptions(e);
109 return 3;
110 } catch (AssertionError e) {
111 handleAssertionError(e);
112 return 1;
113 } catch (GroupNotFoundException e) {
114 handleGroupNotFoundException(e);
115 return 1;
116 } catch (NotAGroupMemberException e) {
117 handleNotAGroupMemberException(e);
118 return 1;
119 } catch (AttachmentInvalidException e) {
120 System.err.println("Failed to add attachment: " + e.getMessage());
121 System.err.println("Aborting sending.");
122 return 1;
123 } catch (DBusExecutionException e) {
124 handleDBusExecutionException(e);
125 return 1;
126 } catch (GroupIdFormatException e) {
127 handleGroupIdFormatException(e);
128 return 1;
129 }
130 }
131 }