diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ab52bc..289838b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# unreleaased + +* Added support for sending media to channels. + # v0.10.4 (2023-11-16) * Added support for channels in `join` and `open` commands. diff --git a/go.mod b/go.mod index 40eebf7..37d4152 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/tidwall/gjson v1.17.0 go.mau.fi/util v0.2.1 go.mau.fi/webp v0.1.0 - go.mau.fi/whatsmeow v0.0.0-20231116213319-217e0c985fd6 + go.mau.fi/whatsmeow v0.0.0-20231119124248-cbe5f2ddc37a golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa golang.org/x/image v0.14.0 golang.org/x/net v0.18.0 diff --git a/go.sum b/go.sum index 0852109..4624c07 100644 --- a/go.sum +++ b/go.sum @@ -68,8 +68,8 @@ go.mau.fi/util v0.2.1 h1:eazulhFE/UmjOFtPrGg6zkF5YfAyiDzQb8ihLMbsPWw= go.mau.fi/util v0.2.1/go.mod h1:MjlzCQEMzJ+G8RsPawHzpLB8rwTo3aPIjG5FzBvQT/c= go.mau.fi/webp v0.1.0 h1:BHObH/DcFntT9KYun5pDr0Ot4eUZO8k2C7eP7vF4ueA= go.mau.fi/webp v0.1.0/go.mod h1:e42Z+VMFrUMS9cpEwGRIor+lQWO8oUAyPyMtcL+NMt8= -go.mau.fi/whatsmeow v0.0.0-20231116213319-217e0c985fd6 h1:GLGU8Q7zoW0NjqZGXdPAjAwmJTSI09HIdhjL0DY21oc= -go.mau.fi/whatsmeow v0.0.0-20231116213319-217e0c985fd6/go.mod h1:5xTtHNaZpGni6z6aE1iEopjW7wNgsKcolZxZrOujK9M= +go.mau.fi/whatsmeow v0.0.0-20231119124248-cbe5f2ddc37a h1:u7W/BzMZla2yD5xf0txDRx6ZI7rJNZ1HjLQQKgOgdTw= +go.mau.fi/whatsmeow v0.0.0-20231119124248-cbe5f2ddc37a/go.mod h1:5xTtHNaZpGni6z6aE1iEopjW7wNgsKcolZxZrOujK9M= go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= diff --git a/portal.go b/portal.go index 778f4ce..be07262 100644 --- a/portal.go +++ b/portal.go @@ -3894,7 +3894,12 @@ func (portal *Portal) preprocessMatrixMedia(ctx context.Context, sender *User, r portal.log.Warnfln("Failed to re-encode %s media: %v, continuing with original file", mimeType, convertErr) } } - uploadResp, err := sender.Client.Upload(ctx, data, mediaType) + var uploadResp whatsmeow.UploadResponse + if portal.Key.JID.Server == types.NewsletterServer { + uploadResp, err = sender.Client.UploadNewsletter(ctx, data, mediaType) + } else { + uploadResp, err = sender.Client.Upload(ctx, data, mediaType) + } if err != nil { return nil, exerrors.NewDualError(errMediaWhatsAppUploadFailed, err) } @@ -4202,6 +4207,8 @@ type extraConvertMeta struct { EditRootMsg *database.Message GalleryExtraParts []*waProto.Message + + MediaHandle string } func getEditError(rootMsg *database.Message, editer *User) error { @@ -4303,6 +4310,7 @@ func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, ev if media == nil { return nil, sender, extraMeta, err } + extraMeta.MediaHandle = media.Handle ctxInfo.MentionedJid = media.MentionedJIDs msg.ImageMessage = &waProto.ImageMessage{ ContextInfo: ctxInfo, @@ -4321,6 +4329,9 @@ func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, ev return nil, sender, extraMeta, errGalleryRelay } else if content.BeeperGalleryCaption != "" { return nil, sender, extraMeta, errGalleryCaption + } else if portal.Key.JID.Server == types.NewsletterServer { + // We don't handle the media handles properly for multiple messages + return nil, sender, extraMeta, fmt.Errorf("can't send gallery to newsletter") } for i, part := range content.BeeperGalleryImages { // TODO support videos @@ -4352,6 +4363,7 @@ func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, ev if media == nil { return nil, sender, extraMeta, err } + extraMeta.MediaHandle = media.Handle ctxInfo.MentionedJid = media.MentionedJIDs msg.StickerMessage = &waProto.StickerMessage{ ContextInfo: ctxInfo, @@ -4371,6 +4383,7 @@ func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, ev return nil, sender, extraMeta, err } duration := uint32(content.GetInfo().Duration / 1000) + extraMeta.MediaHandle = media.Handle ctxInfo.MentionedJid = media.MentionedJIDs msg.VideoMessage = &waProto.VideoMessage{ ContextInfo: ctxInfo, @@ -4391,6 +4404,7 @@ func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, ev if media == nil { return nil, sender, extraMeta, err } + extraMeta.MediaHandle = media.Handle duration := uint32(content.GetInfo().Duration / 1000) msg.AudioMessage = &waProto.AudioMessage{ ContextInfo: ctxInfo, @@ -4415,6 +4429,7 @@ func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, ev if media == nil { return nil, sender, extraMeta, err } + extraMeta.MediaHandle = media.Handle msg.DocumentMessage = &waProto.DocumentMessage{ ContextInfo: ctxInfo, Caption: &media.Caption, @@ -4562,6 +4577,9 @@ func (portal *Portal) HandleMatrixMessage(sender *User, evt *event.Event, timing go ms.sendMessageMetrics(evt, err, "Error converting", true) return } + if extraMeta == nil { + extraMeta = &extraConvertMeta{} + } dbMsgType := database.MsgNormal if msg.PollCreationMessage != nil || msg.PollCreationMessageV2 != nil || msg.PollCreationMessageV3 != nil { dbMsgType = database.MsgMatrixPoll @@ -4576,12 +4594,15 @@ func (portal *Portal) HandleMatrixMessage(sender *User, evt *event.Event, timing } else { info.ID = dbMsg.JID } - if dbMsgType == database.MsgMatrixPoll && extraMeta != nil && extraMeta.PollOptions != nil { + if dbMsgType == database.MsgMatrixPoll && extraMeta.PollOptions != nil { dbMsg.PutPollOptions(extraMeta.PollOptions) } portal.log.Debugln("Sending event", evt.ID, "to WhatsApp", info.ID) start = time.Now() - resp, err := sender.Client.SendMessage(ctx, portal.Key.JID, msg, whatsmeow.SendRequestExtra{ID: info.ID}) + resp, err := sender.Client.SendMessage(ctx, portal.Key.JID, msg, whatsmeow.SendRequestExtra{ + ID: info.ID, + MediaHandle: extraMeta.MediaHandle, + }) timings.totalSend = time.Since(start) timings.whatsmeow = resp.DebugTimings if err != nil {