Skip to content

Commit

Permalink
Improve attachment handling (whatsapp) (#1928)
Browse files Browse the repository at this point in the history
* Allow captions for document attachments, too

* Handle audio messages

* Improve attachment handling
  • Loading branch information
ilmaisin authored Nov 26, 2022
1 parent 4fd0a76 commit 0a6d64a
Showing 1 changed file with 81 additions and 2 deletions.
83 changes: 81 additions & 2 deletions bridge/whatsappmulti/whatsapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -225,14 +227,15 @@ 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,
FileLength: goproto.Uint64(resp.FileLength),
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)
Expand Down Expand Up @@ -266,14 +269,84 @@ 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)

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)
Expand Down Expand Up @@ -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)
}
Expand Down

0 comments on commit 0a6d64a

Please sign in to comment.