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