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