1 package org
.asamk
.signal
.manager
.util
;
3 import com
.fasterxml
.jackson
.databind
.ObjectMapper
;
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
;
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
;
18 public class StickerUtils
{
20 public static SignalServiceStickerManifestUpload
getSignalServiceStickerManifestUpload(
22 ) throws IOException
, StickerPackInvalidException
{
24 String rootPath
= null;
26 if (file
.getName().endsWith(".zip")) {
27 zip
= new ZipFile(file
);
28 } else if (file
.getName().equals("manifest.json")) {
29 rootPath
= file
.getParent();
31 throw new StickerPackInvalidException("Could not find manifest.json");
34 var pack
= parseStickerPack(rootPath
, zip
);
36 if (pack
.stickers
== null) {
37 throw new StickerPackInvalidException("Must set a 'stickers' field.");
40 if (pack
.stickers
.isEmpty()) {
41 throw new StickerPackInvalidException("Must include stickers.");
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.");
50 Pair
<InputStream
, Long
> data
;
52 data
= getInputStreamAndLength(rootPath
, zip
, sticker
.file
);
53 } catch (IOException ignored
) {
54 throw new StickerPackInvalidException("Could not find find " + sticker
.file
);
57 var contentType
= Utils
.getFileMimeType(new File(sticker
.file
), null);
58 var stickerInfo
= new SignalServiceStickerManifestUpload
.StickerInfo(data
.first(),
60 Optional
.fromNullable(sticker
.emoji
).or(""),
62 stickers
.add(stickerInfo
);
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.");
71 Pair
<InputStream
, Long
> data
;
73 data
= getInputStreamAndLength(rootPath
, zip
, pack
.cover
.file
);
74 } catch (IOException ignored
) {
75 throw new StickerPackInvalidException("Could not find find " + pack
.cover
.file
);
78 var contentType
= Utils
.getFileMimeType(new File(pack
.cover
.file
), null);
79 cover
= new SignalServiceStickerManifestUpload
.StickerInfo(data
.first(),
81 Optional
.fromNullable(pack
.cover
.emoji
).or(""),
85 return new SignalServiceStickerManifestUpload(pack
.title
, pack
.author
, cover
, stickers
);
88 private static JsonStickerPack
parseStickerPack(String rootPath
, ZipFile zip
) throws IOException
{
89 InputStream inputStream
;
91 inputStream
= zip
.getInputStream(zip
.getEntry("manifest.json"));
93 inputStream
= new FileInputStream((new File(rootPath
, "manifest.json")));
95 return new ObjectMapper().readValue(inputStream
, JsonStickerPack
.class);
98 private static Pair
<InputStream
, Long
> getInputStreamAndLength(
99 final String rootPath
, final ZipFile zip
, final String subfile
100 ) throws IOException
{
102 final var entry
= zip
.getEntry(subfile
);
103 return new Pair
<>(zip
.getInputStream(entry
), entry
.getSize());
105 final var file
= new File(rootPath
, subfile
);
106 return new Pair
<>(new FileInputStream(file
), file
.length());