1 package org
.asamk
.signal
.manager
.helper
;
3 import org
.asamk
.signal
.manager
.api
.InvalidStickerException
;
4 import org
.asamk
.signal
.manager
.api
.StickerPackId
;
5 import org
.asamk
.signal
.manager
.internal
.SignalDependencies
;
6 import org
.asamk
.signal
.manager
.storage
.SignalAccount
;
7 import org
.asamk
.signal
.manager
.storage
.stickerPacks
.JsonStickerPack
;
8 import org
.asamk
.signal
.manager
.storage
.stickers
.StickerPack
;
9 import org
.asamk
.signal
.manager
.util
.IOUtils
;
10 import org
.signal
.libsignal
.protocol
.InvalidMessageException
;
11 import org
.slf4j
.Logger
;
12 import org
.slf4j
.LoggerFactory
;
13 import org
.whispersystems
.signalservice
.internal
.util
.Hex
;
15 import java
.io
.IOException
;
16 import java
.util
.HashSet
;
18 public class StickerHelper
{
20 private final static Logger logger
= LoggerFactory
.getLogger(StickerHelper
.class);
22 private final Context context
;
23 private final SignalAccount account
;
24 private final SignalDependencies dependencies
;
26 public StickerHelper(final Context context
) {
27 this.account
= context
.getAccount();
28 this.dependencies
= context
.getDependencies();
29 this.context
= context
;
32 public StickerPack
addOrUpdateStickerPack(
33 final StickerPackId stickerPackId
, final byte[] stickerPackKey
, final boolean installed
35 final var sticker
= account
.getStickerStore().getStickerPack(stickerPackId
);
36 if (sticker
!= null) {
37 if (sticker
.isInstalled() != installed
) {
38 account
.getStickerStore().updateStickerPackInstalled(sticker
.packId(), installed
);
43 if (stickerPackKey
== null) {
47 final var newSticker
= new StickerPack(-1, stickerPackId
, stickerPackKey
, installed
);
48 account
.getStickerStore().addStickerPack(newSticker
);
52 public JsonStickerPack
getOrRetrieveStickerPack(
53 StickerPackId packId
, byte[] packKey
54 ) throws InvalidStickerException
{
56 retrieveStickerPack(packId
, packKey
);
57 } catch (InvalidMessageException
| IOException e
) {
58 throw new InvalidStickerException("Failed to retrieve sticker pack");
60 final JsonStickerPack manifest
;
62 manifest
= context
.getStickerPackStore().retrieveManifest(packId
);
63 } catch (IOException e
) {
64 throw new InvalidStickerException("Failed to load sticker pack manifest");
69 public void retrieveStickerPack(StickerPackId packId
, byte[] packKey
) throws InvalidMessageException
, IOException
{
70 if (context
.getStickerPackStore().existsStickerPack(packId
)) {
71 logger
.debug("Sticker pack {} already downloaded.", Hex
.toStringCondensed(packId
.serialize()));
74 logger
.debug("Retrieving sticker pack {}.", Hex
.toStringCondensed(packId
.serialize()));
75 final var messageReceiver
= dependencies
.getMessageReceiver();
76 final var manifest
= messageReceiver
.retrieveStickerManifest(packId
.serialize(), packKey
);
78 final var stickerIds
= new HashSet
<Integer
>();
79 if (manifest
.getCover().isPresent()) {
80 stickerIds
.add(manifest
.getCover().get().getId());
82 for (var sticker
: manifest
.getStickers()) {
83 stickerIds
.add(sticker
.getId());
86 for (var id
: stickerIds
) {
87 try (final var inputStream
= messageReceiver
.retrieveSticker(packId
.serialize(), packKey
, id
)) {
88 context
.getStickerPackStore().storeSticker(packId
, id
, o
-> IOUtils
.copyStream(inputStream
, o
));
92 final var jsonManifest
= new JsonStickerPack(manifest
.getTitle().orElse(null),
93 manifest
.getAuthor().orElse(null),
95 .map(c
-> new JsonStickerPack
.JsonSticker(c
.getId(),
97 String
.valueOf(c
.getId()),
100 manifest
.getStickers()
102 .map(c
-> new JsonStickerPack
.JsonSticker(c
.getId(),
104 String
.valueOf(c
.getId()),
107 context
.getStickerPackStore().storeManifest(packId
, jsonManifest
);