From: AsamK Date: Mon, 31 Oct 2022 10:56:25 +0000 (+0100) Subject: Implement receive command for JSON-RPC mode X-Git-Tag: v0.11.5~23 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/175057e781623d5e61128ccbb13f2eb47ae8bf94?ds=sidebyside Implement receive command for JSON-RPC mode The command returns a list of messages, as soon as the timeout is reached after the last message has been received or the maximum number of messages has been received. --- diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 78f1d5e4..bd5a9dfc 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -605,6 +605,13 @@ {"name":"id","parameterTypes":[] } ] }, +{ + "name":"org.asamk.signal.commands.ReceiveCommand$ReceiveParams", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["java.lang.Double","java.lang.Integer"] }] +}, { "name":"org.asamk.signal.commands.RegisterCommand$RegistrationParams", "allDeclaredFields":true, diff --git a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java index 0095e758..79d0ee1d 100644 --- a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java +++ b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java @@ -1,5 +1,7 @@ package org.asamk.signal.commands; +import com.fasterxml.jackson.core.type.TypeReference; + import net.sourceforge.argparse4j.impl.Arguments; import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; @@ -19,10 +21,11 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.time.Duration; +import java.util.ArrayList; import java.util.List; import java.util.Optional; -public class ReceiveCommand implements LocalCommand { +public class ReceiveCommand implements LocalCommand, JsonRpcSingleCommand { private final static Logger logger = LoggerFactory.getLogger(ReceiveCommand.class); @@ -78,4 +81,30 @@ public class ReceiveCommand implements LocalCommand { throw new IOErrorException("Error while receiving messages: " + e.getMessage(), e); } } + + @Override + public TypeReference getRequestType() { + return new TypeReference<>() {}; + } + + @Override + public void handleCommand( + final ReceiveParams request, final Manager m, final JsonWriter jsonWriter + ) throws CommandException { + final var timeout = request.timeout() == null ? 3.0 : request.timeout(); + final var maxMessagesRaw = request.maxMessages() == null ? -1 : request.maxMessages(); + + try { + final var messages = new ArrayList<>(); + final var handler = new JsonReceiveMessageHandler(m, messages::add); + final var duration = timeout < 0 ? null : Duration.ofMillis((long) (timeout * 1000)); + final var maxMessages = maxMessagesRaw < 0 ? null : maxMessagesRaw; + m.receiveMessages(Optional.ofNullable(duration), Optional.ofNullable(maxMessages), handler); + jsonWriter.write(messages); + } catch (IOException e) { + throw new IOErrorException("Error while receiving messages: " + e.getMessage(), e); + } + } + + record ReceiveParams(Double timeout, Integer maxMessages) {} }