]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java
Implement creating V2 Groups
[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,
49 List<SendMessageResult> results
50 ) throws DBusExecutionException {
51 List<String> errors = ErrorUtils.getErrorMessagesFromSendMessageResults(results);
52 if (errors.size() == 0) {
53 return;
54 }
55
56 StringBuilder message = new StringBuilder();
57 message.append(timestamp).append('\n');
58 message.append("Failed to send (some) messages:\n");
59 for (String error : errors) {
60 message.append(error).append('\n');
61 }
62
63 throw new Error.Failure(message.toString());
64 }
65
66 @Override
67 public long sendMessage(final String message, final List<String> attachments, final List<String> recipients) {
68 try {
69 final Pair<Long, List<SendMessageResult>> results = m.sendMessage(message, attachments, recipients);
70 checkSendMessageResults(results.first(), results.second());
71 return results.first();
72 } catch (InvalidNumberException e) {
73 throw new Error.InvalidNumber(e.getMessage());
74 } catch (AttachmentInvalidException e) {
75 throw new Error.AttachmentInvalid(e.getMessage());
76 } catch (IOException e) {
77 throw new Error.Failure(e.getMessage());
78 }
79 }
80
81 @Override
82 public void sendEndSessionMessage(final List<String> recipients) {
83 try {
84 final Pair<Long, List<SendMessageResult>> results = m.sendEndSessionMessage(recipients);
85 checkSendMessageResults(results.first(), results.second());
86 } catch (IOException e) {
87 throw new Error.Failure(e.getMessage());
88 } catch (InvalidNumberException e) {
89 throw new Error.InvalidNumber(e.getMessage());
90 }
91 }
92
93 @Override
94 public long sendGroupMessage(final String message, final List<String> attachments, final byte[] groupId) {
95 try {
96 Pair<Long, List<SendMessageResult>> results = m.sendGroupMessage(message, attachments, groupId);
97 checkSendMessageResults(results.first(), results.second());
98 return results.first();
99 } catch (IOException e) {
100 throw new Error.Failure(e.getMessage());
101 } catch (GroupNotFoundException | NotAGroupMemberException e) {
102 throw new Error.GroupNotFound(e.getMessage());
103 } catch (AttachmentInvalidException e) {
104 throw new Error.AttachmentInvalid(e.getMessage());
105 }
106 }
107
108 @Override
109 public String getContactName(final String number) {
110 try {
111 return m.getContactName(number);
112 } catch (InvalidNumberException e) {
113 throw new Error.InvalidNumber(e.getMessage());
114 }
115 }
116
117 @Override
118 public void setContactName(final String number, final String name) {
119 try {
120 m.setContactName(number, name);
121 } catch (InvalidNumberException e) {
122 throw new Error.InvalidNumber(e.getMessage());
123 }
124 }
125
126 @Override
127 public void setContactBlocked(final String number, final boolean blocked) {
128 try {
129 m.setContactBlocked(number, blocked);
130 } catch (InvalidNumberException e) {
131 throw new Error.InvalidNumber(e.getMessage());
132 }
133 }
134
135 @Override
136 public void setGroupBlocked(final byte[] groupId, final boolean blocked) {
137 try {
138 m.setGroupBlocked(groupId, blocked);
139 } catch (GroupNotFoundException e) {
140 throw new Error.GroupNotFound(e.getMessage());
141 }
142 }
143
144 @Override
145 public List<byte[]> getGroupIds() {
146 List<GroupInfo> groups = m.getGroups();
147 List<byte[]> ids = new ArrayList<>(groups.size());
148 for (GroupInfo group : groups) {
149 ids.add(group.groupId);
150 }
151 return ids;
152 }
153
154 @Override
155 public String getGroupName(final byte[] groupId) {
156 GroupInfo group = m.getGroup(groupId);
157 if (group == null) {
158 return "";
159 } else {
160 return group.getTitle();
161 }
162 }
163
164 @Override
165 public List<String> getGroupMembers(final byte[] groupId) {
166 GroupInfo group = m.getGroup(groupId);
167 if (group == null) {
168 return Collections.emptyList();
169 } else {
170 return group.getMembers()
171 .stream()
172 .map(m::resolveSignalServiceAddress)
173 .map(SignalServiceAddress::getLegacyIdentifier)
174 .collect(Collectors.toList());
175 }
176 }
177
178 @Override
179 public byte[] updateGroup(byte[] groupId, String name, List<String> members, String avatar) {
180 try {
181 if (groupId.length == 0) {
182 groupId = null;
183 }
184 if (name.isEmpty()) {
185 name = null;
186 }
187 if (members.isEmpty()) {
188 members = null;
189 }
190 if (avatar.isEmpty()) {
191 avatar = null;
192 }
193 final Pair<byte[], List<SendMessageResult>> results = m.updateGroup(groupId, name, members, avatar);
194 checkSendMessageResults(0, results.second());
195 return results.first();
196 } catch (IOException e) {
197 throw new Error.Failure(e.getMessage());
198 } catch (GroupNotFoundException | NotAGroupMemberException e) {
199 throw new Error.GroupNotFound(e.getMessage());
200 } catch (InvalidNumberException e) {
201 throw new Error.InvalidNumber(e.getMessage());
202 } catch (AttachmentInvalidException e) {
203 throw new Error.AttachmentInvalid(e.getMessage());
204 }
205 }
206
207 @Override
208 public boolean isRegistered() {
209 return true;
210 }
211 }