]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/util/StickerUtils.java
fd5ce77b666f5b646ecf6699e33ef17ff734a120
[signal-cli] / src / main / java / org / asamk / signal / manager / util / StickerUtils.java
1 package org.asamk.signal.manager.util;
2
3 import com.fasterxml.jackson.databind.ObjectMapper;
4
5 import org.asamk.signal.manager.JsonStickerPack;
6 import org.asamk.signal.manager.StickerPackInvalidException;
7 import org.whispersystems.libsignal.util.Pair;
8 import org.whispersystems.libsignal.util.guava.Optional;
9 import org.whispersystems.signalservice.api.messages.SignalServiceStickerManifestUpload;
10
11 import java.io.File;
12 import java.io.FileInputStream;
13 import java.io.IOException;
14 import java.io.InputStream;
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.zip.ZipEntry;
18 import java.util.zip.ZipFile;
19
20 public class StickerUtils {
21
22 public static SignalServiceStickerManifestUpload getSignalServiceStickerManifestUpload(
23 final File file
24 ) throws IOException, StickerPackInvalidException {
25 ZipFile zip = null;
26 String rootPath = null;
27
28 if (file.getName().endsWith(".zip")) {
29 zip = new ZipFile(file);
30 } else if (file.getName().equals("manifest.json")) {
31 rootPath = file.getParent();
32 } else {
33 throw new StickerPackInvalidException("Could not find manifest.json");
34 }
35
36 JsonStickerPack pack = parseStickerPack(rootPath, zip);
37
38 if (pack.stickers == null) {
39 throw new StickerPackInvalidException("Must set a 'stickers' field.");
40 }
41
42 if (pack.stickers.isEmpty()) {
43 throw new StickerPackInvalidException("Must include stickers.");
44 }
45
46 List<SignalServiceStickerManifestUpload.StickerInfo> stickers = new ArrayList<>(pack.stickers.size());
47 for (JsonStickerPack.JsonSticker sticker : pack.stickers) {
48 if (sticker.file == null) {
49 throw new StickerPackInvalidException("Must set a 'file' field on each sticker.");
50 }
51
52 Pair<InputStream, Long> data;
53 try {
54 data = getInputStreamAndLength(rootPath, zip, sticker.file);
55 } catch (IOException ignored) {
56 throw new StickerPackInvalidException("Could not find find " + sticker.file);
57 }
58
59 String contentType = Utils.getFileMimeType(new File(sticker.file), null);
60 SignalServiceStickerManifestUpload.StickerInfo stickerInfo = new SignalServiceStickerManifestUpload.StickerInfo(
61 data.first(),
62 data.second(),
63 Optional.fromNullable(sticker.emoji).or(""),
64 contentType);
65 stickers.add(stickerInfo);
66 }
67
68 SignalServiceStickerManifestUpload.StickerInfo cover = null;
69 if (pack.cover != null) {
70 if (pack.cover.file == null) {
71 throw new StickerPackInvalidException("Must set a 'file' field on the cover.");
72 }
73
74 Pair<InputStream, Long> data;
75 try {
76 data = getInputStreamAndLength(rootPath, zip, pack.cover.file);
77 } catch (IOException ignored) {
78 throw new StickerPackInvalidException("Could not find find " + pack.cover.file);
79 }
80
81 String contentType = Utils.getFileMimeType(new File(pack.cover.file), null);
82 cover = new SignalServiceStickerManifestUpload.StickerInfo(data.first(),
83 data.second(),
84 Optional.fromNullable(pack.cover.emoji).or(""),
85 contentType);
86 }
87
88 return new SignalServiceStickerManifestUpload(pack.title, pack.author, cover, stickers);
89 }
90
91 private static JsonStickerPack parseStickerPack(String rootPath, ZipFile zip) throws IOException {
92 InputStream inputStream;
93 if (zip != null) {
94 inputStream = zip.getInputStream(zip.getEntry("manifest.json"));
95 } else {
96 inputStream = new FileInputStream((new File(rootPath, "manifest.json")));
97 }
98 return new ObjectMapper().readValue(inputStream, JsonStickerPack.class);
99 }
100
101 private static Pair<InputStream, Long> getInputStreamAndLength(
102 final String rootPath, final ZipFile zip, final String subfile
103 ) throws IOException {
104 if (zip != null) {
105 final ZipEntry entry = zip.getEntry(subfile);
106 return new Pair<>(zip.getInputStream(entry), entry.getSize());
107 } else {
108 final File file = new File(rootPath, subfile);
109 return new Pair<>(new FileInputStream(file), file.length());
110 }
111 }
112
113 }