]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java
278fbbd4b3bec4d68336832c4c0969e9deda917e
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusSignalImpl.java
1 package org.asamk.signal.dbus;
2
3 import org.asamk.Signal;
4 import org.asamk.signal.manager.AttachmentInvalidException;
5 import org.asamk.signal.manager.Manager;
6 import org.asamk.signal.manager.groups.GroupId;
7 import org.asamk.signal.manager.groups.GroupNotFoundException;
8 import org.asamk.signal.manager.groups.NotAGroupMemberException;
9 import org.asamk.signal.manager.storage.groups.GroupInfo;
10 import org.asamk.signal.util.ErrorUtils;
11 import org.freedesktop.dbus.exceptions.DBusExecutionException;
12 import org.whispersystems.libsignal.util.Pair;
13 import org.whispersystems.signalservice.api.messages.SendMessageResult;
14 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
15 import org.whispersystems.signalservice.api.util.InvalidNumberException;
16
17 import java.io.IOException;
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.stream.Collectors;
21
22 public class DbusSignalImpl implements Signal {
23
24 private final Manager m;
25
26 public DbusSignalImpl(final Manager m) {
27 this.m = m;
28 }
29
30 @Override
31 public boolean isRemote() {
32 return false;
33 }
34
35 @Override
36 public String getObjectPath() {
37 return null;
38 }
39
40 @Override
41 public long sendMessage(final String message, final List<String> attachments, final String recipient) {
42 List<String> recipients = new ArrayList<>(1);
43 recipients.add(recipient);
44 return sendMessage(message, attachments, recipients);
45 }
46
47 private static void checkSendMessageResults(
48 long timestamp, List<SendMessageResult> results
49 ) throws DBusExecutionException {
50 List<String> errors = ErrorUtils.getErrorMessagesFromSendMessageResults(results);
51 if (errors.size() == 0) {
52 return;
53 }
54
55 StringBuilder message = new StringBuilder();
56 message.append(timestamp).append('\n');
57 message.append("Failed to send (some) messages:\n");
58 for (String error : errors) {
59 message.append(error).append('\n');
60 }
61
62 throw new Error.Failure(message.toString());
63 }
64
65 @Override
66 public long sendMessage(final String message, final List<String> attachments, final List<String> recipients) {
67 try {
68 final Pair<Long, List<SendMessageResult>> results = m.sendMessage(message, attachments, recipients);
69 checkSendMessageResults(results.first(), results.second());
70 return results.first();
71 } catch (InvalidNumberException e) {
72 throw new Error.InvalidNumber(e.getMessage());
73 } catch (AttachmentInvalidException e) {
74 throw new Error.AttachmentInvalid(e.getMessage());
75 } catch (IOException e) {
76 throw new Error.Failure(e.getMessage());
77 }
78 }
79
80 @Override
81 public void sendEndSessionMessage(final List<String> recipients) {
82 try {
83 final Pair<Long, List<SendMessageResult>> results = m.sendEndSessionMessage(recipients);
84 checkSendMessageResults(results.first(), results.second());
85 } catch (IOException e) {
86 throw new Error.Failure(e.getMessage());
87 } catch (InvalidNumberException e) {
88 throw new Error.InvalidNumber(e.getMessage());
89 }
90 }
91
92 @Override
93 public long sendGroupMessage(final String message, final List<String> attachments, final byte[] groupId) {
94 try {
95 Pair<Long, List<SendMessageResult>> results = m.sendGroupMessage(message,
96 attachments,
97 GroupId.unknownVersion(groupId));
98 checkSendMessageResults(results.first(), results.second());
99 return results.first();
100 } catch (IOException e) {
101 throw new Error.Failure(e.getMessage());
102 } catch (GroupNotFoundException | NotAGroupMemberException e) {
103 throw new Error.GroupNotFound(e.getMessage());
104 } catch (AttachmentInvalidException e) {
105 throw new Error.AttachmentInvalid(e.getMessage());
106 }
107 }
108
109 @Override
110 public String getContactName(final String number) {
111 try {
112 return m.getContactName(number);
113 } catch (InvalidNumberException e) {
114 throw new Error.InvalidNumber(e.getMessage());
115 }
116 }
117
118 @Override
119 public void setContactName(final String number, final String name) {
120 try {
121 m.setContactName(number, name);
122 } catch (InvalidNumberException e) {
123 throw new Error.InvalidNumber(e.getMessage());
124 }
125 }
126
127 @Override
128 public void setContactBlocked(final String number, final boolean blocked) {
129 try {
130 m.setContactBlocked(number, blocked);
131 } catch (InvalidNumberException e) {
132 throw new Error.InvalidNumber(e.getMessage());
133 }
134 }
135
136 @Override
137 public void setGroupBlocked(final byte[] groupId, final boolean blocked) {
138 try {
139 m.setGroupBlocked(GroupId.unknownVersion(groupId), blocked);
140 } catch (GroupNotFoundException e) {
141 throw new Error.GroupNotFound(e.getMessage());
142 }
143 }
144
145 @Override
146 public List<byte[]> getGroupIds() {
147 List<GroupInfo> groups = m.getGroups();
148 List<byte[]> ids = new ArrayList<>(groups.size());
149 for (GroupInfo group : groups) {
150 ids.add(group.getGroupId().serialize());
151 }
152 return ids;
153 }
154
155 @Override
156 public String getGroupName(final byte[] groupId) {
157 GroupInfo group = m.getGroup(GroupId.unknownVersion(groupId));
158 if (group == null) {
159 return "";
160 } else {
161 return group.getTitle();
162 }
163 }
164
165 @Override
166 public List<String> getGroupMembers(final byte[] groupId) {
167 GroupInfo group = m.getGroup(GroupId.unknownVersion(groupId));
168 if (group == null) {
169 return List.of();
170 } else {
171 return group.getMembers()
172 .stream()
173 .map(m::resolveSignalServiceAddress)
174 .map(SignalServiceAddress::getLegacyIdentifier)
175 .collect(Collectors.toList());
176 }
177 }
178
179 @Override
180 public byte[] updateGroup(byte[] groupId, String name, List<String> members, String avatar) {
181 try {
182 if (groupId.length == 0) {
183 groupId = null;
184 }
185 if (name.isEmpty()) {
186 name = null;
187 }
188 if (members.isEmpty()) {
189 members = null;
190 }
191 if (avatar.isEmpty()) {
192 avatar = null;
193 }
194 final Pair<GroupId, List<SendMessageResult>> results = m.updateGroup(groupId == null
195 ? null
196 : GroupId.unknownVersion(groupId), name, members, avatar);
197 checkSendMessageResults(0, results.second());
198 return results.first().serialize();
199 } catch (IOException e) {
200 throw new Error.Failure(e.getMessage());
201 } catch (GroupNotFoundException | NotAGroupMemberException e) {
202 throw new Error.GroupNotFound(e.getMessage());
203 } catch (InvalidNumberException e) {
204 throw new Error.InvalidNumber(e.getMessage());
205 } catch (AttachmentInvalidException e) {
206 throw new Error.AttachmentInvalid(e.getMessage());
207 }
208 }
209
210 @Override
211 public boolean isRegistered() {
212 return true;
213 }
214 }