X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/de2bfc7f7942908222ebcbac17e6072055acc062..a7db3a5610db2cf718030fbe06e5ebb8531459c8:/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..ab65f837 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); @@ -76,6 +81,36 @@ public class ReceiveCommand implements LocalCommand { 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); } } + + record ReceiveParams(Double timeout, Integer maxMessages) {} }