]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/storage/groups/GroupInfoV1.java
b06e2436b7e4a79f313b80b449be1a74aaa6c165
[signal-cli] / src / main / java / org / asamk / signal / storage / groups / GroupInfoV1.java
1 package org.asamk.signal.storage.groups;
2
3 import com.fasterxml.jackson.annotation.JsonIgnore;
4 import com.fasterxml.jackson.annotation.JsonProperty;
5 import com.fasterxml.jackson.core.JsonGenerator;
6 import com.fasterxml.jackson.core.JsonParser;
7 import com.fasterxml.jackson.databind.DeserializationContext;
8 import com.fasterxml.jackson.databind.JsonDeserializer;
9 import com.fasterxml.jackson.databind.JsonNode;
10 import com.fasterxml.jackson.databind.JsonSerializer;
11 import com.fasterxml.jackson.databind.ObjectMapper;
12 import com.fasterxml.jackson.databind.SerializerProvider;
13 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
14 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
15
16 import org.asamk.signal.manager.GroupInviteLinkUrl;
17 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
18
19 import java.io.IOException;
20 import java.util.Collection;
21 import java.util.HashSet;
22 import java.util.Set;
23 import java.util.UUID;
24
25 public class GroupInfoV1 extends GroupInfo {
26
27 private static final ObjectMapper jsonProcessor = new ObjectMapper();
28
29 @JsonProperty
30 public byte[] expectedV2Id;
31
32 @JsonProperty
33 public String name;
34
35 @JsonProperty
36 @JsonDeserialize(using = MembersDeserializer.class)
37 @JsonSerialize(using = MembersSerializer.class)
38 public Set<SignalServiceAddress> members = new HashSet<>();
39 @JsonProperty
40 public String color;
41 @JsonProperty(defaultValue = "0")
42 public int messageExpirationTime;
43 @JsonProperty(defaultValue = "false")
44 public boolean blocked;
45 @JsonProperty
46 public Integer inboxPosition;
47 @JsonProperty(defaultValue = "false")
48 public boolean archived;
49
50 public GroupInfoV1(byte[] groupId) {
51 super(groupId);
52 }
53
54 @Override
55 public String getTitle() {
56 return name;
57 }
58
59 @Override
60 public GroupInviteLinkUrl getGroupInviteLink() {
61 return null;
62 }
63
64 public GroupInfoV1(
65 @JsonProperty("groupId") byte[] groupId,
66 @JsonProperty("expectedV2Id") byte[] expectedV2Id,
67 @JsonProperty("name") String name,
68 @JsonProperty("members") Collection<SignalServiceAddress> members,
69 @JsonProperty("avatarId") long _ignored_avatarId,
70 @JsonProperty("color") String color,
71 @JsonProperty("blocked") boolean blocked,
72 @JsonProperty("inboxPosition") Integer inboxPosition,
73 @JsonProperty("archived") boolean archived,
74 @JsonProperty("messageExpirationTime") int messageExpirationTime,
75 @JsonProperty("active") boolean _ignored_active
76 ) {
77 super(groupId);
78 this.expectedV2Id = expectedV2Id;
79 this.name = name;
80 this.members.addAll(members);
81 this.color = color;
82 this.blocked = blocked;
83 this.inboxPosition = inboxPosition;
84 this.archived = archived;
85 this.messageExpirationTime = messageExpirationTime;
86 }
87
88 @JsonIgnore
89 public Set<SignalServiceAddress> getMembers() {
90 return members;
91 }
92
93 @Override
94 public boolean isBlocked() {
95 return blocked;
96 }
97
98 @Override
99 public void setBlocked(final boolean blocked) {
100 this.blocked = blocked;
101 }
102
103 @Override
104 public int getMessageExpirationTime() {
105 return messageExpirationTime;
106 }
107
108 public void addMembers(Collection<SignalServiceAddress> addresses) {
109 for (SignalServiceAddress address : addresses) {
110 if (this.members.contains(address)) {
111 continue;
112 }
113 removeMember(address);
114 this.members.add(address);
115 }
116 }
117
118 public void removeMember(SignalServiceAddress address) {
119 this.members.removeIf(member -> member.matches(address));
120 }
121
122 private static final class JsonSignalServiceAddress {
123
124 @JsonProperty
125 private UUID uuid;
126
127 @JsonProperty
128 private String number;
129
130 JsonSignalServiceAddress(@JsonProperty("uuid") final UUID uuid, @JsonProperty("number") final String number) {
131 this.uuid = uuid;
132 this.number = number;
133 }
134
135 JsonSignalServiceAddress(SignalServiceAddress address) {
136 this.uuid = address.getUuid().orNull();
137 this.number = address.getNumber().orNull();
138 }
139
140 SignalServiceAddress toSignalServiceAddress() {
141 return new SignalServiceAddress(uuid, number);
142 }
143 }
144
145 private static class MembersSerializer extends JsonSerializer<Set<SignalServiceAddress>> {
146
147 @Override
148 public void serialize(
149 final Set<SignalServiceAddress> value, final JsonGenerator jgen, final SerializerProvider provider
150 ) throws IOException {
151 jgen.writeStartArray(value.size());
152 for (SignalServiceAddress address : value) {
153 if (address.getUuid().isPresent()) {
154 jgen.writeObject(new JsonSignalServiceAddress(address));
155 } else {
156 jgen.writeString(address.getNumber().get());
157 }
158 }
159 jgen.writeEndArray();
160 }
161 }
162
163 private static class MembersDeserializer extends JsonDeserializer<Set<SignalServiceAddress>> {
164
165 @Override
166 public Set<SignalServiceAddress> deserialize(
167 JsonParser jsonParser, DeserializationContext deserializationContext
168 ) throws IOException {
169 Set<SignalServiceAddress> addresses = new HashSet<>();
170 JsonNode node = jsonParser.getCodec().readTree(jsonParser);
171 for (JsonNode n : node) {
172 if (n.isTextual()) {
173 addresses.add(new SignalServiceAddress(null, n.textValue()));
174 } else {
175 JsonSignalServiceAddress address = jsonProcessor.treeToValue(n, JsonSignalServiceAddress.class);
176 addresses.add(address.toSignalServiceAddress());
177 }
178 }
179
180 return addresses;
181 }
182 }
183 }