]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
Add mobile-coin-address to updateProfile command
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / ManagerImpl.java
index f6205dba7c7c59b0fb3ae83644a5f48c01f35bbb..96196f8ff8e6f3fc89039f4ab6bb424fd2cc8173 100644 (file)
@@ -38,6 +38,7 @@ import org.asamk.signal.manager.api.StickerPackUrl;
 import org.asamk.signal.manager.api.TypingAction;
 import org.asamk.signal.manager.api.UnregisteredRecipientException;
 import org.asamk.signal.manager.api.UpdateGroup;
+import org.asamk.signal.manager.api.UpdateProfile;
 import org.asamk.signal.manager.api.UserStatus;
 import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
 import org.asamk.signal.manager.groups.GroupId;
@@ -51,9 +52,8 @@ import org.asamk.signal.manager.helper.Context;
 import org.asamk.signal.manager.storage.SignalAccount;
 import org.asamk.signal.manager.storage.groups.GroupInfo;
 import org.asamk.signal.manager.storage.identities.IdentityInfo;
-import org.asamk.signal.manager.storage.recipients.Contact;
 import org.asamk.signal.manager.storage.recipients.Profile;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
+import org.asamk.signal.manager.storage.recipients.Recipient;
 import org.asamk.signal.manager.storage.recipients.RecipientId;
 import org.asamk.signal.manager.storage.stickerPacks.JsonStickerPack;
 import org.asamk.signal.manager.storage.stickerPacks.StickerPackStore;
