]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/api/StickerPackUrl.java
Add sticker pack url to list output
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / api / StickerPackUrl.java
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/StickerPackUrl.java b/lib/src/main/java/org/asamk/signal/manager/api/StickerPackUrl.java
new file mode 100644 (file)
index 0000000..d018ac3
--- /dev/null
@@ -0,0 +1,88 @@
+package org.asamk.signal.manager.api;
+
+import org.asamk.signal.manager.util.Utils;
+import org.whispersystems.signalservice.internal.util.Hex;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+import static org.whispersystems.signalservice.internal.util.Util.isEmpty;
+
+public final class StickerPackUrl {
+
+    private final StickerPackId packId;
+    private final byte[] packKey;
+
+    /**
+     * @throws InvalidStickerPackLinkException If url cannot be parsed.
+     */
+    public static StickerPackUrl fromUri(URI uri) throws InvalidStickerPackLinkException {
+        final var rawQuery = uri.getRawFragment();
+        if (isEmpty(rawQuery)) {
+            throw new RuntimeException("Invalid sticker pack uri");
+        }
+
+        var query = Utils.getQueryMap(rawQuery);
+        var packIdString = query.get("pack_id");
+        var packKeyString = query.get("pack_key");
+
+        if (isEmpty(packIdString) || isEmpty(packKeyString)) {
+            throw new InvalidStickerPackLinkException("Incomplete sticker pack uri");
+        }
+
+        StickerPackId packId;
+        try {
+            packId = StickerPackId.deserialize(Hex.fromStringCondensed(packIdString));
+        } catch (IOException e) {
+            throw new InvalidStickerPackLinkException("Invalid sticker pack", e);
+        }
+        final byte[] packKey;
+        try {
+            packKey = Hex.fromStringCondensed(packKeyString);
+        } catch (IOException e) {
+            throw new InvalidStickerPackLinkException("Invalid sticker pack uri", e);
+        }
+        return new StickerPackUrl(packId, packKey);
+    }
+
+    public StickerPackUrl(final StickerPackId packId, final byte[] packKey) {
+        this.packId = packId;
+        this.packKey = packKey;
+    }
+
+    public URI getUrl() {
+        try {
+            return new URI("https",
+                    "signal.art",
+                    "/addstickers/",
+                    "pack_id="
+                            + URLEncoder.encode(Hex.toStringCondensed(packId.serialize()), StandardCharsets.UTF_8)
+                            + "&pack_key="
+                            + URLEncoder.encode(Hex.toStringCondensed(packKey), StandardCharsets.UTF_8));
+        } catch (URISyntaxException e) {
+            throw new AssertionError(e);
+        }
+    }
+
+    public StickerPackId getPackId() {
+        return packId;
+    }
+
+    public byte[] getPackKey() {
+        return packKey;
+    }
+
+    public final static class InvalidStickerPackLinkException extends Exception {
+
+        public InvalidStickerPackLinkException(String message) {
+            super(message);
+        }
+
+        public InvalidStickerPackLinkException(final String message, final Throwable cause) {
+            super(message, cause);
+        }
+    }
+}