From: AsamK Date: Thu, 19 May 2022 18:54:15 +0000 (+0200) Subject: Implement sendPayment notification command X-Git-Tag: v0.10.7~26 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/7587a603872a337dd6be706854a0658ea131dbbe?ds=inline Implement sendPayment notification command --- diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index cc3ce0ce..e568816f 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -141,6 +141,10 @@ public interface Manager extends Closeable { Set recipients ) throws IOException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException; + SendMessageResults sendPaymentNotificationMessage( + byte[] receipt, String note, RecipientIdentifier.Single recipient + ) throws IOException; + SendMessageResults sendEndSessionMessage(Set recipients) throws IOException; void deleteRecipient(RecipientIdentifier.Single recipient); diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index f2d080fd..ed7ae86b 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -638,6 +638,20 @@ class ManagerImpl implements Manager { return sendMessage(messageBuilder, recipients); } + @Override + public SendMessageResults sendPaymentNotificationMessage( + byte[] receipt, String note, RecipientIdentifier.Single recipient + ) throws IOException { + final var paymentNotification = new SignalServiceDataMessage.PaymentNotification(receipt, note); + final var payment = new SignalServiceDataMessage.Payment(paymentNotification); + final var messageBuilder = SignalServiceDataMessage.newBuilder().withPayment(payment); + try { + return sendMessage(messageBuilder, Set.of(recipient)); + } catch (NotAGroupMemberException | GroupNotFoundException | GroupSendingNotAllowedException e) { + throw new AssertionError(e); + } + } + @Override public SendMessageResults sendEndSessionMessage(Set recipients) throws IOException { var messageBuilder = SignalServiceDataMessage.newBuilder().asEndSessionMessage(); diff --git a/man/signal-cli.1.adoc b/man/signal-cli.1.adoc index 7d1aa6f1..1cebd044 100644 --- a/man/signal-cli.1.adoc +++ b/man/signal-cli.1.adoc @@ -256,6 +256,19 @@ Specify the mentions of the original message (same format as `--mention`). *-e*, *--end-session*:: Clear session state and send end session message. +=== sendPaymentNotification + +Send a payment notification. + +RECIPIENT:: +Specify the recipient’s phone number. + +*--receipt* RECEIPT:: +The base64 encoded receipt blob. + +*--note* NOTE:: +Specify a note for the payment notification. + === sendReaction Send reaction to a previously received or sent message. diff --git a/src/main/java/org/asamk/signal/commands/Commands.java b/src/main/java/org/asamk/signal/commands/Commands.java index 15ab1724..1c4251da 100644 --- a/src/main/java/org/asamk/signal/commands/Commands.java +++ b/src/main/java/org/asamk/signal/commands/Commands.java @@ -34,6 +34,7 @@ public class Commands { addCommand(new RemoteDeleteCommand()); addCommand(new SendCommand()); addCommand(new SendContactsCommand()); + addCommand(new SendPaymentNotificationCommand()); addCommand(new SendReactionCommand()); addCommand(new SendReceiptCommand()); addCommand(new SendSyncRequestCommand()); diff --git a/src/main/java/org/asamk/signal/commands/SendPaymentNotificationCommand.java b/src/main/java/org/asamk/signal/commands/SendPaymentNotificationCommand.java new file mode 100644 index 00000000..77181e3e --- /dev/null +++ b/src/main/java/org/asamk/signal/commands/SendPaymentNotificationCommand.java @@ -0,0 +1,51 @@ +package org.asamk.signal.commands; + +import net.sourceforge.argparse4j.inf.Namespace; +import net.sourceforge.argparse4j.inf.Subparser; + +import org.asamk.signal.commands.exceptions.CommandException; +import org.asamk.signal.commands.exceptions.UnexpectedErrorException; +import org.asamk.signal.manager.Manager; +import org.asamk.signal.output.OutputWriter; +import org.asamk.signal.util.CommandUtil; + +import java.io.IOException; +import java.util.Base64; + +import static org.asamk.signal.util.SendMessageResultUtils.outputResult; + +public class SendPaymentNotificationCommand implements JsonRpcLocalCommand { + + @Override + public String getName() { + return "sendPaymentNotification"; + } + + @Override + public void attachToSubparser(final Subparser subparser) { + subparser.help("Send a payment notification."); + subparser.addArgument("recipient").help("Specify the recipient's phone number."); + subparser.addArgument("--receipt").required(true).help("The base64 encoded receipt blob."); + subparser.addArgument("--note").help("Specify a note for the payment notification."); + } + + @Override + public void handleCommand( + final Namespace ns, final Manager m, final OutputWriter outputWriter + ) throws CommandException { + final var recipientString = ns.getString("recipient"); + final var recipientIdentifier = CommandUtil.getSingleRecipientIdentifier(recipientString, m.getSelfNumber()); + + final var receiptString = ns.getString("receipt"); + final var receipt = Base64.getDecoder().decode(receiptString); + final var note = ns.getString("note"); + + try { + final var results = m.sendPaymentNotificationMessage(receipt, note, recipientIdentifier); + outputResult(outputWriter, results); + } catch (IOException e) { + throw new UnexpectedErrorException("Failed to send message: " + e.getMessage() + " (" + e.getClass() + .getSimpleName() + ")", e); + } + } +} diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index 11800be2..6bb93677 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -388,6 +388,13 @@ public class DbusManagerImpl implements Manager { groupId)); } + @Override + public SendMessageResults sendPaymentNotificationMessage( + final byte[] receipt, final String note, final RecipientIdentifier.Single recipient + ) throws IOException { + throw new UnsupportedOperationException(); + } + @Override public SendMessageResults sendEndSessionMessage(final Set recipients) throws IOException { signal.sendEndSessionMessage(recipients.stream().map(RecipientIdentifier.Single::getIdentifier).toList());