]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java
Implement more methods for DbusManagerImpl
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusSignalImpl.java
index 812110b31bdf2fb11ae656ce53e400990db3d21c..f2af8a3effc501ed5f3d26e660ec15bf244d9491 100644 (file)
@@ -2,12 +2,10 @@ package org.asamk.signal.dbus;
 
 import org.asamk.Signal;
 import org.asamk.signal.BaseConfig;
-import org.asamk.signal.DbusReceiveMessageHandler;
 import org.asamk.signal.manager.AttachmentInvalidException;
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.manager.NotMasterDeviceException;
 import org.asamk.signal.manager.StickerPackInvalidException;
-import org.asamk.signal.manager.UntrustedIdentityException;
 import org.asamk.signal.manager.api.Identity;
 import org.asamk.signal.manager.api.InactiveGroupLinkException;
 import org.asamk.signal.manager.api.InvalidDeviceLinkException;
@@ -28,7 +26,7 @@ import org.asamk.signal.manager.groups.LastGroupAdminException;
 import org.asamk.signal.manager.groups.NotAGroupMemberException;
 import org.asamk.signal.manager.storage.recipients.Profile;
 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
-import org.asamk.signal.util.ErrorUtils;
+import org.asamk.signal.util.SendMessageResultUtils;
 import org.freedesktop.dbus.DBusPath;
 import org.freedesktop.dbus.connections.impl.DBusConnection;
 import org.freedesktop.dbus.exceptions.DBusException;
@@ -113,7 +111,7 @@ public class DbusSignalImpl implements Signal {
     @Override
     public void subscribeReceive() {
         if (dbusMessageHandler == null) {
-            dbusMessageHandler = new DbusReceiveMessageHandler(m, connection, objectPath);
+            dbusMessageHandler = new DbusReceiveMessageHandler(connection, objectPath);
             m.addReceiveHandler(dbusMessageHandler);
         }
         subscriberCount++;
@@ -193,15 +191,13 @@ public class DbusSignalImpl implements Signal {
 
     @Override
     public long sendMessage(final String message, final List<String> attachments, final String recipient) {
-        var recipients = new ArrayList<String>(1);
-        recipients.add(recipient);
-        return sendMessage(message, attachments, recipients);
+        return sendMessage(message, attachments, List.of(recipient));
     }
 
     @Override
     public long sendMessage(final String message, final List<String> attachments, final List<String> recipients) {
         try {
-            final var results = m.sendMessage(new Message(message, attachments, List.of()),
+            final var results = m.sendMessage(new Message(message, attachments, List.of(), Optional.empty()),
                     getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream()
                             .map(RecipientIdentifier.class::cast)
                             .collect(Collectors.toSet()));
@@ -221,9 +217,7 @@ public class DbusSignalImpl implements Signal {
     public long sendRemoteDeleteMessage(
             final long targetSentTimestamp, final String recipient
     ) {
-        var recipients = new ArrayList<String>(1);
-        recipients.add(recipient);
-        return sendRemoteDeleteMessage(targetSentTimestamp, recipients);
+        return sendRemoteDeleteMessage(targetSentTimestamp, List.of(recipient));
     }
 
     @Override
@@ -244,22 +238,6 @@ public class DbusSignalImpl implements Signal {
         }
     }
 
-    @Override
-    public long sendGroupRemoteDeleteMessage(
-            final long targetSentTimestamp, final byte[] groupId
-    ) {
-        try {
-            final var results = m.sendRemoteDeleteMessage(targetSentTimestamp,
-                    Set.of(new RecipientIdentifier.Group(getGroupId(groupId))));
-            checkSendMessageResults(results.timestamp(), results.results());
-            return results.timestamp();
-        } catch (IOException e) {
-            throw new Error.Failure(e.getMessage());
-        } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
-            throw new Error.GroupNotFound(e.getMessage());
-        }
-    }
-
     @Override
     public long sendMessageReaction(
             final String emoji,
@@ -268,9 +246,7 @@ public class DbusSignalImpl implements Signal {
             final long targetSentTimestamp,
             final String recipient
     ) {
-        var recipients = new ArrayList<String>(1);
-        recipients.add(recipient);
-        return sendMessageReaction(emoji, remove, targetAuthor, targetSentTimestamp, recipients);
+        return sendMessageReaction(emoji, remove, targetAuthor, targetSentTimestamp, List.of(recipient));
     }
 
     @Override
@@ -303,18 +279,15 @@ public class DbusSignalImpl implements Signal {
             final String recipient, final boolean stop
     ) throws Error.Failure, Error.GroupNotFound, Error.UntrustedIdentity {
         try {
-            var recipients = new ArrayList<String>(1);
-            recipients.add(recipient);
-            m.sendTypingMessage(stop ? TypingAction.STOP : TypingAction.START,
-                    getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream()
+            final var results = m.sendTypingMessage(stop ? TypingAction.STOP : TypingAction.START,
+                    getSingleRecipientIdentifiers(List.of(recipient), m.getSelfNumber()).stream()
                             .map(RecipientIdentifier.class::cast)
                             .collect(Collectors.toSet()));
+            checkSendMessageResults(results.timestamp(), results.results());
         } catch (IOException e) {
             throw new Error.Failure(e.getMessage());
         } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
             throw new Error.GroupNotFound(e.getMessage());
-        } catch (UntrustedIdentityException e) {
-            throw new Error.UntrustedIdentity(e.getMessage());
         }
     }
 
@@ -323,11 +296,11 @@ public class DbusSignalImpl implements Signal {
             final String recipient, final List<Long> messageIds
     ) throws Error.Failure, Error.UntrustedIdentity {
         try {
-            m.sendReadReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()), messageIds);
+            final var results = m.sendReadReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()),
+                    messageIds);
+            checkSendMessageResults(results.timestamp(), results.results());
         } catch (IOException e) {
             throw new Error.Failure(e.getMessage());
-        } catch (UntrustedIdentityException e) {
-            throw new Error.UntrustedIdentity(e.getMessage());
         }
     }
 
@@ -336,11 +309,11 @@ public class DbusSignalImpl implements Signal {
             final String recipient, final List<Long> messageIds
     ) throws Error.Failure, Error.UntrustedIdentity {
         try {
-            m.sendViewedReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()), messageIds);
+            final var results = m.sendViewedReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()),
+                    messageIds);
+            checkSendMessageResults(results.timestamp(), results.results());
         } catch (IOException e) {
             throw new Error.Failure(e.getMessage());
-        } catch (UntrustedIdentityException e) {
-            throw new Error.UntrustedIdentity(e.getMessage());
         }
     }
 
