From: Adaptive Garage Date: Fri, 2 Apr 2021 06:53:54 +0000 (+0200) Subject: dbus implementation of sendReaction command (#581) X-Git-Tag: v0.8.2~62 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/8f4d89e2f7e2658e4b6d28970fa447dff32a0a26 dbus implementation of sendReaction command (#581) --- diff --git a/src/main/java/org/asamk/Signal.java b/src/main/java/org/asamk/Signal.java index 3c65deb0..6e76f4a7 100644 --- a/src/main/java/org/asamk/Signal.java +++ b/src/main/java/org/asamk/Signal.java @@ -21,6 +21,14 @@ public interface Signal extends DBusInterface { String message, List attachments, List recipients ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.UntrustedIdentity; + long sendMessageReaction( + String emoji, boolean remove, String targetAuthor, long targetSentTimestamp, String recipient + ) throws Error.InvalidNumber, Error.Failure; + + long sendMessageReaction( + String emoji, boolean remove, String targetAuthor, long targetSentTimestamp, List recipients + ) throws Error.InvalidNumber, Error.Failure; + long sendNoteToSelfMessage( String message, List attachments ) throws Error.AttachmentInvalid, Error.Failure; @@ -31,6 +39,10 @@ public interface Signal extends DBusInterface { String message, List attachments, byte[] groupId ) throws Error.GroupNotFound, Error.Failure, Error.AttachmentInvalid; + long sendGroupMessageReaction( + String emoji, boolean remove, String targetAuthor, long targetSentTimestamp, byte[] groupId + ) throws Error.GroupNotFound, Error.Failure, Error.InvalidNumber; + String getContactName(String number) throws Error.InvalidNumber; void setContactName(String number, String name) throws Error.InvalidNumber; diff --git a/src/main/java/org/asamk/signal/commands/SendCommand.java b/src/main/java/org/asamk/signal/commands/SendCommand.java index 23d74165..bd94ca91 100644 --- a/src/main/java/org/asamk/signal/commands/SendCommand.java +++ b/src/main/java/org/asamk/signal/commands/SendCommand.java @@ -98,7 +98,7 @@ public class SendCommand implements DbusCommand { try { groupId = Util.decodeGroupId(groupIdString).serialize(); } catch (GroupIdFormatException e) { - throw new UserErrorException("Invalid group id:" + e.getMessage()); + throw new UserErrorException("Invalid group id: " + e.getMessage()); } try { diff --git a/src/main/java/org/asamk/signal/commands/SendReactionCommand.java b/src/main/java/org/asamk/signal/commands/SendReactionCommand.java index ba40488a..a80b6a23 100644 --- a/src/main/java/org/asamk/signal/commands/SendReactionCommand.java +++ b/src/main/java/org/asamk/signal/commands/SendReactionCommand.java @@ -4,27 +4,21 @@ import net.sourceforge.argparse4j.impl.Arguments; import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; +import org.asamk.Signal; import org.asamk.signal.PlainTextWriterImpl; import org.asamk.signal.commands.exceptions.CommandException; -import org.asamk.signal.commands.exceptions.IOErrorException; +import org.asamk.signal.commands.exceptions.UnexpectedErrorException; import org.asamk.signal.commands.exceptions.UserErrorException; -import org.asamk.signal.manager.Manager; -import org.asamk.signal.manager.groups.GroupId; import org.asamk.signal.manager.groups.GroupIdFormatException; -import org.asamk.signal.manager.groups.GroupNotFoundException; -import org.asamk.signal.manager.groups.NotAGroupMemberException; import org.asamk.signal.util.Util; -import org.whispersystems.libsignal.util.Pair; -import org.whispersystems.signalservice.api.messages.SendMessageResult; -import org.whispersystems.signalservice.api.util.InvalidNumberException; +import org.freedesktop.dbus.errors.UnknownObject; +import org.freedesktop.dbus.exceptions.DBusExecutionException; -import java.io.IOException; import java.util.List; import static org.asamk.signal.util.ErrorUtils.handleAssertionError; -import static org.asamk.signal.util.ErrorUtils.handleTimestampAndSendMessageResults; -public class SendReactionCommand implements LocalCommand { +public class SendReactionCommand implements DbusCommand { @Override public void attachToSubparser(final Subparser subparser) { @@ -45,7 +39,7 @@ public class SendReactionCommand implements LocalCommand { } @Override - public void handleCommand(final Namespace ns, final Manager m) throws CommandException { + public void handleCommand(final Namespace ns, final Signal signal) throws CommandException { final List recipients = ns.getList("recipient"); final var groupIdString = ns.getString("group"); @@ -64,35 +58,34 @@ public class SendReactionCommand implements LocalCommand { final var writer = new PlainTextWriterImpl(System.out); - final Pair> results; - - GroupId groupId = null; + byte[] groupId = null; if (groupIdString != null) { try { - groupId = Util.decodeGroupId(groupIdString); + groupId = Util.decodeGroupId(groupIdString).serialize(); } catch (GroupIdFormatException e) { - throw new UserErrorException("Invalid group id:" + e.getMessage()); + throw new UserErrorException("Invalid group id: " + e.getMessage()); } } try { + long timestamp; if (groupId != null) { - results = m.sendGroupMessageReaction(emoji, isRemove, targetAuthor, targetTimestamp, groupId); + timestamp = signal.sendGroupMessageReaction(emoji, isRemove, targetAuthor, targetTimestamp, groupId); } else { - results = m.sendMessageReaction(emoji, isRemove, targetAuthor, targetTimestamp, recipients); + timestamp = signal.sendMessageReaction(emoji, isRemove, targetAuthor, targetTimestamp, recipients); } - handleTimestampAndSendMessageResults(writer, results.first(), results.second()); - } catch (IOException e) { - throw new IOErrorException("Failed to send message: " + e.getMessage()); + writer.println("{}", timestamp); } catch (AssertionError e) { handleAssertionError(e); throw e; - } catch (GroupNotFoundException e) { - throw new UserErrorException("Failed to send to group: " + e.getMessage()); - } catch (NotAGroupMemberException e) { - throw new UserErrorException("Failed to send to group: " + e.getMessage()); - } catch (InvalidNumberException e) { + } catch (UnknownObject e) { + throw new UserErrorException("Failed to find dbus object, maybe missing the -u flag: " + e.getMessage()); + } catch (Signal.Error.InvalidNumber e) { throw new UserErrorException("Invalid number: " + e.getMessage()); + } catch (Signal.Error.GroupNotFound e) { + throw new UserErrorException("Failed to send to group: " + e.getMessage()); + } catch (DBusExecutionException e) { + throw new UnexpectedErrorException("Failed to send message: " + e.getMessage()); } } } diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 24a90662..9bc4b67f 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -103,6 +103,30 @@ public class DbusSignalImpl implements Signal { } } + @Override + public long sendMessageReaction( + final String emoji, final boolean remove, final String targetAuthor, final long targetSentTimestamp, final String recipient + ) { + var recipients = new ArrayList(1); + recipients.add(recipient); + return sendMessageReaction(emoji, remove, targetAuthor, targetSentTimestamp, recipients); + } + + @Override + public long sendMessageReaction( + final String emoji, final boolean remove, final String targetAuthor, final long targetSentTimestamp, final List recipients + ) { + try { + final var results = m.sendMessageReaction(emoji, remove, targetAuthor, targetSentTimestamp, recipients); + checkSendMessageResults(results.first(), results.second()); + return results.first(); + } catch (InvalidNumberException e) { + throw new Error.InvalidNumber(e.getMessage()); + } catch (IOException e) { + throw new Error.Failure(e.getMessage()); + } + } + @Override public long sendNoteToSelfMessage( final String message, final List attachments @@ -145,6 +169,23 @@ public class DbusSignalImpl implements Signal { } } + @Override + public long sendGroupMessageReaction( + final String emoji, final boolean remove, final String targetAuthor, final long targetSentTimestamp, final byte[] groupId + ) { + try { + final var results = m.sendGroupMessageReaction(emoji, remove, targetAuthor, targetSentTimestamp, GroupId.unknownVersion(groupId)); + checkSendMessageResults(results.first(), results.second()); + return results.first(); + } catch (IOException e) { + throw new Error.Failure(e.getMessage()); + } catch (InvalidNumberException e) { + throw new Error.InvalidNumber(e.getMessage()); + } catch (GroupNotFoundException | NotAGroupMemberException e) { + throw new Error.GroupNotFound(e.getMessage()); + } + } + // Since contact names might be empty if not defined, also potentially return // the profile name @Override