mirror of
https://github.com/AsamK/signal-cli
synced 2025-08-29 18:40:39 +00:00
Output json when receiving messages from dbus and --json parameter is given
Fixes #138
This commit is contained in:
parent
e04c45766d
commit
ae41d0c502
15 changed files with 176 additions and 50 deletions
31
src/main/java/org/asamk/signal/json/JsonAttachment.java
Normal file
31
src/main/java/org/asamk/signal/json/JsonAttachment.java
Normal file
|
@ -0,0 +1,31 @@
|
|||
package org.asamk.signal.json;
|
||||
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer;
|
||||
|
||||
class JsonAttachment {
|
||||
|
||||
String contentType;
|
||||
String filename;
|
||||
String id;
|
||||
int size;
|
||||
|
||||
JsonAttachment(SignalServiceAttachment attachment) {
|
||||
this.contentType = attachment.getContentType();
|
||||
|
||||
final SignalServiceAttachmentPointer pointer = attachment.asPointer();
|
||||
if (attachment.isPointer()) {
|
||||
this.id = String.valueOf(pointer.getId());
|
||||
if (pointer.getFileName().isPresent()) {
|
||||
this.filename = pointer.getFileName().get();
|
||||
}
|
||||
if (pointer.getSize().isPresent()) {
|
||||
this.size = pointer.getSize().get();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JsonAttachment(String filename) {
|
||||
this.filename = filename;
|
||||
}
|
||||
}
|
37
src/main/java/org/asamk/signal/json/JsonCallMessage.java
Normal file
37
src/main/java/org/asamk/signal/json/JsonCallMessage.java
Normal file
|
@ -0,0 +1,37 @@
|
|||
package org.asamk.signal.json;
|
||||
|
||||
import org.whispersystems.signalservice.api.messages.calls.AnswerMessage;
|
||||
import org.whispersystems.signalservice.api.messages.calls.BusyMessage;
|
||||
import org.whispersystems.signalservice.api.messages.calls.HangupMessage;
|
||||
import org.whispersystems.signalservice.api.messages.calls.IceUpdateMessage;
|
||||
import org.whispersystems.signalservice.api.messages.calls.OfferMessage;
|
||||
import org.whispersystems.signalservice.api.messages.calls.SignalServiceCallMessage;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
class JsonCallMessage {
|
||||
|
||||
OfferMessage offerMessage;
|
||||
AnswerMessage answerMessage;
|
||||
BusyMessage busyMessage;
|
||||
HangupMessage hangupMessage;
|
||||
List<IceUpdateMessage> iceUpdateMessages;
|
||||
|
||||
JsonCallMessage(SignalServiceCallMessage callMessage) {
|
||||
if (callMessage.getOfferMessage().isPresent()) {
|
||||
this.offerMessage = callMessage.getOfferMessage().get();
|
||||
}
|
||||
if (callMessage.getAnswerMessage().isPresent()) {
|
||||
this.answerMessage = callMessage.getAnswerMessage().get();
|
||||
}
|
||||
if (callMessage.getBusyMessage().isPresent()) {
|
||||
this.busyMessage = callMessage.getBusyMessage().get();
|
||||
}
|
||||
if (callMessage.getHangupMessage().isPresent()) {
|
||||
this.hangupMessage = callMessage.getHangupMessage().get();
|
||||
}
|
||||
if (callMessage.getIceUpdateMessages().isPresent()) {
|
||||
this.iceUpdateMessages = callMessage.getIceUpdateMessages().get();
|
||||
}
|
||||
}
|
||||
}
|
59
src/main/java/org/asamk/signal/json/JsonDataMessage.java
Normal file
59
src/main/java/org/asamk/signal/json/JsonDataMessage.java
Normal file
|
@ -0,0 +1,59 @@
|
|||
package org.asamk.signal.json;
|
||||
|
||||
import org.asamk.Signal;
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
class JsonDataMessage {
|
||||
|
||||
long timestamp;
|
||||
String message;
|
||||
int expiresInSeconds;
|
||||
List<JsonAttachment> attachments;
|
||||
JsonGroupInfo groupInfo;
|
||||
|
||||
JsonDataMessage(SignalServiceDataMessage dataMessage) {
|
||||
this.timestamp = dataMessage.getTimestamp();
|
||||
if (dataMessage.getGroupContext().isPresent() && dataMessage.getGroupContext().get().getGroupV1().isPresent()) {
|
||||
SignalServiceGroup groupInfo = dataMessage.getGroupContext().get().getGroupV1().get();
|
||||
this.groupInfo = new JsonGroupInfo(groupInfo);
|
||||
}
|
||||
if (dataMessage.getBody().isPresent()) {
|
||||
this.message = dataMessage.getBody().get();
|
||||
}
|
||||
this.expiresInSeconds = dataMessage.getExpiresInSeconds();
|
||||
if (dataMessage.getAttachments().isPresent()) {
|
||||
this.attachments = new ArrayList<>(dataMessage.getAttachments().get().size());
|
||||
for (SignalServiceAttachment attachment : dataMessage.getAttachments().get()) {
|
||||
this.attachments.add(new JsonAttachment(attachment));
|
||||
}
|
||||
} else {
|
||||
this.attachments = new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
public JsonDataMessage(Signal.MessageReceived messageReceived) {
|
||||
timestamp = messageReceived.getTimestamp();
|
||||
message = messageReceived.getMessage();
|
||||
groupInfo = new JsonGroupInfo(messageReceived.getGroupId());
|
||||
attachments = messageReceived.getAttachments()
|
||||
.stream()
|
||||
.map(JsonAttachment::new)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public JsonDataMessage(Signal.SyncMessageReceived messageReceived) {
|
||||
timestamp = messageReceived.getTimestamp();
|
||||
message = messageReceived.getMessage();
|
||||
groupInfo = new JsonGroupInfo(messageReceived.getGroupId());
|
||||
attachments = messageReceived.getAttachments()
|
||||
.stream()
|
||||
.map(JsonAttachment::new)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
10
src/main/java/org/asamk/signal/json/JsonError.java
Normal file
10
src/main/java/org/asamk/signal/json/JsonError.java
Normal file
|
@ -0,0 +1,10 @@
|
|||
package org.asamk.signal.json;
|
||||
|
||||
public class JsonError {
|
||||
|
||||
String message;
|
||||
|
||||
public JsonError(Throwable exception) {
|
||||
this.message = exception.getMessage();
|
||||
}
|
||||
}
|
34
src/main/java/org/asamk/signal/json/JsonGroupInfo.java
Normal file
34
src/main/java/org/asamk/signal/json/JsonGroupInfo.java
Normal file
|
@ -0,0 +1,34 @@
|
|||
package org.asamk.signal.json;
|
||||
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
|
||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
||||
import org.whispersystems.util.Base64;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
class JsonGroupInfo {
|
||||
|
||||
String groupId;
|
||||
List<String> members;
|
||||
String name;
|
||||
String type;
|
||||
|
||||
JsonGroupInfo(SignalServiceGroup groupInfo) {
|
||||
this.groupId = Base64.encodeBytes(groupInfo.getGroupId());
|
||||
if (groupInfo.getMembers().isPresent()) {
|
||||
this.members = new ArrayList<>(groupInfo.getMembers().get().size());
|
||||
for (SignalServiceAddress address : groupInfo.getMembers().get()) {
|
||||
this.members.add(address.getNumber().get());
|
||||
}
|
||||
}
|
||||
if (groupInfo.getName().isPresent()) {
|
||||
this.name = groupInfo.getName().get();
|
||||
}
|
||||
this.type = groupInfo.getType().toString();
|
||||
}
|
||||
|
||||
JsonGroupInfo(byte[] groupId) {
|
||||
this.groupId = Base64.encodeBytes(groupId);
|
||||
}
|
||||
}
|
66
src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java
Normal file
66
src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java
Normal file
|
@ -0,0 +1,66 @@
|
|||
package org.asamk.signal.json;
|
||||
|
||||
import org.asamk.Signal;
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceContent;
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
|
||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
||||
|
||||
public class JsonMessageEnvelope {
|
||||
|
||||
String source;
|
||||
int sourceDevice;
|
||||
String relay;
|
||||
long timestamp;
|
||||
boolean isReceipt;
|
||||
JsonDataMessage dataMessage;
|
||||
JsonSyncMessage syncMessage;
|
||||
JsonCallMessage callMessage;
|
||||
JsonReceiptMessage receiptMessage;
|
||||
|
||||
public JsonMessageEnvelope(SignalServiceEnvelope envelope, SignalServiceContent content) {
|
||||
if (!envelope.isUnidentifiedSender() && envelope.hasSource()) {
|
||||
SignalServiceAddress source = envelope.getSourceAddress();
|
||||
this.source = source.getNumber().get();
|
||||
this.relay = source.getRelay().isPresent() ? source.getRelay().get() : null;
|
||||
}
|
||||
this.sourceDevice = envelope.getSourceDevice();
|
||||
this.timestamp = envelope.getTimestamp();
|
||||
this.isReceipt = envelope.isReceipt();
|
||||
if (content != null) {
|
||||
if (envelope.isUnidentifiedSender()) {
|
||||
this.source = content.getSender().getNumber().get();
|
||||
this.sourceDevice = content.getSenderDevice();
|
||||
}
|
||||
if (content.getDataMessage().isPresent()) {
|
||||
this.dataMessage = new JsonDataMessage(content.getDataMessage().get());
|
||||
}
|
||||
if (content.getSyncMessage().isPresent()) {
|
||||
this.syncMessage = new JsonSyncMessage(content.getSyncMessage().get());
|
||||
}
|
||||
if (content.getCallMessage().isPresent()) {
|
||||
this.callMessage = new JsonCallMessage(content.getCallMessage().get());
|
||||
}
|
||||
if (content.getReceiptMessage().isPresent()) {
|
||||
this.receiptMessage = new JsonReceiptMessage(content.getReceiptMessage().get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public JsonMessageEnvelope(Signal.MessageReceived messageReceived) {
|
||||
source = messageReceived.getSender();
|
||||
timestamp = messageReceived.getTimestamp();
|
||||
dataMessage = new JsonDataMessage(messageReceived);
|
||||
}
|
||||
|
||||
public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) {
|
||||
source = receiptReceived.getSender();
|
||||
timestamp = receiptReceived.getTimestamp();
|
||||
isReceipt = true;
|
||||
}
|
||||
|
||||
public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) {
|
||||
source = messageReceived.getSource();
|
||||
timestamp = messageReceived.getTimestamp();
|
||||
syncMessage = new JsonSyncMessage(messageReceived);
|
||||
}
|
||||
}
|
25
src/main/java/org/asamk/signal/json/JsonReceiptMessage.java
Normal file
25
src/main/java/org/asamk/signal/json/JsonReceiptMessage.java
Normal file
|
@ -0,0 +1,25 @@
|
|||
package org.asamk.signal.json;
|
||||
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
class JsonReceiptMessage {
|
||||
|
||||
long when;
|
||||
boolean isDelivery;
|
||||
boolean isRead;
|
||||
List<Long> timestamps;
|
||||
|
||||
JsonReceiptMessage(SignalServiceReceiptMessage receiptMessage) {
|
||||
|
||||
this.when = receiptMessage.getWhen();
|
||||
if (receiptMessage.isDeliveryReceipt()) {
|
||||
this.isDelivery = true;
|
||||
}
|
||||
if (receiptMessage.isReadReceipt()) {
|
||||
this.isRead = true;
|
||||
}
|
||||
this.timestamps = receiptMessage.getTimestamps();
|
||||
}
|
||||
}
|
21
src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java
Normal file
21
src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java
Normal file
|
@ -0,0 +1,21 @@
|
|||
package org.asamk.signal.json;
|
||||
|
||||
import org.asamk.Signal;
|
||||
import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage;
|
||||
|
||||
class JsonSyncDataMessage extends JsonDataMessage {
|
||||
|
||||
String destination;
|
||||
|
||||
JsonSyncDataMessage(SentTranscriptMessage transcriptMessage) {
|
||||
super(transcriptMessage.getMessage());
|
||||
if (transcriptMessage.getDestination().isPresent()) {
|
||||
this.destination = transcriptMessage.getDestination().get().getNumber().get();
|
||||
}
|
||||
}
|
||||
|
||||
JsonSyncDataMessage(Signal.SyncMessageReceived messageReceived) {
|
||||
super(messageReceived);
|
||||
destination = messageReceived.getDestination();
|
||||
}
|
||||
}
|
50
src/main/java/org/asamk/signal/json/JsonSyncMessage.java
Normal file
50
src/main/java/org/asamk/signal/json/JsonSyncMessage.java
Normal file
|
@ -0,0 +1,50 @@
|
|||
package org.asamk.signal.json;
|
||||
|
||||
import org.asamk.Signal;
|
||||
import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage;
|
||||
import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
|
||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
enum JsonSyncMessageType {
|
||||
CONTACTS_SYNC,
|
||||
GROUPS_SYNC,
|
||||
REQUEST_SYNC
|
||||
}
|
||||
|
||||
class JsonSyncMessage {
|
||||
|
||||
JsonSyncDataMessage sentMessage;
|
||||
List<String> blockedNumbers;
|
||||
List<ReadMessage> readMessages;
|
||||
JsonSyncMessageType type;
|
||||
|
||||
JsonSyncMessage(SignalServiceSyncMessage syncMessage) {
|
||||
if (syncMessage.getSent().isPresent()) {
|
||||
this.sentMessage = new JsonSyncDataMessage(syncMessage.getSent().get());
|
||||
}
|
||||
if (syncMessage.getBlockedList().isPresent()) {
|
||||
this.blockedNumbers = new ArrayList<>(syncMessage.getBlockedList().get().getAddresses().size());
|
||||
for (SignalServiceAddress address : syncMessage.getBlockedList().get().getAddresses()) {
|
||||
this.blockedNumbers.add(address.getNumber().get());
|
||||
}
|
||||
}
|
||||
if (syncMessage.getRead().isPresent()) {
|
||||
this.readMessages = syncMessage.getRead().get();
|
||||
}
|
||||
|
||||
if (syncMessage.getContacts().isPresent()) {
|
||||
this.type = JsonSyncMessageType.CONTACTS_SYNC;
|
||||
} else if (syncMessage.getGroups().isPresent()) {
|
||||
this.type = JsonSyncMessageType.GROUPS_SYNC;
|
||||
} else if (syncMessage.getRequest().isPresent()) {
|
||||
this.type = JsonSyncMessageType.REQUEST_SYNC;
|
||||
}
|
||||
}
|
||||
|
||||
JsonSyncMessage(Signal.SyncMessageReceived messageReceived) {
|
||||
sentMessage = new JsonSyncDataMessage(messageReceived);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue