]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/helper/StickerHelper.java
Update gradle
[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.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;
14
15 import java.io.IOException;
16 import java.util.HashSet;
17
18 public class StickerHelper {
19
20 private static final Logger logger = LoggerFactory.getLogger(StickerHelper.class);
21
22 private final Context context;
23 private final SignalAccount account;
24 private final SignalDependencies dependencies;
25
26 public StickerHelper(final Context context) {
27 this.account = context.getAccount();
28 this.dependencies = context.getDependencies();
29 this.context = context;
30 }
31
32 public StickerPack addOrUpdateStickerPack(
33 final StickerPackId stickerPackId,
34 final byte[] stickerPackKey,
35 final boolean installed
36 ) {
37 final var sticker = account.getStickerStore().getStickerPack(stickerPackId);
38 if (sticker != null) {
39 if (sticker.isInstalled() != installed) {
40 account.getStickerStore().updateStickerPackInstalled(sticker.packId(), installed);
41 }
42 return sticker;
43 }
44
45 if (stickerPackKey == null) {
46 return null;
47 }
48
49 final var newSticker = new StickerPack(-1, stickerPackId, stickerPackKey, installed);
50 account.getStickerStore().addStickerPack(newSticker);
51 return newSticker;
52 }
53
54 public JsonStickerPack getOrRetrieveStickerPack(
55 StickerPackId packId,
56 byte[] packKey
57 ) throws InvalidStickerException {
58 try {
59 retrieveStickerPack(packId, packKey);
60 } catch (InvalidMessageException | IOException e) {
61 throw new InvalidStickerException("Failed to retrieve sticker pack");
62 }
63 final JsonStickerPack manifest;
64 try {
65 manifest = context.getStickerPackStore().retrieveManifest(packId);
66 } catch (IOException e) {
67 throw new InvalidStickerException("Failed to load sticker pack manifest");
68 }
69 return manifest;
70 }
71
72 public void retrieveStickerPack(StickerPackId packId, byte[] packKey) throws InvalidMessageException, IOException {
73 if (context.getStickerPackStore().existsStickerPack(packId)) {
74 logger.debug("Sticker pack {} already downloaded.", Hex.toStringCondensed(packId.serialize()));
75 return;
76 }
77 logger.debug("Retrieving sticker pack {}.", Hex.toStringCondensed(packId.serialize()));
78 final var messageReceiver = dependencies.getMessageReceiver();
79 final var manifest = messageReceiver.retrieveStickerManifest(packId.serialize(), packKey);
80
81 final var stickerIds = new HashSet<Integer>();
82 if (manifest.getCover().isPresent()) {
83 stickerIds.add(manifest.getCover().get().getId());
84 }
85 for (var sticker : manifest.getStickers()) {
86 stickerIds.add(sticker.getId());
87 }
88
89 for (var id : stickerIds) {
90 try (final var inputStream = messageReceiver.retrieveSticker(packId.serialize(), packKey, id)) {
91 context.getStickerPackStore().storeSticker(packId, id, o -> IOUtils.copyStream(inputStream, o));
92 }
93 }
94
95 final var jsonManifest = new JsonStickerPack(manifest.getTitle().orElse(null),
96 manifest.getAuthor().orElse(null),
97 manifest.getCover()
98 .map(c -> new JsonStickerPack.JsonSticker(c.getId(),
99 c.getEmoji(),
100 String.valueOf(c.getId()),
101 c.getContentType()))
102 .orElse(null),
103 manifest.getStickers()
104 .stream()
105 .map(c -> new JsonStickerPack.JsonSticker(c.getId(),
106 c.getEmoji(),
107 String.valueOf(c.getId()),
108 c.getContentType()))
109 .toList());
110 context.getStickerPackStore().storeManifest(packId, jsonManifest);
111 }
112 }