@@ -84,6 +84,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
@@ -101,7 +102,6 @@ class ManagerImpl implements Manager {
     private final static Logger logger = LoggerFactory.getLogger(ManagerImpl.class);
 
     private SignalAccount account;
-    private AccountFileUpdater accountFileUpdater;
     private final SignalDependencies dependencies;
     private final Context context;
 
@@ -123,7 +123,6 @@ class ManagerImpl implements Manager {
             String userAgent
     ) {
         this.account = account;
-        this.accountFileUpdater = accountFileUpdater;
 
         final var sessionLock = new SignalSessionLock() {
             private final ReentrantLock LEGACY_LOCK = new ReentrantLock();
@@ -263,10 +262,16 @@ class ManagerImpl implements Manager {
     }
 
     @Override
-    public void setProfile(
-            String givenName, final String familyName, String about, String aboutEmoji, Optional<File> avatar
-    ) throws IOException {
-        context.getProfileHelper().setProfile(givenName, familyName, about, aboutEmoji, avatar);
+    public void updateProfile(UpdateProfile updateProfile) throws IOException {
+        context.getProfileHelper()
+                .setProfile(updateProfile.getGivenName(),
+                        updateProfile.getFamilyName(),
+                        updateProfile.getAbout(),
+                        updateProfile.getAboutEmoji(),
+                        updateProfile.isDeleteAvatar()
+                                ? Optional.empty()
+                                : updateProfile.getAvatar() == null ? null : Optional.of(updateProfile.getAvatar()),
+                        updateProfile.getMobileCoinAddress());
         context.getSyncHelper().sendSyncFetchProfileMessage();
     }
 
@@ -337,7 +342,7 @@ class ManagerImpl implements Manager {
     }
 
     @Override
-    public Profile getRecipientProfile(RecipientIdentifier.Single recipient) throws IOException, UnregisteredRecipientException {
+    public Profile getRecipientProfile(RecipientIdentifier.Single recipient) throws UnregisteredRecipientException {
         return context.getProfileHelper().getRecipientProfile(context.getRecipientHelper().resolveRecipient(recipient));
     }
 
@@ -495,7 +500,7 @@ class ManagerImpl implements Manager {
     @Override
     public SendMessageResults sendReadReceipt(
             RecipientIdentifier.Single sender, List<Long> messageIds
-    ) throws IOException {
+    ) {
         final var timestamp = System.currentTimeMillis();
         var receiptMessage = new SignalServiceReceiptMessage(SignalServiceReceiptMessage.Type.READ,
                 messageIds,
@@ -507,7 +512,7 @@ class ManagerImpl implements Manager {
     @Override
     public SendMessageResults sendViewedReceipt(
             RecipientIdentifier.Single sender, List<Long> messageIds
-    ) throws IOException {
+    ) {
         final var timestamp = System.currentTimeMillis();
         var receiptMessage = new SignalServiceReceiptMessage(SignalServiceReceiptMessage.Type.VIEWED,
                 messageIds,
@@ -520,7 +525,7 @@ class ManagerImpl implements Manager {
             final RecipientIdentifier.Single sender,
             final long timestamp,
             final SignalServiceReceiptMessage receiptMessage
-    ) throws IOException {
+    ) {
         try {
             final var result = context.getSendHelper()
                     .sendReceiptMessage(receiptMessage, context.getRecipientHelper().resolveRecipient(sender));
@@ -592,7 +597,7 @@ class ManagerImpl implements Manager {
         }
     }
 
-    private ArrayList<SignalServiceDataMessage.Mention> resolveMentions(final List<Message.Mention> mentionList) throws IOException, UnregisteredRecipientException {
+    private ArrayList<SignalServiceDataMessage.Mention> resolveMentions(final List<Message.Mention> mentionList) throws UnregisteredRecipientException {
         final var mentions = new ArrayList<SignalServiceDataMessage.Mention>();
         for (final var m : mentionList) {
             final var recipientId = context.getRecipientHelper().resolveRecipient(m.recipient());
@@ -640,6 +645,20 @@ class ManagerImpl implements Manager {
         return sendMessage(messageBuilder, recipients);
     }
 
+    @Override
+    public SendMessageResults sendPaymentNotificationMessage(
+            byte[] receipt, String note, RecipientIdentifier.Single recipient
+    ) throws IOException {
+        final var paymentNotification = new SignalServiceDataMessage.PaymentNotification(receipt, note);
+        final var payment = new SignalServiceDataMessage.Payment(paymentNotification);
+        final var messageBuilder = SignalServiceDataMessage.newBuilder().withPayment(payment);
+        try {
+            return sendMessage(messageBuilder, Set.of(recipient));
+        } catch (NotAGroupMemberException | GroupNotFoundException | GroupSendingNotAllowedException e) {
+            throw new AssertionError(e);
+        }
+    }
+
     @Override
     public SendMessageResults sendEndSessionMessage(Set<RecipientIdentifier.Single> recipients) throws IOException {
         var messageBuilder = SignalServiceDataMessage.newBuilder().asEndSessionMessage();
@@ -676,7 +695,7 @@ class ManagerImpl implements Manager {
     @Override
     public void setContactName(
             RecipientIdentifier.Single recipient, String name
-    ) throws NotMasterDeviceException, IOException, UnregisteredRecipientException {
+    ) throws NotMasterDeviceException, UnregisteredRecipientException {
         if (!account.isMasterDevice()) {
             throw new NotMasterDeviceException();
         }
@@ -694,27 +713,48 @@ class ManagerImpl implements Manager {
             return;
         }
         final var recipientIds = context.getRecipientHelper().resolveRecipients(recipients);
+        final var selfRecipientId = account.getSelfRecipientId();
+        boolean shouldRotateProfileKey = false;
         for (final var recipientId : recipientIds) {
+            if (context.getContactHelper().isContactBlocked(recipientId) == blocked) {
+                continue;
+            }
             context.getContactHelper().setContactBlocked(recipientId, blocked);
+            // if we don't have a common group with the blocked contact we need to rotate the profile key
+            shouldRotateProfileKey = blocked && (
+                    shouldRotateProfileKey || account.getGroupStore()
+                            .getGroups()
+                            .stream()
+                            .noneMatch(g -> g.isMember(selfRecipientId) && g.isMember(recipientId))
+            );
+        }
+        if (shouldRotateProfileKey) {
+            context.getProfileHelper().rotateProfileKey();
         }
-        // TODO cycle our profile key, if we're not together in a group with recipient
         context.getSyncHelper().sendBlockedList();
     }
 
     @Override
     public void setGroupsBlocked(
             final Collection<GroupId> groupIds, final boolean blocked
-    ) throws GroupNotFoundException, NotMasterDeviceException {
+    ) throws GroupNotFoundException, NotMasterDeviceException, IOException {
         if (!account.isMasterDevice()) {
             throw new NotMasterDeviceException();
         }
         if (groupIds.size() == 0) {
             return;
         }
+        boolean shouldRotateProfileKey = false;
         for (final var groupId : groupIds) {
+            if (context.getGroupHelper().isGroupBlocked(groupId) == blocked) {
+                continue;
+            }
             context.getGroupHelper().setGroupBlocked(groupId, blocked);
+            shouldRotateProfileKey = blocked;
+        }
+        if (shouldRotateProfileKey) {
+            context.getProfileHelper().rotateProfileKey();
         }
-        // TODO cycle our profile key
         context.getSyncHelper().sendBlockedList();
     }
 
@@ -911,7 +951,7 @@ class ManagerImpl implements Manager {
         final RecipientId recipientId;
         try {
             recipientId = context.getRecipientHelper().resolveRecipient(recipient);
-        } catch (IOException | UnregisteredRecipientException e) {
+        } catch (UnregisteredRecipientException e) {
             return false;
         }
         return context.getContactHelper().isContactBlocked(recipientId);
@@ -923,12 +963,22 @@ class ManagerImpl implements Manager {
     }
 
     @Override
-    public List<Pair<RecipientAddress, Contact>> getContacts() {
-        return account.getContactStore()
-                .getContacts()
-                .stream()
-                .map(p -> new Pair<>(account.getRecipientStore().resolveRecipientAddress(p.first()), p.second()))
-                .toList();
+    public List<Recipient> getRecipients(
+            boolean onlyContacts,
+            Optional<Boolean> blocked,
+            Collection<RecipientIdentifier.Single> recipients,
+            Optional<String> name
+    ) {
+        final var recipientIds = recipients.stream().map(a -> {
+            try {
+                return context.getRecipientHelper().resolveRecipient(a);
+            } catch (UnregisteredRecipientException e) {
+                return null;
+            }
+        }).filter(Objects::nonNull).collect(Collectors.toSet());
+        // refresh profiles of explicitly given recipients
+        context.getProfileHelper().refreshRecipientProfiles(recipientIds);
+        return account.getRecipientStore().getRecipients(onlyContacts, blocked, recipientIds, name);
     }
 
     @Override
@@ -936,7 +986,7 @@ class ManagerImpl implements Manager {
         final RecipientId recipientId;
         try {
             recipientId = context.getRecipientHelper().resolveRecipient(recipient);
-        } catch (IOException | UnregisteredRecipientException e) {
+        } catch (UnregisteredRecipientException e) {
             return null;
         }
 
@@ -986,7 +1036,7 @@ class ManagerImpl implements Manager {
         try {
             identity = account.getIdentityKeyStore()
                     .getIdentity(context.getRecipientHelper().resolveRecipient(recipient));
-        } catch (IOException | UnregisteredRecipientException e) {
+        } catch (UnregisteredRecipientException e) {
             identity = null;
         }
         return identity == null ? List.of() : List.of(toIdentity(identity));
@@ -1023,12 +1073,7 @@ class ManagerImpl implements Manager {
     private boolean trustIdentity(
             RecipientIdentifier.Single recipient, Function<RecipientId, Boolean> trustMethod
     ) throws UnregisteredRecipientException {
-        RecipientId recipientId;
-        try {
-            recipientId = context.getRecipientHelper().resolveRecipient(recipient);
-        } catch (IOException e) {
-            return false;
-        }
+        final var recipientId = context.getRecipientHelper().resolveRecipient(recipient);
         final var updated = trustMethod.apply(recipientId);
         if (updated && this.isReceiving()) {
             context.getReceiveHelper().setNeedsToRetryFailedMessages(true);