@@ -367,7 +340,7 @@ public class DbusSignalImpl implements Signal {
             final String message, final List<String> attachments
     ) throws Error.AttachmentInvalid, Error.Failure, Error.UntrustedIdentity {
         try {
-            final var results = m.sendMessage(new Message(message, attachments, List.of()),
+            final var results = m.sendMessage(new Message(message, attachments, List.of(), Optional.empty()),
                     Set.of(RecipientIdentifier.NoteToSelf.INSTANCE));
             checkSendMessageResults(results.timestamp(), results.results());
             return results.timestamp();
@@ -390,11 +363,29 @@ public class DbusSignalImpl implements Signal {
         }
     }
 
+    @Override
+    public void deleteRecipient(final String recipient) throws Error.Failure {
+        try {
+            m.deleteRecipient(getSingleRecipientIdentifier(recipient, m.getSelfNumber()));
+        } catch (IOException e) {
+            throw new Error.Failure("Recipient not found");
+        }
+    }
+
+    @Override
+    public void deleteContact(final String recipient) throws Error.Failure {
+        try {
+            m.deleteContact(getSingleRecipientIdentifier(recipient, m.getSelfNumber()));
+        } catch (IOException e) {
+            throw new Error.Failure("Contact not found");
+        }
+    }
+
     @Override
     public long sendGroupMessage(final String message, final List<String> attachments, final byte[] groupId) {
         try {
-            var results = m.sendMessage(new Message(message, attachments, List.of()),
-                    Set.of(new RecipientIdentifier.Group(getGroupId(groupId))));
+            var results = m.sendMessage(new Message(message, attachments, List.of(), Optional.empty()),
+                    Set.of(getGroupRecipientIdentifier(groupId)));
             checkSendMessageResults(results.timestamp(), results.results());
             return results.timestamp();
         } catch (IOException e) {
@@ -406,6 +397,37 @@ public class DbusSignalImpl implements Signal {
         }
     }
 
+    @Override
+    public void sendGroupTyping(
+            final byte[] groupId, final boolean stop
+    ) throws Error.Failure, Error.GroupNotFound, Error.UntrustedIdentity {
+        try {
+            final var results = m.sendTypingMessage(stop ? TypingAction.STOP : TypingAction.START,
+                    Set.of(getGroupRecipientIdentifier(groupId)));
+            checkSendMessageResults(results.timestamp(), results.results());
+        } catch (IOException e) {
+            throw new Error.Failure(e.getMessage());
+        } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
+            throw new Error.GroupNotFound(e.getMessage());
+        }
+    }
+
+    @Override
+    public long sendGroupRemoteDeleteMessage(
+            final long targetSentTimestamp, final byte[] groupId
+    ) {
+        try {
+            final var results = m.sendRemoteDeleteMessage(targetSentTimestamp,
+                    Set.of(getGroupRecipientIdentifier(groupId)));
+            checkSendMessageResults(results.timestamp(), results.results());
+            return results.timestamp();
+        } catch (IOException e) {
+            throw new Error.Failure(e.getMessage());
+        } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) {
+            throw new Error.GroupNotFound(e.getMessage());
+        }
+    }
+
     @Override
     public long sendGroupMessageReaction(
             final String emoji,
@@ -419,7 +441,7 @@ public class DbusSignalImpl implements Signal {
                     remove,
                     getSingleRecipientIdentifier(targetAuthor, m.getSelfNumber()),
                     targetSentTimestamp,
-                    Set.of(new RecipientIdentifier.Group(getGroupId(groupId))));
+                    Set.of(getGroupRecipientIdentifier(groupId)));
             checkSendMessageResults(results.timestamp(), results.results());
             return results.timestamp();
         } catch (IOException e) {
@@ -484,11 +506,7 @@ public class DbusSignalImpl implements Signal {
     @Override
     public List<byte[]> getGroupIds() {
         var groups = m.getGroups();
-        var ids = new ArrayList<byte[]>(groups.size());
-        for (var group : groups) {
-            ids.add(group.groupId().serialize());
-        }
-        return ids;
+        return groups.stream().map(g -> g.groupId().serialize()).toList();
     }
 
     @Override
@@ -544,6 +562,7 @@ public class DbusSignalImpl implements Signal {
             final var memberIdentifiers = getSingleRecipientIdentifiers(members, m.getSelfNumber());
             if (groupId == null) {
                 final var results = m.createGroup(name, memberIdentifiers, avatar == null ? null : new File(avatar));
+                updateGroups();
                 checkSendMessageResults(results.second().timestamp(), results.second().results());
                 return results.first().serialize();
             } else {
@@ -580,9 +599,8 @@ public class DbusSignalImpl implements Signal {
 
     @Override
     public List<Boolean> isRegistered(List<String> numbers) {
-        var results = new ArrayList<Boolean>();
         if (numbers.isEmpty()) {
-            return results;
+            return List.of();
         }
 
         Map<String, Pair<String, UUID>> registered;
@@ -595,7 +613,7 @@ public class DbusSignalImpl implements Signal {
         return numbers.stream().map(number -> {
             var uuid = registered.get(number).second();
             return uuid != null;
-        }).collect(Collectors.toList());
+        }).toList();
     }
 
     @Override
@@ -664,10 +682,10 @@ public class DbusSignalImpl implements Signal {
     public List<String> listNumbers() {
         return Stream.concat(m.getIdentities().stream().map(Identity::recipient),
                         m.getContacts().stream().map(Pair::first))
-                .map(a -> a.getNumber().orElse(null))
+                .map(a -> a.number().orElse(null))
                 .filter(Objects::nonNull)
                 .distinct()
-                .collect(Collectors.toList());
+                .toList();
     }
 
     @Override
@@ -683,7 +701,7 @@ public class DbusSignalImpl implements Signal {
         // Try profiles if no contact name was found
         for (var identity : m.getIdentities()) {
             final var address = identity.recipient();
-            var number = address.getNumber().orElse(null);
+            var number = address.number().orElse(null);
             if (number != null) {
                 Profile profile = null;
                 try {
@@ -766,7 +784,7 @@ public class DbusSignalImpl implements Signal {
     }
 
     private static void checkSendMessageResult(long timestamp, SendMessageResult result) throws DBusExecutionException {
-        var error = ErrorUtils.getErrorMessageFromSendMessageResult(result);
+        var error = SendMessageResultUtils.getErrorMessageFromSendMessageResult(result);
 
         if (error == null) {
             return;
@@ -790,7 +808,7 @@ public class DbusSignalImpl implements Signal {
             return;
         }
 
-        var errors = ErrorUtils.getErrorMessagesFromSendMessageResults(results);
+        var errors = SendMessageResultUtils.getErrorMessagesFromSendMessageResults(results);
         if (errors.size() == 0) {
             return;
         }
@@ -813,7 +831,7 @@ public class DbusSignalImpl implements Signal {
             return;
         }
 
-        var errors = ErrorUtils.getErrorMessagesFromSendMessageResults(results);
+        var errors = SendMessageResultUtils.getErrorMessagesFromSendMessageResults(results);
         if (errors.size() == 0) {
             return;
         }
@@ -829,7 +847,7 @@ public class DbusSignalImpl implements Signal {
     }
 
     private static List<String> getRecipientStrings(final Set<RecipientAddress> members) {
-        return members.stream().map(RecipientAddress::getLegacyIdentifier).collect(Collectors.toList());
+        return members.stream().map(RecipientAddress::getLegacyIdentifier).toList();
     }
 
     private static Set<RecipientIdentifier.Single> getSingleRecipientIdentifiers(
@@ -852,6 +870,10 @@ public class DbusSignalImpl implements Signal {
         }
     }
 
+    private RecipientIdentifier.Group getGroupRecipientIdentifier(final byte[] groupId) {
+        return new RecipientIdentifier.Group(getGroupId(groupId));
+    }
+
     private static GroupId getGroupId(byte[] groupId) throws DBusExecutionException {
         try {
             return GroupId.unknownVersion(groupId);
@@ -1131,6 +1153,16 @@ public class DbusSignalImpl implements Signal {
             }
         }
 
+        @Override
+        public void deleteGroup() throws Error.Failure, Error.LastGroupAdmin {
+            try {
+                m.deleteGroup(groupId);
+            } catch (IOException e) {
+                throw new Error.Failure(e.getMessage());
+            }
+            updateGroups();
+        }
+
         @Override
         public void addMembers(final List<String> recipients) throws Error.Failure {
             final var memberIdentifiers = getSingleRecipientIdentifiers(recipients, m.getSelfNumber());