+package org.asamk.signal.manager.api;
+
+import org.asamk.signal.manager.helper.RecipientAddressResolver;
+import org.asamk.signal.manager.storage.recipients.RecipientAddress;
+import org.asamk.signal.manager.storage.recipients.RecipientResolver;
+import org.whispersystems.libsignal.IdentityKey;
+
+public record SendMessageResult(
+ RecipientAddress address,
+ boolean isSuccess,
+ boolean isNetworkFailure,
+ boolean isUnregisteredFailure,
+ boolean isIdentityFailure,
+ ProofRequiredException proofRequiredFailure
+) {
+
+ public static SendMessageResult success(RecipientAddress address) {
+ return new SendMessageResult(address, true, false, false, false, null);
+ }
+
+ public static SendMessageResult networkFailure(RecipientAddress address) {
+ return new SendMessageResult(address, false, true, false, false, null);
+ }
+
+ public static SendMessageResult unregisteredFailure(RecipientAddress address) {
+ return new SendMessageResult(address, false, false, true, false, null);
+ }
+
+ public static SendMessageResult identityFailure(RecipientAddress address, IdentityKey identityKey) {
+ return new SendMessageResult(address, false, false, false, true, null);
+ }
+
+ public static SendMessageResult proofRequiredFailure(
+ RecipientAddress address, ProofRequiredException proofRequiredException
+ ) {
+ return new SendMessageResult(address, false, true, false, false, proofRequiredException);
+ }
+
+ public static SendMessageResult from(
+ final org.whispersystems.signalservice.api.messages.SendMessageResult sendMessageResult,
+ RecipientResolver recipientResolver,
+ RecipientAddressResolver addressResolver
+ ) {
+ return new SendMessageResult(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(
+ sendMessageResult.getAddress())),
+ sendMessageResult.isSuccess(),
+ sendMessageResult.isNetworkFailure(),
+ sendMessageResult.isUnregisteredFailure(),
+ sendMessageResult.getIdentityFailure() != null,
+ sendMessageResult.getProofRequiredFailure() == null
+ ? null
+ : new ProofRequiredException(sendMessageResult.getProofRequiredFailure()));
+ }
+
+ public record IdentityFailure(IdentityKey identityKey) {}
+}