diff --git a/build.gradle.kts b/build.gradle.kts index 55d95145..69e40c01 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -35,6 +35,12 @@ configurations { } } + +tasks.withType().configureEach { + isPreserveFileTimestamps = false + isReproducibleFileOrder = true +} + tasks.withType { options.encoding = "UTF-8" } diff --git a/src/main/java/org/asamk/signal/commands/SendCommand.java b/src/main/java/org/asamk/signal/commands/SendCommand.java index 611c73fb..bd94ca91 100644 --- a/src/main/java/org/asamk/signal/commands/SendCommand.java +++ b/src/main/java/org/asamk/signal/commands/SendCommand.java @@ -21,7 +21,6 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.charset.Charset; import java.util.List; -import java.util.Arrays; import static org.asamk.signal.util.ErrorUtils.handleAssertionError; @@ -130,7 +129,6 @@ public class SendCommand implements DbusCommand { } try { - System.out.println(Arrays.toString(ns.getList("recipient").toArray())); var timestamp = signal.sendMessage(messageText, attachments, recipients); writer.println("{}", timestamp); } catch (AssertionError e) { diff --git a/src/main/java/org/asamk/signal/commands/StdioCommand.java b/src/main/java/org/asamk/signal/commands/StdioCommand.java index dcdc2287..278e67fa 100644 --- a/src/main/java/org/asamk/signal/commands/StdioCommand.java +++ b/src/main/java/org/asamk/signal/commands/StdioCommand.java @@ -8,9 +8,13 @@ import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; import org.asamk.signal.JsonReceiveMessageHandler; +import org.asamk.signal.JsonWriter; +import org.asamk.signal.OutputType; import org.asamk.signal.ReceiveMessageHandler; import org.asamk.signal.manager.AttachmentInvalidException; import org.asamk.signal.manager.Manager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; import org.whispersystems.signalservice.api.util.InvalidNumberException; @@ -19,6 +23,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.concurrent.TimeUnit; import static org.asamk.signal.util.ErrorUtils.handleAssertionError; @@ -32,6 +37,7 @@ class JsonInterface { } class InputReader implements Runnable { + private final static Logger logger = LoggerFactory.getLogger(InputReader.class); private volatile boolean alive = true; private final Manager m; @@ -66,11 +72,11 @@ class InputReader implements Runnable { } 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); + logger.info("sentMessage '" + command.content + "' to " + command.recipient); } catch (AssertionError | AttachmentInvalidException | InvalidNumberException e) { - System.err.println("error in sending message"); - e.printStackTrace(System.out); + logger.error("Error in sending message", e); + logger.error(e.getMessage(), e); } } /* elif (command.commandName == "sendTyping") { getMessageSender().sendTyping(signalServiceAddress?, ....) @@ -87,19 +93,26 @@ class InputReader implements Runnable { } public class StdioCommand implements LocalCommand { + private final static Logger logger = LoggerFactory.getLogger(StdioCommand.class); @Override public void attachToSubparser(final Subparser subparser) { subparser.addArgument("--ignore-attachments") .help("Don’t download attachments of received messages.") .action(Arguments.storeTrue()); - subparser.addArgument("--json") // should maybe remove this - .help("Output received messages in json format, one json object per line.") + subparser.addArgument("--json") + .help("WARNING: This parameter is now deprecated! Please use the global \"--output=json\" option instead.\n\nOutput received messages in json format, one json object per line.") .action(Arguments.storeTrue()); } + @Override + public Set getSupportedOutputTypes() { + return Set.of(OutputType.PLAIN_TEXT, OutputType.JSON); + } + @Override public void handleCommand(final Namespace ns, final Manager m) { + var inJson = ns.get("output") == OutputType.JSON || ns.getBoolean("json"); boolean ignoreAttachments = ns.getBoolean("ignore_attachments"); InputReader reader = new InputReader(m); Thread readerThread = new Thread(reader); @@ -109,7 +122,7 @@ public class StdioCommand implements LocalCommand { TimeUnit.HOURS, false, ignoreAttachments, - ns.getBoolean("json") ? new JsonReceiveMessageHandler(m) : new ReceiveMessageHandler(m) + inJson ? new JsonReceiveMessageHandler(m) : new ReceiveMessageHandler(m) /*true*/); } catch (IOException e) { System.err.println("Error while receiving messages: " + e.getMessage()); diff --git a/src/main/java/org/asamk/signal/json/JsonDataMessage.java b/src/main/java/org/asamk/signal/json/JsonDataMessage.java index 905395a0..6dbda978 100644 --- a/src/main/java/org/asamk/signal/json/JsonDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonDataMessage.java @@ -6,29 +6,10 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.asamk.Signal; import org.asamk.signal.manager.Manager; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; -import org.whispersystems.signalservice.api.messages.SignalServiceGroup; -import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; - -//class JsonReaction { -// String emoji; // unicode? -// String targetAuthor; -// long targetTimestamp; -// boolean isRemove; -// JsonReaction (SignalServiceDataMessage.Reaction reaction) { -// this.emoji = reaction.getEmoji(); -// // comment on this line from ReceiveMessageHandler: todo resolve -// this.targetAuthor = reaction.getTargetAuthor().getLegacyIdentifier(); -// this.targetTimestamp = reaction.getTargetSentTimestamp(); -// this.isRemove = reaction.isRemove(); -// } -//} - - class JsonDataMessage { @JsonProperty @@ -119,29 +100,6 @@ class JsonDataMessage { } else { this.attachments = List.of(); } - /*if (dataMessage.getReaction().isPresent()) { // not sure if json reactions have been properly implemented elsewhere - final SignalServiceDataMessage.Reaction reaction = dataMessage.getReaction().get(); - this.reaction = new JsonReaction(reaction); - this.emoji = reaction.getEmoji(); - this.targetAuthor = reaction.getTargetAuthor().getLegacyIdentifier(); - this.targetTimestamp = reaction.getTargetSentTimestamp(); - } else { - this.reaction = null; - this.emoji = ""; - this.targetAuthor = ""; - this.targetTimestamp = 0; - } - if (message.getQuote().isPresent()) { - SignalServiceDataMessage.Quote quote = message.getQuote().get(); - System.out.println("Quote: (" + quote.getId() + ")"); - // there doesn't seem to be any way to find a message's id? - System.out.println(" Author: " + quote.getAuthor().getLegacyIdentifier()); - System.out.println(" Text: " + quote.getText()); - } - if (message.isExpirationUpdate()) { - System.out.println("Is Expiration update: " + message.isExpirationUpdate()); - } - }*/ this.sticker = dataMessage.getSticker().isPresent() ? new JsonSticker(dataMessage.getSticker().get()) : null; if (dataMessage.getSharedContacts().isPresent()) { @@ -169,8 +127,7 @@ class JsonDataMessage { contacts = null; attachments = messageReceived.getAttachments().stream().map(JsonAttachment::new).collect(Collectors.toList()); } - // i don't understand what SyncMessages are so i'm going to ignore them - // i think it only matters if you have multiple devices on your end + public JsonDataMessage(Signal.SyncMessageReceived messageReceived) { timestamp = messageReceived.getTimestamp(); message = messageReceived.getMessage();