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