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