diff --git a/message_handlers.go b/message_handlers.go index 0a8002a..859be0a 100644 --- a/message_handlers.go +++ b/message_handlers.go @@ -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) +} diff --git a/whapp-handler.go b/whapp-handler.go index 52ca7cd..a7538da 100644 --- a/whapp-handler.go +++ b/whapp-handler.go @@ -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) +}