From 203f80cc0b0a76cec59714da0817ca37c516f126 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 26 Dec 2023 18:28:00 +0100 Subject: [PATCH] Send stickers as real stickers instead of images --- portal.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/portal.go b/portal.go index ceb0bec9..11349b44 100644 --- a/portal.go +++ b/portal.go @@ -40,6 +40,7 @@ import ( cwebp "go.mau.fi/webp" "golang.org/x/exp/slices" "golang.org/x/image/webp" + "google.golang.org/protobuf/proto" "maunium.net/go/mautrix" "maunium.net/go/mautrix/appservice" "maunium.net/go/mautrix/bridge" @@ -687,6 +688,11 @@ func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, ev outgoingMessage = signalmeow.DataMessageForAttachment(attachmentPointer, caption, ranges) case event.MessageType(event.EventSticker.Type): + var emoji *string + // TODO check for single grapheme cluster? + if len([]rune(content.Body)) == 1 { + emoji = proto.String(variationselector.Remove(content.Body)) + } image, err := portal.downloadAndDecryptMatrixMedia(ctx, content) if err != nil { return nil, err @@ -699,7 +705,21 @@ func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, ev if err != nil { return nil, err } - outgoingMessage = signalmeow.DataMessageForAttachment(attachmentPointer, "", nil) + outgoingMessage = &signalmeow.SignalContent{ + DataMessage: &signalpb.DataMessage{ + Timestamp: proto.Uint64(uint64(time.Now().UnixMilli())), + Sticker: &signalpb.DataMessage_Sticker{ + // Signal iOS validates that pack id/key are of the correct length. + // Android is fine with any non-nil values (like a zero-length byte string). + PackId: make([]byte, 16), + PackKey: make([]byte, 32), + StickerId: proto.Uint32(0), + + Data: (*signalpb.AttachmentPointer)(attachmentPointer), + Emoji: emoji, + }, + }, + } case event.MsgVideo: fileName := content.Body var caption string