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