From 48348ad6bd2b07fda58dcc41270619c62b09b482 Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:58:57 -0300 Subject: [PATCH 01/11] Feat: pin messages --- .../java/it/auties/whatsapp/api/Whatsapp.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/main/java/it/auties/whatsapp/api/Whatsapp.java b/src/main/java/it/auties/whatsapp/api/Whatsapp.java index b8c05869..95790f0e 100644 --- a/src/main/java/it/auties/whatsapp/api/Whatsapp.java +++ b/src/main/java/it/auties/whatsapp/api/Whatsapp.java @@ -674,6 +674,44 @@ public CompletableFuture editMessage(T oldMessage, Me }; } + /** + * Pin a message + * + * @param messageKey non-null message key to pin + * @param pinTimer the default timer that message will be pinned + * @return a CompletableFuture + */ + public CompletableFuture pinMessage(ChatMessageKey messageKey, ChatMessagePinTimer pinTimer) { + if (messageKey.fromMe()) { + messageKey.setSenderJid(null); + } + var message = new PinInChatMessageBuilder() + .key(messageKey) + .pinType(PinInChatMessage.Type.PIN_FOR_ALL) + .senderTimestampMilliseconds(Clock.nowMilliseconds()) + .build(); + var deviceInfo = new DeviceContextInfoBuilder() + .messageAddOnDurationInSecs(pinTimer.periodSeconds()) + .build(); + var sender = messageKey.chatJid().hasServer(JidServer.GROUP) ? jidOrThrowError() : null; + var key = new ChatMessageKeyBuilder() + .id(ChatMessageKey.randomIdV2(sender, store().clientType())) + .chatJid(messageKey.chatJid()) + .fromMe(true) + .senderJid(sender) + .build(); + var pinInfo = new ChatMessageInfoBuilder() + .status(MessageStatus.PENDING) + .senderJid(sender) + .key(key) + .message(MessageContainer.of(message).withDeviceInfo(deviceInfo)) + .timestampSeconds(Clock.nowSeconds()) + .build(); + var attrs = Map.of("edit", 2); + var request = new MessageSendRequest.Chat(pinInfo, null, false, false, attrs); + return socketHandler.sendMessage(request); + } + public CompletableFuture sendStatus(String message) { return sendStatus(MessageContainer.of(message)); } From de652e8ac41b9a298cb6fdb31493d3c55c2d420d Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:13:36 -0300 Subject: [PATCH 02/11] Add files via upload --- .../model/chat/ChatMessagePinTimer.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/main/java/it/auties/whatsapp/model/chat/ChatMessagePinTimer.java diff --git a/src/main/java/it/auties/whatsapp/model/chat/ChatMessagePinTimer.java b/src/main/java/it/auties/whatsapp/model/chat/ChatMessagePinTimer.java new file mode 100644 index 00000000..aa5c5f94 --- /dev/null +++ b/src/main/java/it/auties/whatsapp/model/chat/ChatMessagePinTimer.java @@ -0,0 +1,63 @@ +package it.auties.whatsapp.model.chat; + +import it.auties.protobuf.annotation.ProtobufConverter; +import it.auties.protobuf.annotation.ProtobufEnumIndex; +import it.auties.protobuf.model.ProtobufEnum; + +import java.time.Duration; +import java.util.Arrays; + +/** + * Enum representing the ChatMessagePinTimer period. Each constant is associated with a specific + * duration period. + */ +public enum ChatMessagePinTimer implements ProtobufEnum { + /** + * ChatMessagePinTimer with duration of 0 days. + */ + OFF(0, Duration.ofDays(0)), + + /** + * ChatMessagePinTimer with duration of 1 day. + */ + ONE_DAY(1, Duration.ofDays(1)), + + /** + * ChatMessagePinTimer with duration of 7 days. + */ + ONE_WEEK(2, Duration.ofDays(7)), + + /** + * ChatMessagePinTimer with duration of 30 days. + */ + ONE_MONTH(3, Duration.ofDays(30)); + + private final Duration period; + final int index; + + ChatMessagePinTimer(@ProtobufEnumIndex int index, Duration period) { + this.index = index; + this.period = period; + } + + public int index() { + return index; + } + + public Duration period() { + return period; + } + + @ProtobufConverter + public static ChatMessagePinTimer of(int value) { + return Arrays.stream(values()) + .filter(entry -> entry.period().toSeconds() == value || entry.period().toDays() == value) + .findFirst() + .orElse(OFF); + } + + @ProtobufConverter + public int periodSeconds() { + return (int) period.toSeconds(); + } +} \ No newline at end of file From a7735e0ab23bfa2ced2297b7e6ba7dbe73052935 Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:14:57 -0300 Subject: [PATCH 03/11] Update DeviceContextInfo.java --- .../auties/whatsapp/model/info/DeviceContextInfo.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/it/auties/whatsapp/model/info/DeviceContextInfo.java b/src/main/java/it/auties/whatsapp/model/info/DeviceContextInfo.java index da626a36..9757cc5d 100644 --- a/src/main/java/it/auties/whatsapp/model/info/DeviceContextInfo.java +++ b/src/main/java/it/auties/whatsapp/model/info/DeviceContextInfo.java @@ -23,12 +23,16 @@ public final class DeviceContextInfo implements Info, ProtobufMessage { @ProtobufProperty(index = 4, type = ProtobufType.BYTES) private final byte[] paddingBytes; + @ProtobufProperty(index = 5, type = ProtobufType.UINT32) + private final int messageAddOnDurationInSecs; + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) public DeviceContextInfo(DeviceListMetadata deviceListMetadata, int deviceListMetadataVersion, byte[] messageSecret, byte[] paddingBytes) { this.deviceListMetadata = deviceListMetadata; this.deviceListMetadataVersion = deviceListMetadataVersion; this.messageSecret = messageSecret; this.paddingBytes = paddingBytes; + this.messageAddOnDurationInSecs = messageAddOnDurationInSecs; } public Optional deviceListMetadata() { @@ -50,4 +54,8 @@ public void setMessageSecret(byte[] messageSecret) { public Optional paddingBytes() { return Optional.ofNullable(paddingBytes); } -} \ No newline at end of file + + public int messageAddOnDurationInSecs() { + return messageAddOnDurationInSecs; + } +} From 9498b8542d4da4e22b24e68d616ebfb97a3d89ae Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:17:43 -0300 Subject: [PATCH 04/11] Update Message.java --- .../java/it/auties/whatsapp/model/message/model/Message.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/it/auties/whatsapp/model/message/model/Message.java b/src/main/java/it/auties/whatsapp/model/message/model/Message.java index 662cae3a..450eabb3 100644 --- a/src/main/java/it/auties/whatsapp/model/message/model/Message.java +++ b/src/main/java/it/auties/whatsapp/model/message/model/Message.java @@ -6,7 +6,7 @@ /** * A model interface that represents a message sent by a contact or by Whatsapp. */ -public sealed interface Message extends ProtobufMessage permits ButtonMessage, ContextualMessage, PaymentMessage, ServerMessage, CallMessage, EmptyMessage, KeepInChatMessage, NewsletterAdminInviteMessage, PollUpdateMessage, ReactionMessage { +public sealed interface Message extends ProtobufMessage permits ButtonMessage, ContextualMessage, PaymentMessage, ServerMessage, CallMessage, EmptyMessage, KeepInChatMessage, NewsletterAdminInviteMessage, PinInChatMessage, PollUpdateMessage, ReactionMessage { /** * Return message type * From 4708fbe5ee0f75d005de3d4986effa171e8edc85 Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:20:19 -0300 Subject: [PATCH 05/11] Update MessageContainer.java --- .../whatsapp/model/message/model/MessageContainer.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/it/auties/whatsapp/model/message/model/MessageContainer.java b/src/main/java/it/auties/whatsapp/model/message/model/MessageContainer.java index 421c4b50..68d86ed4 100644 --- a/src/main/java/it/auties/whatsapp/model/message/model/MessageContainer.java +++ b/src/main/java/it/auties/whatsapp/model/message/model/MessageContainer.java @@ -126,6 +126,8 @@ public record MessageContainer( Optional editedMessage, @ProtobufProperty(index = 59, type = ProtobufType.OBJECT) Optional viewOnceV2ExtensionMessage, + @ProtobufProperty(index = 63, type = ProtobufType.OBJECT) + Optional pinInChatMessage, @ProtobufProperty(index = 78, type = ProtobufType.OBJECT) Optional newsletterAdminInviteMessage, @ProtobufProperty(index = 35, type = ProtobufType.OBJECT) @@ -210,6 +212,7 @@ public static MessageContainerBuilder ofBuilder(T message) { builder.pollCreationMessage(Optional.of(pollCreationMessage)); case PollUpdateMessage pollUpdateMessage -> builder.pollUpdateMessage(Optional.of(pollUpdateMessage)); case KeepInChatMessage keepInChatMessage -> builder.keepInChatMessage(Optional.of(keepInChatMessage)); + case PinInChatMessage pinInChatMessage -> builder.pinInChatMessage(Optional.of(pinInChatMessage)); case RequestPhoneNumberMessage requestPhoneNumberMessage -> builder.requestPhoneNumberMessage(Optional.of(requestPhoneNumberMessage)); case EncryptedReactionMessage encReactionMessage -> @@ -420,6 +423,9 @@ public Message content() { if (keepInChatMessage.isPresent()) { return keepInChatMessage.get(); } + if (pinInChatMessage.isPresent()) { + return pinInChatMessage.get(); + } if (documentWithCaptionMessage.isPresent()) { return documentWithCaptionMessage.get().unbox(); } @@ -668,4 +674,4 @@ public boolean isEmpty() { public String toString() { return Objects.toString(content()); } -} \ No newline at end of file +} From 22f892af9087784bb1be066ff769fcb3429d3b3a Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:22:19 -0300 Subject: [PATCH 06/11] Update MessageType.java --- .../it/auties/whatsapp/model/message/model/MessageType.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/it/auties/whatsapp/model/message/model/MessageType.java b/src/main/java/it/auties/whatsapp/model/message/model/MessageType.java index 317004ff..a572f577 100644 --- a/src/main/java/it/auties/whatsapp/model/message/model/MessageType.java +++ b/src/main/java/it/auties/whatsapp/model/message/model/MessageType.java @@ -185,6 +185,10 @@ public enum MessageType { * Text edit */ EDITED, + /** + * Pin in chat + */ + PIN_IN_CHAT, /** * Newsletter admin invite */ From d8a7942bd3d17f45189ed153a101770e80a6728b Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:22:54 -0300 Subject: [PATCH 07/11] Add files via upload --- .../model/message/model/PinInChat.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/main/java/it/auties/whatsapp/model/message/model/PinInChat.java diff --git a/src/main/java/it/auties/whatsapp/model/message/model/PinInChat.java b/src/main/java/it/auties/whatsapp/model/message/model/PinInChat.java new file mode 100644 index 00000000..de33d0ca --- /dev/null +++ b/src/main/java/it/auties/whatsapp/model/message/model/PinInChat.java @@ -0,0 +1,48 @@ +package it.auties.whatsapp.model.message.model; + +import it.auties.protobuf.annotation.ProtobufEnumIndex; +import it.auties.protobuf.annotation.ProtobufMessageName; +import it.auties.protobuf.annotation.ProtobufProperty; +import it.auties.protobuf.model.ProtobufEnum; +import it.auties.protobuf.model.ProtobufMessage; +import it.auties.protobuf.model.ProtobufType; +import it.auties.whatsapp.model.info.MessageAddOnContextInfo; +import it.auties.whatsapp.model.jid.Jid; +import it.auties.whatsapp.util.Clock; + +import java.time.ZonedDateTime; +import java.util.Optional; + + +/** + * A model class that represents an ephemeral message that was saved manually by the user in a chat + */ +@ProtobufMessageName("PinInChat") +public record PinInChat( + @ProtobufProperty(index = 1, type = ProtobufType.OBJECT) + Type pinType, + @ProtobufProperty(index = 2, type = ProtobufType.OBJECT) + ChatMessageKey key, + @ProtobufProperty(index = 3, type = ProtobufType.INT64) + long clientTimestampInMilliseconds, + @ProtobufProperty(index = 4, type = ProtobufType.INT64) + long serverTimestampMilliseconds, + @ProtobufProperty(index = 5, type = ProtobufType.OBJECT) + MessageAddOnContextInfo messageAddOnContextInfo +) implements ProtobufMessage { + public Optional serverTimestamp() { return Clock.parseMilliseconds(serverTimestampMilliseconds); } + + public Optional clientTimestamp() { return Clock.parseMilliseconds(clientTimestampInMilliseconds); } + + public enum Type implements ProtobufEnum { + UNKNOWN_TYPE(0), + PIN_FOR_ALL(1), + UNDO_PIN_FOR_ALL(2); + + final int index; + + Type(@ProtobufEnumIndex int index) { this.index = index; } + + public int index() { return index; } + } +} \ No newline at end of file From b3eb4e2b97494f5c43497a05025c46c497f8fe89 Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:24:03 -0300 Subject: [PATCH 08/11] Add files via upload --- .../message/standard/PinInChatMessage.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/it/auties/whatsapp/model/message/standard/PinInChatMessage.java diff --git a/src/main/java/it/auties/whatsapp/model/message/standard/PinInChatMessage.java b/src/main/java/it/auties/whatsapp/model/message/standard/PinInChatMessage.java new file mode 100644 index 00000000..8291a0ff --- /dev/null +++ b/src/main/java/it/auties/whatsapp/model/message/standard/PinInChatMessage.java @@ -0,0 +1,37 @@ +package it.auties.whatsapp.model.message.standard; + +import it.auties.protobuf.annotation.ProtobufMessageName; +import it.auties.protobuf.annotation.ProtobufProperty; +import it.auties.protobuf.model.ProtobufEnum; +import it.auties.protobuf.model.ProtobufType; +import it.auties.whatsapp.model.message.model.*; + + +@ProtobufMessageName("Message.PinInChatMessage") +public record PinInChatMessage( + @ProtobufProperty(index = 1, type = ProtobufType.OBJECT) + ChatMessageKey key, + @ProtobufProperty(index = 2, type = ProtobufType.OBJECT) + Type pinType, + @ProtobufProperty(index = 3, type = ProtobufType.INT64) + long senderTimestampMilliseconds +) implements Message { + @Override + public MessageType type() { return MessageType.PIN_IN_CHAT; } + + @Override + public MessageCategory category() { return MessageCategory.STANDARD; } + + @ProtobufMessageName("Message.PinInChatMessage.Type") + public enum Type implements ProtobufEnum { + UNKNOWN_TYPE(0), + PIN_FOR_ALL(1), + UNPIN_FOR_ALL(2); + + final int index; + + Type(int index) { this.index = index; } + + public int index() { return index; } + } +} From 0e1c50a6ff662ba82c08c2c44039dbc3544bbd1f Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:26:11 -0300 Subject: [PATCH 09/11] Update Whatsapp.java --- .../java/it/auties/whatsapp/api/Whatsapp.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/main/java/it/auties/whatsapp/api/Whatsapp.java b/src/main/java/it/auties/whatsapp/api/Whatsapp.java index 95790f0e..adefa15f 100644 --- a/src/main/java/it/auties/whatsapp/api/Whatsapp.java +++ b/src/main/java/it/auties/whatsapp/api/Whatsapp.java @@ -674,6 +674,44 @@ public CompletableFuture editMessage(T oldMessage, Me }; } + /** + * Pin a message + * + * @param messageKey non-null message key to pin + * @param pinTimer the default timer that message will be pinned + * @return a CompletableFuture + */ + public CompletableFuture pinMessage(ChatMessageKey messageKey, ChatMessagePinTimer pinTimer) { + if (messageKey.fromMe()) { + messageKey.setSenderJid(null); + } + var message = new PinInChatMessageBuilder() + .key(messageKey) + .pinType(PinInChatMessage.Type.PIN_FOR_ALL) + .senderTimestampMilliseconds(Clock.nowMilliseconds()) + .build(); + var deviceInfo = new DeviceContextInfoBuilder() + .messageAddOnDurationInSecs(pinTimer.periodSeconds()) + .build(); + var sender = messageKey.chatJid().hasServer(JidServer.GROUP) ? jidOrThrowError() : null; + var key = new ChatMessageKeyBuilder() + .id(ChatMessageKey.randomIdV2(sender, store().clientType())) + .chatJid(messageKey.chatJid()) + .fromMe(true) + .senderJid(sender) + .build(); + var pinInfo = new ChatMessageInfoBuilder() + .status(MessageStatus.PENDING) + .senderJid(sender) + .key(key) + .message(MessageContainer.of(message).withDeviceInfo(deviceInfo)) + .timestampSeconds(Clock.nowSeconds()) + .build(); + var attrs = Map.of("edit", 2); + var request = new MessageSendRequest.Chat(pinInfo, null, false, false, attrs); + return socketHandler.sendMessage(request); + } + /** * Pin a message * From f0a47e033d46347360efd4a5119703d790683033 Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:31:45 -0300 Subject: [PATCH 10/11] Fix: missing imports --- src/main/java/it/auties/whatsapp/api/Whatsapp.java | 7 ++----- .../it/auties/whatsapp/model/info/DeviceContextInfo.java | 6 +++--- .../it/auties/whatsapp/model/message/model/PinInChat.java | 5 ++--- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/it/auties/whatsapp/api/Whatsapp.java b/src/main/java/it/auties/whatsapp/api/Whatsapp.java index adefa15f..c8fca3a2 100644 --- a/src/main/java/it/auties/whatsapp/api/Whatsapp.java +++ b/src/main/java/it/auties/whatsapp/api/Whatsapp.java @@ -34,10 +34,7 @@ import it.auties.whatsapp.model.message.model.reserved.ExtendedMediaMessage; import it.auties.whatsapp.model.message.server.ProtocolMessage; import it.auties.whatsapp.model.message.server.ProtocolMessageBuilder; -import it.auties.whatsapp.model.message.standard.CallMessageBuilder; -import it.auties.whatsapp.model.message.standard.NewsletterAdminInviteMessageBuilder; -import it.auties.whatsapp.model.message.standard.ReactionMessageBuilder; -import it.auties.whatsapp.model.message.standard.TextMessage; +import it.auties.whatsapp.model.message.standard.*; import it.auties.whatsapp.model.newsletter.*; import it.auties.whatsapp.model.node.Attributes; import it.auties.whatsapp.model.node.Node; @@ -749,7 +746,7 @@ public CompletableFuture pinMessage(ChatMessageKey messageKey, ChatMessage var request = new MessageSendRequest.Chat(pinInfo, null, false, false, attrs); return socketHandler.sendMessage(request); } - + public CompletableFuture sendStatus(String message) { return sendStatus(MessageContainer.of(message)); } diff --git a/src/main/java/it/auties/whatsapp/model/info/DeviceContextInfo.java b/src/main/java/it/auties/whatsapp/model/info/DeviceContextInfo.java index 9757cc5d..38070165 100644 --- a/src/main/java/it/auties/whatsapp/model/info/DeviceContextInfo.java +++ b/src/main/java/it/auties/whatsapp/model/info/DeviceContextInfo.java @@ -27,7 +27,7 @@ public final class DeviceContextInfo implements Info, ProtobufMessage { private final int messageAddOnDurationInSecs; @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) - public DeviceContextInfo(DeviceListMetadata deviceListMetadata, int deviceListMetadataVersion, byte[] messageSecret, byte[] paddingBytes) { + public DeviceContextInfo(DeviceListMetadata deviceListMetadata, int deviceListMetadataVersion, byte[] messageSecret, byte[] paddingBytes, int messageAddOnDurationInSecs) { this.deviceListMetadata = deviceListMetadata; this.deviceListMetadataVersion = deviceListMetadataVersion; this.messageSecret = messageSecret; @@ -55,7 +55,7 @@ public Optional paddingBytes() { return Optional.ofNullable(paddingBytes); } - public int messageAddOnDurationInSecs() { - return messageAddOnDurationInSecs; + public int messageAddOnDurationInSecs() { + return messageAddOnDurationInSecs; } } diff --git a/src/main/java/it/auties/whatsapp/model/message/model/PinInChat.java b/src/main/java/it/auties/whatsapp/model/message/model/PinInChat.java index de33d0ca..43b829cb 100644 --- a/src/main/java/it/auties/whatsapp/model/message/model/PinInChat.java +++ b/src/main/java/it/auties/whatsapp/model/message/model/PinInChat.java @@ -6,8 +6,7 @@ import it.auties.protobuf.model.ProtobufEnum; import it.auties.protobuf.model.ProtobufMessage; import it.auties.protobuf.model.ProtobufType; -import it.auties.whatsapp.model.info.MessageAddOnContextInfo; -import it.auties.whatsapp.model.jid.Jid; +import it.auties.whatsapp.model.info.DeviceContextInfo; import it.auties.whatsapp.util.Clock; import java.time.ZonedDateTime; @@ -28,7 +27,7 @@ public record PinInChat( @ProtobufProperty(index = 4, type = ProtobufType.INT64) long serverTimestampMilliseconds, @ProtobufProperty(index = 5, type = ProtobufType.OBJECT) - MessageAddOnContextInfo messageAddOnContextInfo + DeviceContextInfo messageAddOnContextInfo ) implements ProtobufMessage { public Optional serverTimestamp() { return Clock.parseMilliseconds(serverTimestampMilliseconds); } From 99cca9bb040dcb84dc81d84482e15e2862023d90 Mon Sep 17 00:00:00 2001 From: Quishot WADEV <70950705+Darker935@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:37:42 -0300 Subject: [PATCH 11/11] Duplicated pinMessage method --- .../java/it/auties/whatsapp/api/Whatsapp.java | 38 ------------------- 1 file changed, 38 deletions(-) diff --git a/src/main/java/it/auties/whatsapp/api/Whatsapp.java b/src/main/java/it/auties/whatsapp/api/Whatsapp.java index c8fca3a2..2b621338 100644 --- a/src/main/java/it/auties/whatsapp/api/Whatsapp.java +++ b/src/main/java/it/auties/whatsapp/api/Whatsapp.java @@ -709,44 +709,6 @@ public CompletableFuture pinMessage(ChatMessageKey messageKey, ChatMessage return socketHandler.sendMessage(request); } - /** - * Pin a message - * - * @param messageKey non-null message key to pin - * @param pinTimer the default timer that message will be pinned - * @return a CompletableFuture - */ - public CompletableFuture pinMessage(ChatMessageKey messageKey, ChatMessagePinTimer pinTimer) { - if (messageKey.fromMe()) { - messageKey.setSenderJid(null); - } - var message = new PinInChatMessageBuilder() - .key(messageKey) - .pinType(PinInChatMessage.Type.PIN_FOR_ALL) - .senderTimestampMilliseconds(Clock.nowMilliseconds()) - .build(); - var deviceInfo = new DeviceContextInfoBuilder() - .messageAddOnDurationInSecs(pinTimer.periodSeconds()) - .build(); - var sender = messageKey.chatJid().hasServer(JidServer.GROUP) ? jidOrThrowError() : null; - var key = new ChatMessageKeyBuilder() - .id(ChatMessageKey.randomIdV2(sender, store().clientType())) - .chatJid(messageKey.chatJid()) - .fromMe(true) - .senderJid(sender) - .build(); - var pinInfo = new ChatMessageInfoBuilder() - .status(MessageStatus.PENDING) - .senderJid(sender) - .key(key) - .message(MessageContainer.of(message).withDeviceInfo(deviceInfo)) - .timestampSeconds(Clock.nowSeconds()) - .build(); - var attrs = Map.of("edit", 2); - var request = new MessageSendRequest.Chat(pinInfo, null, false, false, attrs); - return socketHandler.sendMessage(request); - } - public CompletableFuture sendStatus(String message) { return sendStatus(MessageContainer.of(message)); }