]> nmode's Git Repositories - signal-cli/commitdiff
Implement listStickerPacks command
authorAsamK <asamk@gmx.de>
Mon, 3 Jan 2022 15:11:03 +0000 (16:11 +0100)
committerAsamK <asamk@gmx.de>
Mon, 3 Jan 2022 15:11:03 +0000 (16:11 +0100)
graalvm-config-dir/reflect-config.json
lib/src/main/java/org/asamk/signal/manager/JsonStickerPack.java
lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/api/StickerPack.java [new file with mode: 0644]
lib/src/main/java/org/asamk/signal/manager/jobs/RetrieveStickerPackJob.java
lib/src/main/java/org/asamk/signal/manager/storage/stickers/StickerStore.java
src/main/java/org/asamk/signal/commands/Commands.java
src/main/java/org/asamk/signal/commands/ListStickerPacksCommand.java [new file with mode: 0644]
src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java

index 2e5295cc9219ab0142c7f6a4023ef854918a7028..7adb67ea5428ad0956134a53e42f6d354136b539 100644 (file)
   "allDeclaredMethods":true,
   "allDeclaredConstructors":true}
 ,
+{
+  "name":"org.asamk.signal.commands.ListStickerPacksCommand$JsonStickerPack",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[
+    {"name":"author","parameterTypes":[] }, 
+    {"name":"cover","parameterTypes":[] }, 
+    {"name":"installed","parameterTypes":[] }, 
+    {"name":"packId","parameterTypes":[] }, 
+    {"name":"stickers","parameterTypes":[] }, 
+    {"name":"title","parameterTypes":[] }
+  ]}
+,
+{
+  "name":"org.asamk.signal.commands.ListStickerPacksCommand$JsonStickerPack$JsonSticker",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[
+    {"name":"contentType","parameterTypes":[] }, 
+    {"name":"emoji","parameterTypes":[] }, 
+    {"name":"id","parameterTypes":[] }
+  ]}
+,
 {
   "name":"org.asamk.signal.commands.RegisterCommand$RegistrationParams",
   "allDeclaredFields":true,
   "queryAllDeclaredMethods":true,
   "queryAllDeclaredConstructors":true,
   "methods":[
+    {"name":"<init>","parameterTypes":["java.lang.Integer","java.lang.String","java.lang.String","java.lang.String"] }, 
     {"name":"<init>","parameterTypes":["java.lang.String","java.lang.String","java.lang.String"] }, 
     {"name":"contentType","parameterTypes":[] }, 
     {"name":"emoji","parameterTypes":[] }, 
index 891144264f8d3ec9b17a04f3d2052eadc8843ce7..75e65bcba1f7688b6dd0616f4c887c5858a80bef 100644 (file)
@@ -1,8 +1,15 @@
 package org.asamk.signal.manager;
 
+import org.asamk.signal.manager.api.StickerPack;
+
 import java.util.List;
 
 public record JsonStickerPack(String title, String author, JsonSticker cover, List<JsonSticker> stickers) {
 
-    public record JsonSticker(String emoji, String file, String contentType) {}
+    public record JsonSticker(Integer id, String emoji, String file, String contentType) {
+
+        public StickerPack.Sticker toApi() {
+            return new StickerPack.Sticker(id == null ? Integer.parseInt(file) : id, emoji, contentType);
+        }
+    }
 }
index a60afc8cfdfd8a8cebca17f42aa67b2eeb446b50..7e39909f5f57c13dc25b805ce32816de03231c80 100644 (file)
@@ -13,6 +13,7 @@ import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendGroupMessageResults;
 import org.asamk.signal.manager.api.SendMessageResults;
+import org.asamk.signal.manager.api.StickerPack;
 import org.asamk.signal.manager.api.TypingAction;
 import org.asamk.signal.manager.api.UnregisteredRecipientException;
 import org.asamk.signal.manager.api.UpdateGroup;
@@ -221,6 +222,8 @@ public interface Manager extends Closeable {
      */
     URI uploadStickerPack(File path) throws IOException, StickerPackInvalidException;
 
+    List<StickerPack> getStickerPacks();
+
     void requestAllSyncData() throws IOException;
 
     /**
index 708b0226ddd513e50d68bbdc5533de62fc8dc03f..fdb289295651790a8bb18c8ac4407a36d6d3f1cd 100644 (file)
@@ -29,6 +29,7 @@ import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendGroupMessageResults;
 import org.asamk.signal.manager.api.SendMessageResult;
 import org.asamk.signal.manager.api.SendMessageResults;
+import org.asamk.signal.manager.api.StickerPack;
 import org.asamk.signal.manager.api.TypingAction;
 import org.asamk.signal.manager.api.UnregisteredRecipientException;
 import org.asamk.signal.manager.api.UpdateGroup;
@@ -682,6 +683,29 @@ public class ManagerImpl implements Manager {
         }
     }
 
+    @Override
+    public List<StickerPack> getStickerPacks() {
+        final var stickerPackStore = context.getStickerPackStore();
+        return account.getStickerStore().getStickerPacks().stream().map(pack -> {
+            if (stickerPackStore.existsStickerPack(pack.getPackId())) {
+                try {
+                    final var manifest = stickerPackStore.retrieveManifest(pack.getPackId());
+                    return new StickerPack(pack.getPackId(),
+                            pack.getPackKey(),
+                            pack.isInstalled(),
+                            manifest.title(),
+                            manifest.author(),
+                            java.util.Optional.ofNullable(manifest.cover() == null ? null : manifest.cover().toApi()),
+                            manifest.stickers().stream().map(JsonStickerPack.JsonSticker::toApi).toList());
+                } catch (Exception e) {
+                    logger.warn("Failed to read local sticker pack manifest: {}", e.getMessage(), e);
+                }
+            }
+
+            return new StickerPack(pack.getPackId(), pack.getPackKey(), pack.isInstalled());
+        }).toList();
+    }
+
     @Override
     public void requestAllSyncData() throws IOException {
         context.getSyncHelper().requestAllSyncData();
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/StickerPack.java b/lib/src/main/java/org/asamk/signal/manager/api/StickerPack.java
new file mode 100644 (file)
index 0000000..45d86c8
--- /dev/null
@@ -0,0 +1,23 @@
+package org.asamk.signal.manager.api;
+
+import org.asamk.signal.manager.storage.stickers.StickerPackId;
+
+import java.util.List;
+import java.util.Optional;
+
+public record StickerPack(
+        StickerPackId packId,
+        byte[] packKey,
+        boolean installed,
+        String title,
+        String author,
+        Optional<Sticker> cover,
+        List<Sticker> stickers
+) {
+
+    public StickerPack(final StickerPackId packId, final byte[] packKey, final boolean installed) {
+        this(packId, packKey, installed, "", "", Optional.empty(), List.of());
+    }
+
+    public record Sticker(int id, String emoji, String contentType) {}
+}
index 0e45eecb8ed9f3b7842fc3df53eeecf63f5aa45a..4a3ac3069da230d5250f94a40841f02625d158ee 100644 (file)
@@ -54,13 +54,15 @@ public class RetrieveStickerPackJob implements Job {
             final var jsonManifest = new JsonStickerPack(manifest.getTitle().orNull(),
                     manifest.getAuthor().orNull(),
                     manifest.getCover()
-                            .transform(c -> new JsonStickerPack.JsonSticker(c.getEmoji(),
+                            .transform(c -> new JsonStickerPack.JsonSticker(c.getId(),
+                                    c.getEmoji(),
                                     String.valueOf(c.getId()),
                                     c.getContentType()))
                             .orNull(),
                     manifest.getStickers()
                             .stream()
-                            .map(c -> new JsonStickerPack.JsonSticker(c.getEmoji(),
+                            .map(c -> new JsonStickerPack.JsonSticker(c.getId(),
+                                    c.getEmoji(),
                                     String.valueOf(c.getId()),
                                     c.getContentType()))
                             .toList());
index 1a67c15ad9fd5273f8e6ccaf170d9a853b295928..b1de3fecf0252b7e67aa65e1eb67ffc906fb24ba 100644 (file)
@@ -1,6 +1,7 @@
 package org.asamk.signal.manager.storage.stickers;
 
 import java.util.Base64;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -41,6 +42,10 @@ public class StickerStore {
         return new StickerStore(stickers, saver);
     }
 
+    public Collection<Sticker> getStickerPacks() {
+        return stickers.values();
+    }
+
     public Sticker getStickerPack(StickerPackId packId) {
         synchronized (stickers) {
             return stickers.get(packId);
index d13d50acf8f5a1cdf36b8aa135512ac4a1dff8ff..aee9a7ba6d33f4534b017da58c1ff9b114683311 100644 (file)
@@ -23,6 +23,7 @@ public class Commands {
         addCommand(new ListDevicesCommand());
         addCommand(new ListGroupsCommand());
         addCommand(new ListIdentitiesCommand());
+        addCommand(new ListStickerPacksCommand());
         addCommand(new QuitGroupCommand());
         addCommand(new ReceiveCommand());
         addCommand(new RegisterCommand());
diff --git a/src/main/java/org/asamk/signal/commands/ListStickerPacksCommand.java b/src/main/java/org/asamk/signal/commands/ListStickerPacksCommand.java
new file mode 100644 (file)
index 0000000..fa61e75
--- /dev/null
@@ -0,0 +1,67 @@
+package org.asamk.signal.commands;
+
+import net.sourceforge.argparse4j.inf.Namespace;
+import net.sourceforge.argparse4j.inf.Subparser;
+
+import org.asamk.signal.commands.exceptions.CommandException;
+import org.asamk.signal.manager.Manager;
+import org.asamk.signal.manager.api.StickerPack;
+import org.asamk.signal.output.JsonWriter;
+import org.asamk.signal.output.OutputWriter;
+import org.asamk.signal.output.PlainTextWriter;
+import org.asamk.signal.util.Hex;
+
+import java.util.List;
+
+public class ListStickerPacksCommand implements JsonRpcLocalCommand {
+
+    @Override
+    public String getName() {
+        return "listStickerPacks";
+    }
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
+        subparser.help("Show a list of known sticker packs.");
+    }
+
+    @Override
+    public void handleCommand(
+            final Namespace ns, final Manager c, final OutputWriter outputWriter
+    ) throws CommandException {
+        final var stickerPacks = c.getStickerPacks();
+        if (outputWriter instanceof JsonWriter jsonWriter) {
+            final var jsonStickerPacks = stickerPacks.stream().map(JsonStickerPack::new).toList();
+            jsonWriter.write(jsonStickerPacks);
+        } else if (outputWriter instanceof PlainTextWriter plainTextWriter) {
+            for (final var sticker : stickerPacks) {
+                plainTextWriter.println("Pack {}: “{}” by “{}” has {} stickers",
+                        Hex.toStringCondensed(sticker.packId().serialize()),
+                        sticker.title(),
+                        sticker.author(),
+                        sticker.stickers().size());
+            }
+        }
+    }
+
+    private record JsonStickerPack(
+            String packId, boolean installed, String title, String author, JsonSticker cover, List<JsonSticker> stickers
+    ) {
+
+        JsonStickerPack(StickerPack stickerPack) {
+            this(Hex.toStringCondensed(stickerPack.packId().serialize()),
+                    stickerPack.installed(),
+                    stickerPack.title(),
+                    stickerPack.author(),
+                    stickerPack.cover().map(JsonSticker::new).orElse(null),
+                    stickerPack.stickers().stream().map(JsonSticker::new).toList());
+        }
+
+        private record JsonSticker(int id, String emoji, String contentType) {
+
+            JsonSticker(StickerPack.Sticker sticker) {
+                this(sticker.id(), sticker.emoji(), sticker.contentType());
+            }
+        }
+    }
+}
index 7faf87e897359a6ec527d6bf49f248b667d73b53..345a385aa7f0a93948c78b2e5072fb1b026329d1 100644 (file)
@@ -18,6 +18,7 @@ import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendGroupMessageResults;
 import org.asamk.signal.manager.api.SendMessageResults;
+import org.asamk.signal.manager.api.StickerPack;
 import org.asamk.signal.manager.api.TypingAction;
 import org.asamk.signal.manager.api.UpdateGroup;
 import org.asamk.signal.manager.groups.GroupId;
@@ -443,6 +444,11 @@ public class DbusManagerImpl implements Manager {
         }
     }
 
+    @Override
+    public List<StickerPack> getStickerPacks() {
+        throw new UnsupportedOperationException();
+    }
+
     @Override
     public void requestAllSyncData() throws IOException {
         signal.sendSyncRequest();