X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/de2bfc7f7942908222ebcbac17e6072055acc062..7b0744ec758b1ccbe3c9ce5a1e6dea5d7e2313da:/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..ba126f7e 100644 --- a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java +++ b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java @@ -1,15 +1,20 @@ 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; import org.asamk.signal.OutputType; import org.asamk.signal.ReceiveMessageHandler; +import org.asamk.signal.Shutdown; 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,12 +24,13 @@ 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); + private static final Logger logger = LoggerFactory.getLogger(ReceiveCommand.class); @Override public String getName() { @@ -62,6 +68,7 @@ public class ReceiveCommand implements LocalCommand { public void handleCommand( final Namespace ns, final Manager m, final OutputWriter outputWriter ) throws CommandException { + Shutdown.installHandler(); final var timeout = ns.getDouble("timeout"); final var maxMessagesRaw = ns.getInt("max-messages"); final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); @@ -69,13 +76,46 @@ 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; + Shutdown.registerShutdownListener(m::stopReceiveMessages); + 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) {} }