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