1 package org
.asamk
.signal
.manager
.jobs
;
3 import org
.asamk
.signal
.manager
.JsonStickerPack
;
4 import org
.asamk
.signal
.manager
.storage
.stickers
.StickerPackId
;
5 import org
.asamk
.signal
.manager
.util
.IOUtils
;
6 import org
.slf4j
.Logger
;
7 import org
.slf4j
.LoggerFactory
;
8 import org
.whispersystems
.libsignal
.InvalidMessageException
;
9 import org
.whispersystems
.signalservice
.internal
.util
.Hex
;
11 import java
.io
.IOException
;
12 import java
.util
.HashSet
;
13 import java
.util
.stream
.Collectors
;
15 public class RetrieveStickerPackJob
implements Job
{
17 private final static Logger logger
= LoggerFactory
.getLogger(RetrieveStickerPackJob
.class);
19 private final StickerPackId packId
;
20 private final byte[] packKey
;
22 public RetrieveStickerPackJob(final StickerPackId packId
, final byte[] packKey
) {
24 this.packKey
= packKey
;
28 public void run(Context context
) {
29 if (context
.getStickerPackStore().existsStickerPack(packId
)) {
30 logger
.debug("Sticker pack {} already downloaded.", Hex
.toStringCondensed(packId
.serialize()));
33 logger
.debug("Retrieving sticker pack {}.", Hex
.toStringCondensed(packId
.serialize()));
35 final var manifest
= context
.getMessageReceiver().retrieveStickerManifest(packId
.serialize(), packKey
);
37 final var stickerIds
= new HashSet
<Integer
>();
38 if (manifest
.getCover().isPresent()) {
39 stickerIds
.add(manifest
.getCover().get().getId());
41 for (var sticker
: manifest
.getStickers()) {
42 stickerIds
.add(sticker
.getId());
45 for (var id
: stickerIds
) {
46 final var inputStream
= context
.getMessageReceiver().retrieveSticker(packId
.serialize(), packKey
, id
);
47 context
.getStickerPackStore().storeSticker(packId
, id
, o
-> IOUtils
.copyStream(inputStream
, o
));
50 final var jsonManifest
= new JsonStickerPack(manifest
.getTitle().orNull(),
51 manifest
.getAuthor().orNull(),
53 .transform(c
-> new JsonStickerPack
.JsonSticker(c
.getEmoji(),
54 String
.valueOf(c
.getId()),
57 manifest
.getStickers()
59 .map(c
-> new JsonStickerPack
.JsonSticker(c
.getEmoji(),
60 String
.valueOf(c
.getId()),
62 .collect(Collectors
.toList()));
63 context
.getStickerPackStore().storeManifest(packId
, jsonManifest
);
64 } catch (IOException e
) {
65 logger
.warn("Failed to retrieve sticker pack {}: {}",
66 Hex
.toStringCondensed(packId
.serialize()),
68 } catch (InvalidMessageException e
) {
69 logger
.warn("Failed to retrieve sticker pack {}, invalid pack data: {}",
70 Hex
.toStringCondensed(packId
.serialize()),