X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/de2bfc7f7942908222ebcbac17e6072055acc062..b7fedff5110c55625f2391a5aab607a2248bf104:/src/main/java/org/asamk/signal/commands/ReceiveCommand.java diff --git a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java index 0095e758..228a0561 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; @@ -8,8 +10,10 @@ import org.asamk.signal.OutputType; import org.asamk.signal.ReceiveMessageHandler; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.IOErrorException; +import org.asamk.signal.commands.exceptions.UserErrorException; import org.asamk.signal.json.JsonReceiveMessageHandler; import org.asamk.signal.manager.Manager; +import org.asamk.signal.manager.api.AlreadyReceivingException; import org.asamk.signal.manager.api.ReceiveConfig; import org.asamk.signal.output.JsonWriter; import org.asamk.signal.output.OutputWriter; @@ -19,10 +23,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); @@ -69,13 +74,45 @@ public class ReceiveCommand implements LocalCommand { final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts)); try { - final var handler = outputWriter instanceof JsonWriter ? new JsonReceiveMessageHandler(m, - (JsonWriter) outputWriter) : new ReceiveMessageHandler(m, (PlainTextWriter) outputWriter); + final var handler = switch (outputWriter) { + case JsonWriter writer -> new JsonReceiveMessageHandler(m, writer); + case PlainTextWriter writer -> new ReceiveMessageHandler(m, writer); + }; + 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); + } catch (IOException e) { + throw new IOErrorException("Error while receiving messages: " + e.getMessage(), e); + } catch (AlreadyReceivingException e) { + throw new UserErrorException("Receive command cannot be used if messages are already being received.", 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); + } catch (AlreadyReceivingException e) { + throw new UserErrorException("Receive command cannot be used if messages are already being received.", e); } } + + public record ReceiveParams(Double timeout, Integer maxMessages) {} }