diff --git a/man/signal-cli-dbus.5.adoc b/man/signal-cli-dbus.5.adoc index ece2460f..3646922a 100755 --- a/man/signal-cli-dbus.5.adoc +++ b/man/signal-cli-dbus.5.adoc @@ -223,7 +223,7 @@ isRegistred -> result:: == Signals -SyncMessageReceived (timestamp, sender, destination, groupId,message, attachments):: +SyncMessageReceived (timestamp, sender, destination, groupId, message, mentions, attachments):: The sync message is received when the user sends a message from a linked device. ReceiptReceived (timestamp, sender):: @@ -232,11 +232,12 @@ ReceiptReceived (timestamp, sender):: This signal is sent by each recipient (e.g. each group member) after the message was successfully delivered to the device -MessageReceived(timestamp, sender, groupId, message, attachments):: +MessageReceived(timestamp, sender, groupId, message, mentions, attachments):: * timestamp : Integer value that is used by the system to send a ReceiptReceived reply * sender : Phone number of the sender * groupId : Byte array representing the internal group identifier (empty when private message) * message : Message text +* mentions : Struct array of mentions. A mention consists of a user name, its position in the message string and its length. * attachments : String array of filenames for the attachments. These files are located in the signal-cli storage and the current user needs to have read access there This signal is received whenever we get a private message or a message is posted in a group we are an active member diff --git a/src/main/java/org/asamk/Signal.java b/src/main/java/org/asamk/Signal.java index e7a21b88..e76df3ad 100644 --- a/src/main/java/org/asamk/Signal.java +++ b/src/main/java/org/asamk/Signal.java @@ -1,5 +1,6 @@ package org.asamk; +import org.asamk.signal.dbus.DbusMention; import org.freedesktop.dbus.exceptions.DBusException; import org.freedesktop.dbus.exceptions.DBusExecutionException; import org.freedesktop.dbus.interfaces.DBusInterface; @@ -101,6 +102,7 @@ public interface Signal extends DBusInterface { private final String sender; private final byte[] groupId; private final String message; + private final List mentions; private final List attachments; public MessageReceived( @@ -109,13 +111,15 @@ public interface Signal extends DBusInterface { String sender, byte[] groupId, String message, + List mentions, List attachments ) throws DBusException { - super(objectpath, timestamp, sender, groupId, message, attachments); + super(objectpath, timestamp, sender, groupId, message, mentions, attachments); this.timestamp = timestamp; this.sender = sender; this.groupId = groupId; this.message = message; + this.mentions = mentions; this.attachments = attachments; } @@ -135,6 +139,10 @@ public interface Signal extends DBusInterface { return message; } + public List getMentions() { + return mentions; + } + public List getAttachments() { return attachments; } @@ -167,6 +175,7 @@ public interface Signal extends DBusInterface { private final String destination; private final byte[] groupId; private final String message; + private final List mentions; private final List attachments; public SyncMessageReceived( @@ -176,14 +185,16 @@ public interface Signal extends DBusInterface { String destination, byte[] groupId, String message, + List mentions, List attachments ) throws DBusException { - super(objectpath, timestamp, source, destination, groupId, message, attachments); + super(objectpath, timestamp, source, destination, groupId, message, mentions, attachments); this.timestamp = timestamp; this.source = source; this.destination = destination; this.groupId = groupId; this.message = message; + this.mentions = mentions; this.attachments = attachments; } @@ -207,6 +218,10 @@ public interface Signal extends DBusInterface { return message; } + public List getMentions() { + return mentions; + } + public List getAttachments() { return attachments; } diff --git a/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java b/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java index 4deeefd3..1e540172 100644 --- a/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java +++ b/src/main/java/org/asamk/signal/JsonDbusReceiveMessageHandler.java @@ -1,6 +1,7 @@ package org.asamk.signal; import org.asamk.Signal; +import org.asamk.signal.dbus.DbusMention; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.groups.GroupUtils; import org.freedesktop.dbus.connections.impl.DBusConnection; @@ -74,6 +75,7 @@ public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler { getLegacyIdentifier(sender), groupId != null ? groupId : new byte[0], message.getBody().isPresent() ? message.getBody().get() : "", + JsonDbusReceiveMessageHandler.getMentions(message, m), JsonDbusReceiveMessageHandler.getAttachments(message, m))); } catch (DBusException e) { e.printStackTrace(); @@ -99,6 +101,7 @@ public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler { : "", groupId != null ? groupId : new byte[0], message.getBody().isPresent() ? message.getBody().get() : "", + JsonDbusReceiveMessageHandler.getMentions(message, m), JsonDbusReceiveMessageHandler.getAttachments(message, m))); } catch (DBusException e) { e.printStackTrace(); @@ -126,6 +129,16 @@ public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler { return attachments; } + static private List getMentions(SignalServiceDataMessage message, Manager m) { + var mentions = new ArrayList(); + if (message.getMentions().isPresent()) { + for (var mention : message.getMentions().get()) { + mentions.add(new DbusMention(mention, m)); + } + } + return mentions; + } + @Override public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, Throwable exception) { super.handleMessage(envelope, content, exception); diff --git a/src/main/java/org/asamk/signal/dbus/DbusMention.java b/src/main/java/org/asamk/signal/dbus/DbusMention.java new file mode 100644 index 00000000..45940002 --- /dev/null +++ b/src/main/java/org/asamk/signal/dbus/DbusMention.java @@ -0,0 +1,28 @@ +package org.asamk.signal.dbus; + +import org.asamk.signal.manager.Manager; +import org.freedesktop.dbus.Struct; +import org.freedesktop.dbus.annotations.Position; +import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; +import org.whispersystems.signalservice.api.push.SignalServiceAddress; + +import static org.asamk.signal.util.Util.getLegacyIdentifier; + +public final class DbusMention extends Struct { + + @Position(0) + public final String name; + + @Position(1) + public final int start; + + @Position(2) + public final int length; + + public DbusMention(SignalServiceDataMessage.Mention mention, Manager m) { + this.name = getLegacyIdentifier(m.resolveSignalServiceAddress(new SignalServiceAddress(mention.getUuid(), + null))); + this.start = mention.getStart(); + this.length = mention.getLength(); + } +}