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