]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/StickerPackStore.java
Implement configuration handling
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / StickerPackStore.java
1 package org.asamk.signal.manager;
2
3 import com.fasterxml.jackson.databind.ObjectMapper;
4
5 import org.asamk.signal.manager.storage.stickers.StickerPackId;
6 import org.asamk.signal.manager.util.IOUtils;
7 import org.whispersystems.signalservice.internal.util.Hex;
8
9 import java.io.BufferedWriter;
10 import java.io.File;
11 import java.io.FileOutputStream;
12 import java.io.IOException;
13 import java.io.OutputStream;
14 import java.io.OutputStreamWriter;
15 import java.nio.charset.StandardCharsets;
16
17 public class StickerPackStore {
18
19 private final File stickersPath;
20
21 public StickerPackStore(final File stickersPath) {
22 this.stickersPath = stickersPath;
23 }
24
25 public boolean existsStickerPack(StickerPackId stickerPackId) {
26 return getStickerPackManifestFile(stickerPackId).exists();
27 }
28
29 public void storeManifest(StickerPackId stickerPackId, JsonStickerPack manifest) throws IOException {
30 try (OutputStream output = new FileOutputStream(getStickerPackManifestFile(stickerPackId))) {
31 try (var writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8))) {
32 new ObjectMapper().writeValue(writer, manifest);
33 }
34 }
35 }
36
37 public void storeSticker(StickerPackId stickerPackId, int stickerId, StickerStorer storer) throws IOException {
38 createStickerPackDir(stickerPackId);
39 try (OutputStream output = new FileOutputStream(getStickerPackStickerFile(stickerPackId, stickerId))) {
40 storer.store(output);
41 }
42 }
43
44 private File getStickerPackManifestFile(StickerPackId stickerPackId) {
45 return new File(getStickerPackPath(stickerPackId), "manifest.json");
46 }
47
48 private File getStickerPackStickerFile(StickerPackId stickerPackId, int stickerId) {
49 return new File(getStickerPackPath(stickerPackId), String.valueOf(stickerId));
50 }
51
52 private File getStickerPackPath(StickerPackId stickerPackId) {
53 return new File(stickersPath, Hex.toStringCondensed(stickerPackId.serialize()));
54 }
55
56 private void createStickerPackDir(StickerPackId stickerPackId) throws IOException {
57 IOUtils.createPrivateDirectories(getStickerPackPath(stickerPackId));
58 }
59
60 @FunctionalInterface
61 public interface StickerStorer {
62
63 void store(OutputStream outputStream) throws IOException;
64 }
65 }