]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/helper/StickerHelper.java
Update libsignal-service-java
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / helper / StickerHelper.java
1 package org.asamk.signal.manager.helper;
2
3 import org.asamk.signal.manager.SignalDependencies;
4 import org.asamk.signal.manager.api.InvalidStickerException;
5 import org.asamk.signal.manager.api.StickerPackId;
6 import org.asamk.signal.manager.storage.SignalAccount;
7 import org.asamk.signal.manager.storage.stickerPacks.JsonStickerPack;
8 import org.asamk.signal.manager.util.IOUtils;
9 import org.signal.libsignal.protocol.InvalidMessageException;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
12 import org.whispersystems.signalservice.internal.util.Hex;
13
14 import java.io.IOException;
15 import java.util.HashSet;
16
17 public class StickerHelper {
18
19 private final static Logger logger = LoggerFactory.getLogger(StickerHelper.class);
20
21 private final Context context;
22 private final SignalAccount account;
23 private final SignalDependencies dependencies;
24
25 public StickerHelper(final Context context) {
26 this.account = context.getAccount();
27 this.dependencies = context.getDependencies();
28 this.context = context;
29 }
30
31 public JsonStickerPack getOrRetrieveStickerPack(
32 StickerPackId packId, byte[] packKey
33 ) throws InvalidStickerException {
34 if (!context.getStickerPackStore().existsStickerPack(packId)) {
35 try {
36 retrieveStickerPack(packId, packKey);
37 } catch (InvalidMessageException | IOException e) {
38 throw new InvalidStickerException("Failed to retrieve sticker pack");
39 }
40 }
41 final JsonStickerPack manifest;
42 try {
43 manifest = context.getStickerPackStore().retrieveManifest(packId);
44 } catch (IOException e) {
45 throw new InvalidStickerException("Failed to load sticker pack manifest");
46 }
47 return manifest;
48 }
49
50 public void retrieveStickerPack(StickerPackId packId, byte[] packKey) throws InvalidMessageException, IOException {
51 logger.debug("Retrieving sticker pack {}.", Hex.toStringCondensed(packId.serialize()));
52 final var manifest = dependencies.getMessageReceiver().retrieveStickerManifest(packId.serialize(), packKey);
53
54 final var stickerIds = new HashSet<Integer>();
55 if (manifest.getCover().isPresent()) {
56 stickerIds.add(manifest.getCover().get().getId());
57 }
58 for (var sticker : manifest.getStickers()) {
59 stickerIds.add(sticker.getId());
60 }
61
62 for (var id : stickerIds) {
63 final var inputStream = dependencies.getMessageReceiver().retrieveSticker(packId.serialize(), packKey, id);
64 context.getStickerPackStore().storeSticker(packId, id, o -> IOUtils.copyStream(inputStream, o));
65 }
66
67 final var jsonManifest = new JsonStickerPack(manifest.getTitle().orElse(null),
68 manifest.getAuthor().orElse(null),
69 manifest.getCover()
70 .map(c -> new JsonStickerPack.JsonSticker(c.getId(),
71 c.getEmoji(),
72 String.valueOf(c.getId()),
73 c.getContentType()))
74 .orElse(null),
75 manifest.getStickers()
76 .stream()
77 .map(c -> new JsonStickerPack.JsonSticker(c.getId(),
78 c.getEmoji(),
79 String.valueOf(c.getId()),
80 c.getContentType()))
81 .toList());
82 context.getStickerPackStore().storeManifest(packId, jsonManifest);
83 }
84 }