]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/api/RecipientIdentifier.java
Update libsignal-service
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / api / RecipientIdentifier.java
1 package org.asamk.signal.manager.api;
2
3 import org.asamk.signal.manager.util.PhoneNumberFormatter;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6 import org.whispersystems.signalservice.api.util.UuidUtil;
7
8 import java.util.UUID;
9
10 public sealed interface RecipientIdentifier {
11
12 String getIdentifier();
13
14 record NoteToSelf() implements RecipientIdentifier {
15
16 public static final NoteToSelf INSTANCE = new NoteToSelf();
17
18 @Override
19 public String getIdentifier() {
20 return "Note-To-Self";
21 }
22 }
23
24 sealed interface Single extends RecipientIdentifier {
25
26 static Single fromString(String identifier, String localNumber) throws InvalidNumberException {
27 if (UuidUtil.isUuid(identifier)) {
28 return new Uuid(UUID.fromString(identifier));
29 }
30
31 if (identifier.startsWith("PNI:")) {
32 final var pni = identifier.substring(4);
33 if (!UuidUtil.isUuid(pni)) {
34 throw new InvalidNumberException("Invalid PNI");
35 }
36 return new Pni(UUID.fromString(pni));
37 }
38
39 if (identifier.startsWith("u:")) {
40 return new Username(identifier.substring(2));
41 }
42
43 final var normalizedNumber = PhoneNumberFormatter.formatNumber(identifier, localNumber);
44 if (!normalizedNumber.equals(identifier)) {
45 final Logger logger = LoggerFactory.getLogger(RecipientIdentifier.class);
46 logger.debug("Normalized number {} to {}.", identifier, normalizedNumber);
47 }
48 return new Number(normalizedNumber);
49 }
50
51 static Single fromAddress(RecipientAddress address) {
52 if (address.number().isPresent()) {
53 return new Number(address.number().get());
54 } else if (address.aci().isPresent()) {
55 return new Uuid(UUID.fromString(address.aci().get()));
56 } else if (address.pni().isPresent()) {
57 return new Pni(UUID.fromString(address.pni().get().substring(4)));
58 } else if (address.username().isPresent()) {
59 return new Username(address.username().get());
60 }
61 throw new AssertionError("RecipientAddress without identifier");
62 }
63
64 RecipientAddress toPartialRecipientAddress();
65 }
66
67 record Uuid(UUID uuid) implements Single {
68
69 @Override
70 public String getIdentifier() {
71 return uuid.toString();
72 }
73
74 @Override
75 public RecipientAddress toPartialRecipientAddress() {
76 return new RecipientAddress(uuid);
77 }
78 }
79
80 record Pni(UUID pni) implements Single {
81
82 @Override
83 public String getIdentifier() {
84 return "PNI:" + pni.toString();
85 }
86
87 @Override
88 public RecipientAddress toPartialRecipientAddress() {
89 return new RecipientAddress(null, getIdentifier(), null, null);
90 }
91 }
92
93 record Number(String number) implements Single {
94
95 @Override
96 public String getIdentifier() {
97 return number;
98 }
99
100 @Override
101 public RecipientAddress toPartialRecipientAddress() {
102 return new RecipientAddress(number);
103 }
104 }
105
106 record Username(String username) implements Single {
107
108 @Override
109 public String getIdentifier() {
110 return "u:" + username;
111 }
112
113 @Override
114 public RecipientAddress toPartialRecipientAddress() {
115 return new RecipientAddress(null, null, null, username);
116 }
117 }
118
119 record Group(GroupId groupId) implements RecipientIdentifier {
120
121 @Override
122 public String getIdentifier() {
123 return groupId.toBase64();
124 }
125 }
126 }