]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/Manager.java
Add sendTyping command
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / Manager.java
index 994d1e61f08c43cff730577b9c6fae5b7fe10b91..2500371f566a231c342ee396c21543c759d4556e 100644 (file)
@@ -17,6 +17,7 @@
 package org.asamk.signal.manager;
 
 import org.asamk.signal.manager.api.Device;
+import org.asamk.signal.manager.api.TypingAction;
 import org.asamk.signal.manager.config.ServiceConfig;
 import org.asamk.signal.manager.config.ServiceEnvironment;
 import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
@@ -106,6 +107,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
 import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
+import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.BlockedListMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.ContactsMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceContact;
@@ -1597,6 +1599,40 @@ public class Manager implements Closeable {
         }
     }
 
+    public void sendTypingMessage(
+            TypingAction action, Set<String> recipients
+    ) throws IOException, UntrustedIdentityException, InvalidNumberException {
+        sendTypingMessageInternal(action, getSignalServiceAddresses(recipients));
+    }
+
+    private void sendTypingMessageInternal(
+            TypingAction action, Set<RecipientId> recipientIds
+    ) throws IOException, UntrustedIdentityException {
+        final var timestamp = System.currentTimeMillis();
+        var message = new SignalServiceTypingMessage(action.toSignalService(), timestamp, Optional.absent());
+        var messageSender = createMessageSender();
+        for (var recipientId : recipientIds) {
+            final var address = resolveSignalServiceAddress(recipientId);
+            messageSender.sendTyping(address, unidentifiedAccessHelper.getAccessFor(recipientId), message);
+        }
+    }
+
+    public void sendGroupTypingMessage(
+            TypingAction action, GroupId groupId
+    ) throws IOException, NotAGroupMemberException, GroupNotFoundException {
+        final var timestamp = System.currentTimeMillis();
+        final var g = getGroupForSending(groupId);
+        final var message = new SignalServiceTypingMessage(action.toSignalService(),
+                timestamp,
+                Optional.of(groupId.serialize()));
+        final var messageSender = createMessageSender();
+        final var recipientIdList = new ArrayList<>(g.getMembersWithout(account.getSelfRecipientId()));
+        final var addresses = recipientIdList.stream()
+                .map(this::resolveSignalServiceAddress)
+                .collect(Collectors.toList());
+        messageSender.sendTyping(addresses, unidentifiedAccessHelper.getAccessFor(recipientIdList), message, null);
+    }
+
     private Pair<Long, List<SendMessageResult>> sendMessage(
             SignalServiceDataMessage.Builder messageBuilder, Set<RecipientId> recipientIds
     ) throws IOException {