]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java
396063f2b582ecc7de1588fe6856db407d9deab4
[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.GroupNotFoundException;
6 import org.asamk.signal.manager.Manager;
7 import org.asamk.signal.manager.NotAGroupMemberException;
8 import org.asamk.signal.storage.groups.GroupInfo;
9 import org.asamk.signal.util.ErrorUtils;
10 import org.freedesktop.dbus.exceptions.DBusExecutionException;
11 import org.whispersystems.libsignal.util.Pair;
12 import org.whispersystems.signalservice.api.messages.SendMessageResult;
13 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
14 import org.whispersystems.signalservice.api.util.InvalidNumberException;
15
16 import java.io.IOException;
17 import java.util.ArrayList;
18 import java.util.Collections;
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, attachments, groupId);
96 checkSendMessageResults(results.first(), results.second());
97 return results.first();
98 } catch (IOException e) {
99 throw new Error.Failure(e.getMessage());
100 } catch (GroupNotFoundException | NotAGroupMemberException e) {
101 throw new Error.GroupNotFound(e.getMessage());
102 } catch (AttachmentInvalidException e) {
103 throw new Error.AttachmentInvalid(e.getMessage());
104 }
105 }
106
107 @Override
108 public String getContactName(final String number) {
109 try {
110 return m.getContactName(number);
111 } catch (InvalidNumberException e) {
112 throw new Error.InvalidNumber(e.getMessage());
113 }
114 }
115
116 @Override
117 public void setContactName(final String number, final String name) {
118 try {
119 m.setContactName(number, name);
120 } catch (InvalidNumberException e) {
121 throw new Error.InvalidNumber(e.getMessage());
122 }
123 }
124
125 @Override
126 public void setContactBlocked(final String number, final boolean blocked) {
127 try {
128 m.setContactBlocked(number, blocked);
129 } catch (InvalidNumberException e) {
130 throw new Error.InvalidNumber(e.getMessage());
131 }
132 }
133
134 @Override
135 public void setGroupBlocked(final byte[] groupId, final boolean blocked) {
136 try {
137 m.setGroupBlocked(groupId, blocked);
138 } catch (GroupNotFoundException e) {
139 throw new Error.GroupNotFound(e.getMessage());
140 }
141 }
142
143 @Override
144 public List<byte[]> getGroupIds() {
145 List<GroupInfo> groups = m.getGroups();
146 List<byte[]> ids = new ArrayList<>(groups.size());
147 for (GroupInfo group : groups) {
148 ids.add(group.groupId);
149 }
150 return ids;
151 }
152
153 @Override
154 public String getGroupName(final byte[] groupId) {
155 GroupInfo group = m.getGroup(groupId);
156 if (group == null) {
157 return "";
158 } else {
159 return group.getTitle();
160 }
161 }
162
163 @Override
164 public List<String> getGroupMembers(final byte[] groupId) {
165 GroupInfo group = m.getGroup(groupId);
166 if (group == null) {
167 return Collections.emptyList();
168 } else {
169 return group.getMembers()
170 .stream()
171 .map(m::resolveSignalServiceAddress)
172 .map(SignalServiceAddress::getLegacyIdentifier)
173 .collect(Collectors.toList());
174 }
175 }
176
177 @Override
178 public byte[] updateGroup(byte[] groupId, String name, List<String> members, String avatar) {
179 try {
180 if (groupId.length == 0) {
181 groupId = null;
182 }
183 if (name.isEmpty()) {
184 name = null;
185 }
186 if (members.isEmpty()) {
187 members = null;
188 }
189 if (avatar.isEmpty()) {
190 avatar = null;
191 }
192 final Pair<byte[], List<SendMessageResult>> results = m.updateGroup(groupId, name, members, avatar);
193 checkSendMessageResults(0, results.second());
194 return results.first();
195 } catch (IOException e) {
196 throw new Error.Failure(e.getMessage());
197 } catch (GroupNotFoundException | NotAGroupMemberException e) {
198 throw new Error.GroupNotFound(e.getMessage());
199 } catch (InvalidNumberException e) {
200 throw new Error.InvalidNumber(e.getMessage());
201 } catch (AttachmentInvalidException e) {
202 throw new Error.AttachmentInvalid(e.getMessage());
203 }
204 }
205
206 @Override
207 public boolean isRegistered() {
208 return true;
209 }
210 }