Add support for sending media to newsletters

This commit is contained in:
Tulir Asokan 2023-11-19 14:51:04 +02:00
parent f6270d6bd2
commit a8d1900203
4 changed files with 31 additions and 6 deletions

View file

@ -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.

2
go.mod
View file

@ -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

4
go.sum
View file

@ -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=

View file

@ -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 {