]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/jobs/RetrieveStickerPackJob.java
Implement sticker pack retrieval
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / jobs / RetrieveStickerPackJob.java
1 package org.asamk.signal.manager.jobs;
2
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;
10
11 import java.io.IOException;
12 import java.util.HashSet;
13 import java.util.stream.Collectors;
14
15 public class RetrieveStickerPackJob implements Job {
16
17 private final static Logger logger = LoggerFactory.getLogger(RetrieveStickerPackJob.class);
18
19 private final StickerPackId packId;
20 private final byte[] packKey;
21
22 public RetrieveStickerPackJob(final StickerPackId packId, final byte[] packKey) {
23 this.packId = packId;
24 this.packKey = packKey;
25 }
26
27 @Override
28 public void run(Context context) {
29 if (context.getStickerPackStore().existsStickerPack(packId)) {
30 logger.debug("Sticker pack {} already downloaded.", Hex.toStringCondensed(packId.serialize()));
31 return;
32 }
33 logger.debug("Retrieving sticker pack {}.", Hex.toStringCondensed(packId.serialize()));
34 try {
35 final var manifest = context.getMessageReceiver().retrieveStickerManifest(packId.serialize(), packKey);
36
37 final var stickerIds = new HashSet<Integer>();
38 if (manifest.getCover().isPresent()) {
39 stickerIds.add(manifest.getCover().get().getId());
40 }
41 for (var sticker : manifest.getStickers()) {
42 stickerIds.add(sticker.getId());
43 }
44
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));
48 }
49
50 final var jsonManifest = new JsonStickerPack(manifest.getTitle().orNull(),
51 manifest.getAuthor().orNull(),
52 manifest.getCover()
53 .transform(c -> new JsonStickerPack.JsonSticker(c.getEmoji(),
54 String.valueOf(c.getId()),
55 c.getContentType()))
56 .orNull(),
57 manifest.getStickers()
58 .stream()
59 .map(c -> new JsonStickerPack.JsonSticker(c.getEmoji(),
60 String.valueOf(c.getId()),
61 c.getContentType()))
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()),
67 e.getMessage());
68 } catch (InvalidMessageException e) {
69 logger.warn("Failed to retrieve sticker pack {}, invalid pack data: {}",
70 Hex.toStringCondensed(packId.serialize()),
71 e.getMessage());
72 }
73 }
74 }