X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/bf76c046645f688840d2da939d49c5a5a02fae55..2e4d346bc826da5c35a17841772cf81ba4f98101:/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java diff --git a/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java b/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java new file mode 100644 index 00000000..560be9f9 --- /dev/null +++ b/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java @@ -0,0 +1,63 @@ +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.commands.exceptions.UnexpectedErrorException; +import org.asamk.signal.commands.exceptions.UserErrorException; +import org.asamk.signal.json.JsonAttachmentData; +import org.asamk.signal.manager.Manager; +import org.asamk.signal.output.JsonWriter; +import org.asamk.signal.output.OutputWriter; +import org.asamk.signal.output.PlainTextWriter; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.Base64; + +public class GetAttachmentCommand implements JsonRpcLocalCommand { + + @Override + public String getName() { + return "getAttachment"; + } + + @Override + public void attachToSubparser(final Subparser subparser) { + subparser.addArgument("--id") + .required(true) + .help("The ID of the attachment file."); + var mut = subparser.addMutuallyExclusiveGroup() + .required(true); + mut.addArgument("--recipient") + .help("Sender of the attachment"); + mut.addArgument("-g", "--group-id") + .help("Group in which the attachment was received"); + } + + @Override + public void handleCommand( + final Namespace ns, + final Manager m, + final OutputWriter outputWriter + ) throws CommandException { + + final var id = ns.getString("id"); + + try(InputStream attachment = m.retrieveAttachment(id)) { + if (outputWriter instanceof PlainTextWriter writer) { + final var bytes = attachment.readAllBytes(); + final var base64 = Base64.getEncoder().encodeToString(bytes); + writer.println(base64); + } else if (outputWriter instanceof JsonWriter writer) { + writer.write(new JsonAttachmentData(attachment)); + } + } catch (FileNotFoundException ex) { + throw new UserErrorException("Could not find attachment with ID: " + id, ex); + } catch (IOException ex) { + throw new UnexpectedErrorException("An error occurred reading attachment: " + id, ex); + } + } +}