forked from lug/matterbridge
		
	Improve attachment handling (whatsapp) (#1928)
* Allow captions for document attachments, too * Handle audio messages * Improve attachment handling
This commit is contained in:
		@@ -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)
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user