From 0a6d64ab485645b337664a8c90a974bbf1b18478 Mon Sep 17 00:00:00 2001 From: ilmaisin Date: Sun, 27 Nov 2022 01:55:37 +0200 Subject: [PATCH] Improve attachment handling (whatsapp) (#1928) * Allow captions for document attachments, too * Handle audio messages * Improve attachment handling --- bridge/whatsappmulti/whatsapp.go | 83 +++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/bridge/whatsappmulti/whatsapp.go b/bridge/whatsappmulti/whatsapp.go index 02eadf15..686396d3 100644 --- a/bridge/whatsappmulti/whatsapp.go +++ b/bridge/whatsappmulti/whatsapp.go @@ -213,6 +213,8 @@ func (b *Bwhatsapp) PostDocumentMessage(msg config.Message, filetype string) (st fi := msg.Extra["file"][0].(config.FileInfo) + caption := msg.Username + fi.Comment + resp, err := b.wc.Upload(context.Background(), *fi.Data, whatsmeow.MediaDocument) if err != nil { return "", err @@ -225,6 +227,7 @@ func (b *Bwhatsapp) PostDocumentMessage(msg config.Message, filetype string) (st Title: &fi.Name, FileName: &fi.Name, Mimetype: &filetype, + Caption: &caption, MediaKey: resp.MediaKey, FileEncSha256: resp.FileEncSHA256, FileSha256: resp.FileSHA256, @@ -232,7 +235,7 @@ func (b *Bwhatsapp) PostDocumentMessage(msg config.Message, filetype string) (st Url: &resp.URL, } - b.Log.Debugf("=> Sending %#v", msg) + b.Log.Debugf("=> Sending %#v as a document", msg) ID := whatsmeow.GenerateMessageID() _, err = b.wc.SendMessage(context.TODO(), groupJID, ID, &message) @@ -266,7 +269,7 @@ func (b *Bwhatsapp) PostImageMessage(msg config.Message, filetype string) (strin Url: &resp.URL, } - b.Log.Debugf("=> Sending %#v", msg) + b.Log.Debugf("=> Sending %#v as an image", msg) ID := whatsmeow.GenerateMessageID() _, err = b.wc.SendMessage(context.TODO(), groupJID, ID, &message) @@ -274,6 +277,76 @@ func (b *Bwhatsapp) PostImageMessage(msg config.Message, filetype string) (strin return ID, err } +// Post a video message from the bridge to WhatsApp +func (b *Bwhatsapp) PostVideoMessage(msg config.Message, filetype string) (string, error) { + groupJID, _ := types.ParseJID(msg.Channel) + + fi := msg.Extra["file"][0].(config.FileInfo) + + caption := msg.Username + fi.Comment + + resp, err := b.wc.Upload(context.Background(), *fi.Data, whatsmeow.MediaVideo) + if err != nil { + return "", err + } + + var message proto.Message + + message.VideoMessage = &proto.VideoMessage{ + Mimetype: &filetype, + Caption: &caption, + MediaKey: resp.MediaKey, + FileEncSha256: resp.FileEncSHA256, + FileSha256: resp.FileSHA256, + FileLength: goproto.Uint64(resp.FileLength), + Url: &resp.URL, + } + + b.Log.Debugf("=> Sending %#v as a video", msg) + + ID := whatsmeow.GenerateMessageID() + _, err = b.wc.SendMessage(context.TODO(), groupJID, ID, &message) + + return ID, err +} + +// Post audio inline +func (b *Bwhatsapp) PostAudioMessage(msg config.Message, filetype string) (string, error) { + groupJID, _ := types.ParseJID(msg.Channel) + + fi := msg.Extra["file"][0].(config.FileInfo) + + resp, err := b.wc.Upload(context.Background(), *fi.Data, whatsmeow.MediaAudio) + if err != nil { + return "", err + } + + var message proto.Message + + message.AudioMessage = &proto.AudioMessage{ + Mimetype: &filetype, + MediaKey: resp.MediaKey, + FileEncSha256: resp.FileEncSHA256, + FileSha256: resp.FileSHA256, + FileLength: goproto.Uint64(resp.FileLength), + Url: &resp.URL, + } + + b.Log.Debugf("=> Sending %#v as audio", msg) + + ID := whatsmeow.GenerateMessageID() + _, err = b.wc.SendMessage(context.TODO(), groupJID, ID, &message) + + var captionMessage proto.Message + caption := msg.Username + fi.Comment + "\u2B06" // the char on the end is upwards arrow emoji + captionMessage.Conversation = &caption + + captionID := whatsmeow.GenerateMessageID() + _, err = b.wc.SendMessage(context.TODO(), groupJID, captionID, &captionMessage) + + return ID, err +} + // Send a message from the bridge to WhatsApp func (b *Bwhatsapp) Send(msg config.Message) (string, error) { groupJID, _ := types.ParseJID(msg.Channel) @@ -316,6 +389,12 @@ func (b *Bwhatsapp) Send(msg config.Message) (string, error) { switch filetype { case "image/jpeg", "image/png", "image/gif": return b.PostImageMessage(msg, filetype) + case "video/mp4", "video/3gpp": //TODO: Check if codecs are supported by WA + return b.PostVideoMessage(msg, filetype) + case "audio/ogg": + return b.PostAudioMessage(msg, "audio/ogg; codecs=opus") //TODO: Detect if it is actually OPUS + case "audio/aac", "audio/mp4", "audio/amr", "audio/mpeg": + return b.PostAudioMessage(msg, filetype) default: return b.PostDocumentMessage(msg, filetype) }