mirror of
https://github.com/AsamK/signal-cli
synced 2025-08-29 18:40:39 +00:00
Send self messages as normal messages, new flag --note-to-self for sync message
Fixes #373
This commit is contained in:
parent
b31e97dd2d
commit
e1134d832a
7 changed files with 98 additions and 18 deletions
|
@ -21,6 +21,10 @@ public interface Signal extends DBusInterface {
|
|||
String message, List<String> attachments, List<String> recipients
|
||||
) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.UnregisteredUser, Error.UntrustedIdentity;
|
||||
|
||||
long sendNoteToSelfMessage(
|
||||
String message, List<String> attachments
|
||||
) throws Error.AttachmentInvalid, Error.Failure, Error.UnregisteredUser, Error.UntrustedIdentity;
|
||||
|
||||
void sendEndSessionMessage(List<String> recipients) throws Error.Failure, Error.InvalidNumber, Error.UnregisteredUser, Error.UntrustedIdentity;
|
||||
|
||||
long sendGroupMessage(
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package org.asamk.signal.commands;
|
||||
|
||||
import net.sourceforge.argparse4j.impl.Arguments;
|
||||
import net.sourceforge.argparse4j.inf.MutuallyExclusiveGroup;
|
||||
import net.sourceforge.argparse4j.inf.Namespace;
|
||||
import net.sourceforge.argparse4j.inf.Subparser;
|
||||
|
||||
|
@ -13,7 +14,6 @@ import org.freedesktop.dbus.exceptions.DBusExecutionException;
|
|||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static org.asamk.signal.util.ErrorUtils.handleAssertionError;
|
||||
|
@ -23,8 +23,13 @@ public class SendCommand implements DbusCommand {
|
|||
|
||||
@Override
|
||||
public void attachToSubparser(final Subparser subparser) {
|
||||
subparser.addArgument("-g", "--group").help("Specify the recipient group ID.");
|
||||
subparser.addArgument("recipient").help("Specify the recipients' phone number.").nargs("*");
|
||||
final MutuallyExclusiveGroup mutuallyExclusiveGroup = subparser.addMutuallyExclusiveGroup();
|
||||
mutuallyExclusiveGroup.addArgument("-g", "--group").help("Specify the recipient group ID.");
|
||||
mutuallyExclusiveGroup.addArgument("--note-to-self")
|
||||
.help("Send the message to self without notification.")
|
||||
.action(Arguments.storeTrue());
|
||||
|
||||
subparser.addArgument("-m", "--message").help("Specify the message, if missing standard input is used.");
|
||||
subparser.addArgument("-a", "--attachment").nargs("*").help("Add file as attachment");
|
||||
subparser.addArgument("-e", "--endsession")
|
||||
|
@ -37,9 +42,10 @@ public class SendCommand implements DbusCommand {
|
|||
final List<String> recipients = ns.getList("recipient");
|
||||
final Boolean isEndSession = ns.getBoolean("endsession");
|
||||
final String groupIdString = ns.getString("group");
|
||||
final Boolean isNoteToSelf = ns.getBoolean("note_to_self");
|
||||
|
||||
final boolean noRecipients = recipients == null || recipients.isEmpty();
|
||||
if ((noRecipients && isEndSession) || (noRecipients && groupIdString == null)) {
|
||||
if ((noRecipients && isEndSession) || (noRecipients && groupIdString == null && !isNoteToSelf)) {
|
||||
System.err.println("No recipients given");
|
||||
System.err.println("Aborting sending.");
|
||||
return 1;
|
||||
|
@ -48,6 +54,10 @@ public class SendCommand implements DbusCommand {
|
|||
System.err.println("You cannot specify recipients by phone number and groups at the same time");
|
||||
return 1;
|
||||
}
|
||||
if (!noRecipients && isNoteToSelf) {
|
||||
System.err.println("You cannot specify recipients by phone number and not to self at the same time");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (isEndSession) {
|
||||
try {
|
||||
|
@ -75,11 +85,11 @@ public class SendCommand implements DbusCommand {
|
|||
|
||||
List<String> attachments = ns.getList("attachment");
|
||||
if (attachments == null) {
|
||||
attachments = new ArrayList<>();
|
||||
attachments = List.of();
|
||||
}
|
||||
|
||||
try {
|
||||
if (groupIdString != null) {
|
||||
if (groupIdString != null) {
|
||||
try {
|
||||
byte[] groupId;
|
||||
try {
|
||||
groupId = Util.decodeGroupId(groupIdString).serialize();
|
||||
|
@ -91,13 +101,27 @@ public class SendCommand implements DbusCommand {
|
|||
long timestamp = signal.sendGroupMessage(messageText, attachments, groupId);
|
||||
System.out.println(timestamp);
|
||||
return 0;
|
||||
} catch (AssertionError e) {
|
||||
handleAssertionError(e);
|
||||
return 1;
|
||||
} catch (DBusExecutionException e) {
|
||||
System.err.println("Failed to send group message: " + e.getMessage());
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (isNoteToSelf) {
|
||||
try {
|
||||
long timestamp = signal.sendNoteToSelfMessage(messageText, attachments);
|
||||
System.out.println(timestamp);
|
||||
return 0;
|
||||
} catch (AssertionError e) {
|
||||
handleAssertionError(e);
|
||||
return 1;
|
||||
} catch (DBusExecutionException e) {
|
||||
System.err.println("Failed to send note to self message: " + e.getMessage());
|
||||
return 2;
|
||||
}
|
||||
} catch (AssertionError e) {
|
||||
handleAssertionError(e);
|
||||
return 1;
|
||||
} catch (DBusExecutionException e) {
|
||||
System.err.println("Failed to send message: " + e.getMessage());
|
||||
return 2;
|
||||
}
|
||||
|
||||
try {
|
||||
|
|
|
@ -78,6 +78,21 @@ public class DbusSignalImpl implements Signal {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public long sendNoteToSelfMessage(
|
||||
final String message, final List<String> attachments
|
||||
) throws Error.AttachmentInvalid, Error.Failure, Error.UnregisteredUser, Error.UntrustedIdentity {
|
||||
try {
|
||||
final Pair<Long, List<SendMessageResult>> results = m.sendSelfMessage(message, attachments);
|
||||
checkSendMessageResults(results.first(), results.second());
|
||||
return results.first();
|
||||
} catch (AttachmentInvalidException e) {
|
||||
throw new Error.AttachmentInvalid(e.getMessage());
|
||||
} catch (IOException e) {
|
||||
throw new Error.Failure(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendEndSessionMessage(final List<String> recipients) {
|
||||
try {
|
||||
|
|
|
@ -953,6 +953,17 @@ public class Manager implements Closeable {
|
|||
return sendMessage(messageBuilder, getSignalServiceAddresses(recipients));
|
||||
}
|
||||
|
||||
public Pair<Long, List<SendMessageResult>> sendSelfMessage(
|
||||
String messageText, List<String> attachments
|
||||
) throws IOException, AttachmentInvalidException {
|
||||
final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder()
|
||||
.withBody(messageText);
|
||||
if (attachments != null) {
|
||||
messageBuilder.withAttachments(AttachmentUtils.getSignalServiceAttachments(attachments));
|
||||
}
|
||||
return sendSelfMessage(messageBuilder);
|
||||
}
|
||||
|
||||
public Pair<Long, List<SendMessageResult>> sendMessageReaction(
|
||||
String emoji, boolean remove, String targetAuthor, long targetSentTimestamp, List<String> recipients
|
||||
) throws IOException, InvalidNumberException {
|
||||
|
@ -1253,11 +1264,7 @@ public class Manager implements Closeable {
|
|||
final int expirationTime = contact != null ? contact.messageExpirationTime : 0;
|
||||
messageBuilder.withExpiration(expirationTime);
|
||||
message = messageBuilder.build();
|
||||
if (address.matches(account.getSelfAddress())) {
|
||||
results.add(sendSelfMessage(message));
|
||||
} else {
|
||||
results.add(sendMessage(address, message));
|
||||
}
|
||||
results.add(sendMessage(address, message));
|
||||
}
|
||||
return new Pair<>(timestamp, results);
|
||||
}
|
||||
|
@ -1271,6 +1278,28 @@ public class Manager implements Closeable {
|
|||
}
|
||||
}
|
||||
|
||||
private Pair<Long, List<SendMessageResult>> sendSelfMessage(
|
||||
SignalServiceDataMessage.Builder messageBuilder
|
||||
) throws IOException {
|
||||
final long timestamp = System.currentTimeMillis();
|
||||
messageBuilder.withTimestamp(timestamp);
|
||||
getOrCreateMessagePipe();
|
||||
getOrCreateUnidentifiedMessagePipe();
|
||||
try {
|
||||
final SignalServiceAddress address = getSelfAddress();
|
||||
|
||||
final ContactInfo contact = account.getContactStore().getContact(address);
|
||||
final int expirationTime = contact != null ? contact.messageExpirationTime : 0;
|
||||
messageBuilder.withExpiration(expirationTime);
|
||||
|
||||
SignalServiceDataMessage message = messageBuilder.build();
|
||||
final SendMessageResult result = sendSelfMessage(message);
|
||||
return new Pair<>(timestamp, List.of(result));
|
||||
} finally {
|
||||
account.save();
|
||||
}
|
||||
}
|
||||
|
||||
private SendMessageResult sendSelfMessage(SignalServiceDataMessage message) throws IOException {
|
||||
SignalServiceMessageSender messageSender = createMessageSender();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue