Support file and media message types from whapp -> DC

master
Hugo Thunnissen 4 years ago
parent 461a5d9a3b
commit 23fd38cbfe

@ -3,6 +3,7 @@ package main
import (
"fmt"
"io/ioutil"
"mime"
"github.com/Rhymen/go-whatsapp"
"github.com/hugot/go-deltachat/deltachat"
@ -63,26 +64,96 @@ func MakeImageMessageAction(b *BridgeContext, m whatsapp.ImageMessage) MessageAc
return err
}
tmpFile, err := ioutil.TempFile(
b.Config.App.DataFolder+"/tmp",
"XXXXXXX-img",
)
filename, err := WriteTempFile(b, imageData, "img")
if err != nil {
b.SendLog(err.Error())
return err
}
message := b.DCContext.NewMessage(deltachat.DC_MSG_IMAGE)
message.SetText(fmt.Sprintf("%s:\n%s", senderName, m.Caption))
message.SetFile(filename, m.Type)
b.DCContext.SendMessage(DCID, message)
return b.MessageTracker.MarkSent(&m.Info.Id)
}
}
func MakeDocumentMessageAction(b *BridgeContext, m whatsapp.DocumentMessage) MessageAction {
return func() error {
if b.MessageWasSent(m.Info.Id) {
return nil
}
JID := m.Info.RemoteJid
DCID, err := b.GetOrCreateDCIDForJID(JID)
if err != nil {
b.SendLog(err.Error())
return err
}
err = ioutil.WriteFile(tmpFile.Name(), imageData, 0600)
senderName := DetermineSenderName(b, m.Info)
documentData, err := m.Download()
if err != nil {
b.SendLog(err.Error())
return err
}
message := b.DCContext.NewMessage(deltachat.DC_MSG_IMAGE)
message.SetText(fmt.Sprintf("%s:\n%s", senderName, m.Caption))
message.SetFile(tmpFile.Name(), m.Type)
filename, err := WriteTempFile(b, documentData, "doc")
if err != nil {
b.SendLog(err.Error())
return err
}
message := b.DCContext.NewMessage(deltachat.DC_MSG_FILE)
message.SetText(fmt.Sprintf("%s:\n%s", senderName, m.Title))
message.SetFile(filename, m.Type)
b.DCContext.SendMessage(DCID, message)
return b.MessageTracker.MarkSent(&m.Info.Id)
}
}
func MakeAudioMessageAction(b *BridgeContext, m whatsapp.AudioMessage) MessageAction {
return func() error {
if b.MessageWasSent(m.Info.Id) {
return nil
}
JID := m.Info.RemoteJid
DCID, err := b.GetOrCreateDCIDForJID(JID)
if err != nil {
b.SendLog(err.Error())
return err
}
senderName := DetermineSenderName(b, m.Info)
audioData, err := m.Download()
if err != nil {
b.SendLog(err.Error())
return err
}
filename, err := WriteTempFile(b, audioData, "audio")
if err != nil {
b.SendLog(err.Error())
return err
}
message := b.DCContext.NewMessage(deltachat.DC_MSG_AUDIO)
message.SetText(fmt.Sprintf("%s:", senderName))
message.SetFile(filename, m.Type)
b.DCContext.SendMessage(DCID, message)
@ -90,6 +161,80 @@ func MakeImageMessageAction(b *BridgeContext, m whatsapp.ImageMessage) MessageAc
}
}
func MakeVideoMessageAction(b *BridgeContext, m whatsapp.VideoMessage) MessageAction {
return func() error {
if b.MessageWasSent(m.Info.Id) {
return nil
}
JID := m.Info.RemoteJid
DCID, err := b.GetOrCreateDCIDForJID(JID)
if err != nil {
b.SendLog(err.Error())
return err
}
senderName := DetermineSenderName(b, m.Info)
videoData, err := m.Download()
if err != nil {
b.SendLog(err.Error())
return err
}
filename, err := WriteTempFile(b, videoData, "vid")
if err != nil {
b.SendLog(err.Error())
return err
}
message := b.DCContext.NewMessage(deltachat.DC_MSG_VIDEO)
message.SetText(fmt.Sprintf("%s:", senderName))
message.SetFile(filename, m.Type)
b.DCContext.SendMessage(DCID, message)
return b.MessageTracker.MarkSent(&m.Info.Id)
}
}
func MakeContactMessageAction(b *BridgeContext, m whatsapp.ContactMessage) MessageAction {
return func() error {
if b.MessageWasSent(m.Info.Id) {
return nil
}
JID := m.Info.RemoteJid
DCID, err := b.GetOrCreateDCIDForJID(JID)
if err != nil {
b.SendLog(err.Error())
return err
}
senderName := DetermineSenderName(b, m.Info)
filename, err := WriteTempFile(b, []byte(m.Vcard), "vcf")
if err != nil {
b.SendLog(err.Error())
return err
}
message := b.DCContext.NewMessage(deltachat.DC_MSG_FILE)
message.SetText(fmt.Sprintf("%s:", senderName))
message.SetFile(filename, mime.TypeByExtension(".vcf"))
b.DCContext.SendMessage(DCID, message)
return b.MessageTracker.MarkSent(&m.Info.Id)
}
}
////
// Helpers
@ -112,3 +257,17 @@ func DetermineSenderName(b *BridgeContext, info whatsapp.MessageInfo) string {
return senderName
}
func WriteTempFile(b *BridgeContext, data []byte, template string) (string, error) {
tmpFile, err := ioutil.TempFile(
b.Config.App.DataFolder+"/tmp",
template,
)
if err != nil {
b.SendLog(err.Error())
return "", err
}
return tmpFile.Name(), ioutil.WriteFile(tmpFile.Name(), data, 0600)
}

@ -32,3 +32,39 @@ func (h *WhappHandler) HandleImageMessage(m whatsapp.ImageMessage) {
h.MessageWorker.HandleMessage(handler)
}
func (h *WhappHandler) HandleDocumentMessage(m whatsapp.DocumentMessage) {
handler := MessageHandler{
Jid: m.Info.RemoteJid,
Action: MakeDocumentMessageAction(h.BridgeContext, m),
}
h.MessageWorker.HandleMessage(handler)
}
func (h *WhappHandler) HandleAudioMessage(m whatsapp.AudioMessage) {
handler := MessageHandler{
Jid: m.Info.RemoteJid,
Action: MakeAudioMessageAction(h.BridgeContext, m),
}
h.MessageWorker.HandleMessage(handler)
}
func (h *WhappHandler) HandleVideoMessage(m whatsapp.VideoMessage) {
handler := MessageHandler{
Jid: m.Info.RemoteJid,
Action: MakeVideoMessageAction(h.BridgeContext, m),
}
h.MessageWorker.HandleMessage(handler)
}
func (h *WhappHandler) HandleContactMessage(m whatsapp.VideoMessage) {
handler := MessageHandler{
Jid: m.Info.RemoteJid,
Action: MakeVideoMessageAction(h.BridgeContext, m),
}
h.MessageWorker.HandleMessage(handler)
}

Loading…
Cancel
Save