]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/storage/groups/GroupInfo.java
Remove ThreadStore and store message expiration time in group/contact store
[signal-cli] / src / main / java / org / asamk / signal / storage / groups / GroupInfo.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 GroupInfo {
25
26 private static final ObjectMapper jsonProcessor = new ObjectMapper();
27
28 @JsonProperty
29 public final byte[] groupId;
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 private long avatarId;
50
51 @JsonProperty
52 @JsonIgnore
53 private boolean active;
54
55 public GroupInfo(byte[] groupId) {
56 this.groupId = groupId;
57 }
58
59 public GroupInfo(@JsonProperty("groupId") byte[] groupId, @JsonProperty("name") String name, @JsonProperty("members") Collection<SignalServiceAddress> members, @JsonProperty("avatarId") long avatarId, @JsonProperty("color") String color, @JsonProperty("blocked") boolean blocked, @JsonProperty("inboxPosition") Integer inboxPosition, @JsonProperty("archived") boolean archived, @JsonProperty("messageExpirationTime") int messageExpirationTime) {
60 this.groupId = groupId;
61 this.name = name;
62 this.members.addAll(members);
63 this.avatarId = avatarId;
64 this.color = color;
65 this.blocked = blocked;
66 this.inboxPosition = inboxPosition;
67 this.archived = archived;
68 this.messageExpirationTime = messageExpirationTime;
69 }
70
71 @JsonIgnore
72 public long getAvatarId() {
73 return avatarId;
74 }
75
76 @JsonIgnore
77 public Set<SignalServiceAddress> getMembers() {
78 return members;
79 }
80
81 @JsonIgnore
82 public Set<String> getMembersE164() {
83 Set<String> membersE164 = new HashSet<>();
84 for (SignalServiceAddress member : members) {
85 if (!member.getNumber().isPresent()) {
86 continue;
87 }
88 membersE164.add(member.getNumber().get());
89 }
90 return membersE164;
91 }
92
93 @JsonIgnore
94 public Set<SignalServiceAddress> getMembersWithout(SignalServiceAddress address) {
95 Set<SignalServiceAddress> members = new HashSet<>(this.members.size());
96 for (SignalServiceAddress member : this.members) {
97 if (!member.matches(address)) {
98 members.add(member);
99 }
100 }
101 return members;
102 }
103
104 public void addMembers(Collection<SignalServiceAddress> addresses) {
105 for (SignalServiceAddress address : addresses) {
106 removeMember(address);
107 this.members.add(address);
108 }
109 }
110
111 public void removeMember(SignalServiceAddress address) {
112 this.members.removeIf(member -> member.matches(address));
113 }
114
115 @JsonIgnore
116 public boolean isMember(SignalServiceAddress address) {
117 for (SignalServiceAddress member : this.members) {
118 if (member.matches(address)) {
119 return true;
120 }
121 }
122 return false;
123 }
124
125 private static final class JsonSignalServiceAddress {
126
127 @JsonProperty
128 private UUID uuid;
129
130 @JsonProperty
131 private String number;
132
133 JsonSignalServiceAddress(@JsonProperty("uuid") final UUID uuid, @JsonProperty("number") final String number) {
134 this.uuid = uuid;
135 this.number = number;
136 }
137
138 JsonSignalServiceAddress(SignalServiceAddress address) {
139 this.uuid = address.getUuid().orNull();
140 this.number = address.getNumber().orNull();
141 }
142
143 SignalServiceAddress toSignalServiceAddress() {
144 return new SignalServiceAddress(uuid, number);
145 }
146 }
147
148 private static class MembersSerializer extends JsonSerializer<Set<SignalServiceAddress>> {
149
150 @Override
151 public void serialize(final Set<SignalServiceAddress> value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException {
152 jgen.writeStartArray(value.size());
153 for (SignalServiceAddress address : value) {
154 if (address.getUuid().isPresent()) {
155 jgen.writeObject(new JsonSignalServiceAddress(address));
156 } else {
157 jgen.writeString(address.getNumber().get());
158 }
159 }
160 jgen.writeEndArray();
161 }
162 }
163
164 private static class MembersDeserializer extends JsonDeserializer<Set<SignalServiceAddress>> {
165
166 @Override
167 public Set<SignalServiceAddress> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
168 Set<SignalServiceAddress> addresses = new HashSet<>();
169 JsonNode node = jsonParser.getCodec().readTree(jsonParser);
170 for (JsonNode n : node) {
171 if (n.isTextual()) {
172 addresses.add(new SignalServiceAddress(null, n.textValue()));
173 } else {
174 JsonSignalServiceAddress address = jsonProcessor.treeToValue(n, JsonSignalServiceAddress.class);
175 addresses.add(address.toSignalServiceAddress());
176 }
177 }
178
179 return addresses;
180 }
181 }
182 }