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