diff --git a/README.md b/README.md index 8355d26a..60fa2f44 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +This fork changes the daemon command to read commands as JSON from stdin instead of exporting a DBus interface. It also includes reactions in JSON output. + +Currently, only sendMessage is available. The JSON interface is {"command": "sendMessage", "recipient": number, "content": message, "details": {"attachments": []}}. The details field is optional. As far as I can tell, attachments must be full absolute file paths. + +TODOs: +- acknowledge commands received from stdin in valid JSON output instead of freeform text +- feature parity with DBus interface and ideally CLI +- allow typing indicators to be sent and received +- include quotes in JSON output +- ideally, expose message IDs referenced by quotes this is patched such that the daemon command reads recipient:message pairs from stdin instead of exporting an object to dbus while outputing json as normal (though it currently also outputs "sent $msg to $recipient" in response to input as well). it also includes reactions in output, and will include quotes. note that currently sending multiline messages does not work, lines after the first are ignored. diff --git a/build/distributions/signal-cli-0.6.11.tar b/build/distributions/signal-cli-0.6.11.tar deleted file mode 100644 index 687c7eed..00000000 Binary files a/build/distributions/signal-cli-0.6.11.tar and /dev/null differ diff --git a/src/main/java/org/asamk/signal/commands/DaemonCommand.java b/src/main/java/org/asamk/signal/commands/DaemonCommand.java index 21080425..0f65f5ae 100644 --- a/src/main/java/org/asamk/signal/commands/DaemonCommand.java +++ b/src/main/java/org/asamk/signal/commands/DaemonCommand.java @@ -27,6 +27,16 @@ import static org.asamk.signal.DbusConfig.SIGNAL_OBJECTPATH; import static org.asamk.signal.util.ErrorUtils.handleAssertionError; import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; import org.whispersystems.signalservice.api.util.InvalidNumberException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +class JsonInterface { + public String commandName; + public String recipient; + public String content; + public JsonNode details; +} + class InputReader implements Runnable { private volatile boolean alive = true; @@ -42,29 +52,40 @@ class InputReader implements Runnable { @Override public void run() { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + ObjectMapper jsonProcessor = new ObjectMapper(); while (alive) { try { String in = br.readLine(); - String args[] = in.split(":", 2); - // properly this ought to be json or some sort of serialization to not miss multiline messages - if (args.length == 2) { - String message = args[1]; - List recipients = new ArrayList(); - recipients.add(args[0]); - List attachments = new ArrayList<>(); - try { - System.out.println("sent '" + message + "' to " + args[0]); - this.m.sendMessage(message, attachments, recipients); - } catch (AssertionError | EncapsulatedExceptions| AttachmentInvalidException | InvalidNumberException e) { - System.err.println("aaaaaa (DaemonCommand L59)"); - e.printStackTrace(System.out); - } + if (in != null) { + JsonInterface command = jsonProcessor.readValue(in, JsonInterface.class); + if (command.commandName.equals("sendMessage")){ + List recipients = new ArrayList(); + recipients.add(command.recipient); + List attachments = new ArrayList<>(); + if (command.details != null && command.details.has("attachments") ) { + command.details.get("attachments").forEach(attachment -> { + if (attachment.isTextual()){ + attachments.add(attachment.asText()); + } + }); + } + try { + // verbosity flag? better yet, json acknowledgement with timestamp or message id? + System.out.println("sentMessage '" + command.content + "' to " + command.recipient); + this.m.sendMessage(command.content, attachments, recipients); + } catch (AssertionError | EncapsulatedExceptions| AttachmentInvalidException | InvalidNumberException e) { + System.err.println("error in sending message"); + e.printStackTrace(System.out); + } + } /* elif (command.commandName == "sendTyping") { + getMessageSender().sendTyping(signalServiceAddress?, ....) + }*/ } } catch (IOException e) { System.err.println(e); + alive = false; } - // getMessageSender().sendTyping(signalServiceAddress?, ....) } } diff --git a/src/main/java/org/asamk/signal/manager/Manager.java b/src/main/java/org/asamk/signal/manager/Manager.java index 319463c5..855f534e 100644 --- a/src/main/java/org/asamk/signal/manager/Manager.java +++ b/src/main/java/org/asamk/signal/manager/Manager.java @@ -113,7 +113,6 @@ import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider import org.whispersystems.signalservice.internal.util.Hex; import org.whispersystems.util.Base64; -import java.io.BufferedReader; import java.io.Closeable; import java.io.File; import java.io.FileInputStream;