]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/stickers/StickerStore.java
19803bdc64ec0f36255f807d36440fac8047bb57
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / stickers / StickerStore.java
1 package org.asamk.signal.manager.storage.stickers;
2
3 import java.util.Base64;
4 import java.util.HashMap;
5 import java.util.HashSet;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.Objects;
9 import java.util.stream.Collectors;
10
11 public class StickerStore {
12
13 private final Map<StickerPackId, Sticker> stickers;
14
15 private final Saver saver;
16
17 public StickerStore(final Saver saver) {
18 this.saver = saver;
19 stickers = new HashMap<>();
20 }
21
22 public StickerStore(final Map<StickerPackId, Sticker> stickers, final Saver saver) {
23 this.stickers = stickers;
24 this.saver = saver;
25 }
26
27 public static StickerStore fromStorage(Storage storage, Saver saver) {
28 final var packIds = new HashSet<StickerPackId>();
29 final var stickers = storage.stickers.stream().map(s -> {
30 var packId = StickerPackId.deserialize(Base64.getDecoder().decode(s.packId));
31 if (packIds.contains(packId)) {
32 // Remove legacy duplicate packIds ...
33 return null;
34 }
35 packIds.add(packId);
36 var packKey = Base64.getDecoder().decode(s.packKey);
37 var installed = s.installed;
38 return new Sticker(packId, packKey, installed);
39 }).filter(Objects::nonNull).collect(Collectors.toMap(Sticker::getPackId, s -> s));
40
41 return new StickerStore(stickers, saver);
42 }
43
44 public Sticker getSticker(StickerPackId packId) {
45 synchronized (stickers) {
46 return stickers.get(packId);
47 }
48 }
49
50 public void updateSticker(Sticker sticker) {
51 Storage storage;
52 synchronized (stickers) {
53 stickers.put(sticker.getPackId(), sticker);
54 storage = toStorageLocked();
55 }
56 saver.save(storage);
57 }
58
59 private Storage toStorageLocked() {
60 return new Storage(stickers.values()
61 .stream()
62 .map(s -> new Storage.Sticker(Base64.getEncoder().encodeToString(s.getPackId().serialize()),
63 Base64.getEncoder().encodeToString(s.getPackKey()),
64 s.isInstalled()))
65 .collect(Collectors.toList()));
66 }
67
68 public static class Storage {
69
70 public List<Storage.Sticker> stickers;
71
72 // For deserialization
73 private Storage() {
74 }
75
76 public Storage(final List<Sticker> stickers) {
77 this.stickers = stickers;
78 }
79
80 private static class Sticker {
81
82 public String packId;
83 public String packKey;
84 public boolean installed;
85
86 // For deserialization
87 private Sticker() {
88 }
89
90 public Sticker(final String packId, final String packKey, final boolean installed) {
91 this.packId = packId;
92 this.packKey = packKey;
93 this.installed = installed;
94 }
95 }
96 }
97
98 public interface Saver {
99
100 void save(Storage storage);
101 }
102 }