]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/helper/StickerHelper.java
c67a65737c24358bd237eeaabda5901d91339569
[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 messageReceiver = dependencies.getMessageReceiver();
53 final var manifest = messageReceiver.retrieveStickerManifest(packId.serialize(), packKey);
54
55 final var stickerIds = new HashSet<Integer>();
56 if (manifest.getCover().isPresent()) {
57 stickerIds.add(manifest.getCover().get().getId());
58 }
59 for (var sticker : manifest.getStickers()) {
60 stickerIds.add(sticker.getId());
61 }
62
63 for (var id : stickerIds) {
64 try (final var inputStream = messageReceiver.retrieveSticker(packId.serialize(), packKey, id)) {
65 context.getStickerPackStore().storeSticker(packId, id, o -> IOUtils.copyStream(inputStream, o));
66 }
67 }
68
69 final var jsonManifest = new JsonStickerPack(manifest.getTitle().orElse(null),
70 manifest.getAuthor().orElse(null),
71 manifest.getCover()
72 .map(c -> new JsonStickerPack.JsonSticker(c.getId(),
73 c.getEmoji(),
74 String.valueOf(c.getId()),
75 c.getContentType()))
76 .orElse(null),
77 manifest.getStickers()
78 .stream()
79 .map(c -> new JsonStickerPack.JsonSticker(c.getId(),
80 c.getEmoji(),
81 String.valueOf(c.getId()),
82 c.getContentType()))
83 .toList());
84 context.getStickerPackStore().storeManifest(packId, jsonManifest);
85 }
86 }