From d549dc407a4e20e86253f1e2c37102607aaffb9c Mon Sep 17 00:00:00 2001 From: Hugo Thunnissen Date: Wed, 8 Jan 2020 02:51:06 +0100 Subject: [PATCH] Implement ImageMessage handler --- bridge_context.go | 14 +++++++ database.go | 2 +- main.go | 1 + message_handlers.go | 93 +++++++++++++++++++++++++++++++++++---------- whapp-handler.go | 9 +++++ whapp.go | 6 +-- 6 files changed, 99 insertions(+), 26 deletions(-) diff --git a/bridge_context.go b/bridge_context.go index 7bd48b8..769672a 100644 --- a/bridge_context.go +++ b/bridge_context.go @@ -1,11 +1,14 @@ package main import ( + "log" + "github.com/Rhymen/go-whatsapp" "github.com/hugot/go-deltachat/deltachat" ) type BridgeContext struct { + Config *Config WhappConn *whatsapp.Conn DCContext *deltachat.Context DB *Database @@ -43,3 +46,14 @@ func (b *BridgeContext) GetOrCreateDCIDForJID(JID string) (uint32, error) { func (b *BridgeContext) SendLog(logString string) { b.DCContext.SendTextMessage(b.DCUserChatID, logString) } + +func (b *BridgeContext) MessageWasSent(ID string) bool { + sent, err := b.MessageTracker.WasSent(ID) + + if err != nil { + log.Println(err) + b.SendLog(err.Error()) + } + + return sent +} diff --git a/database.go b/database.go index 79d1b44..9168f7e 100644 --- a/database.go +++ b/database.go @@ -167,7 +167,7 @@ func (d *Database) WhappMessageWasSent(ID string) (bool, error) { rawWasSent := bucket.Get([]byte(ID)) - if len(rawWasSent) > 0 && uint8(rawWasSent[0]) == uint8(1) { + if len(rawWasSent) > 0 { wasSent = true } diff --git a/main.go b/main.go index 6d8cd4f..90a2b6e 100644 --- a/main.go +++ b/main.go @@ -47,6 +47,7 @@ func main() { } bridgeCtx := &BridgeContext{ + Config: config, DB: db, MessageTracker: messageTracker, } diff --git a/message_handlers.go b/message_handlers.go index 0a85938..0a8002a 100644 --- a/message_handlers.go +++ b/message_handlers.go @@ -2,9 +2,10 @@ package main import ( "fmt" - "log" + "io/ioutil" "github.com/Rhymen/go-whatsapp" + "github.com/hugot/go-deltachat/deltachat" ) type MessageHandler struct { @@ -16,48 +17,98 @@ type MessageAction func() error func MakeTextMessageAction(b *BridgeContext, m whatsapp.TextMessage) MessageAction { return func() error { - JID := m.Info.RemoteJid + if b.MessageWasSent(m.Info.Id) { + return nil + } - wasSent, err := b.MessageTracker.WasSent(m.Info.Id) + JID := m.Info.RemoteJid + DCID, err := b.GetOrCreateDCIDForJID(JID) if err != nil { - log.Println(err) b.SendLog(err.Error()) + return err } - // Messgae has already been sent - if wasSent == true { + senderName := DetermineSenderName(b, m.Info) + + b.DCContext.SendTextMessage( + DCID, + fmt.Sprintf("%s:\n%s", senderName, m.Text), + ) + + return b.MessageTracker.MarkSent(&m.Info.Id) + } +} + +func MakeImageMessageAction(b *BridgeContext, m whatsapp.ImageMessage) MessageAction { + return func() error { + if b.MessageWasSent(m.Info.Id) { return nil } + JID := m.Info.RemoteJid DCID, err := b.GetOrCreateDCIDForJID(JID) if err != nil { - log.Println(err) b.SendLog(err.Error()) + return err } - senderName := m.Info.Source.GetParticipant() + senderName := DetermineSenderName(b, m.Info) - // No participant probably means that this isn't a group chat. - if senderName == "" { - senderName = m.Info.RemoteJid + imageData, err := m.Download() + + if err != nil { + b.SendLog(err.Error()) + return err } - if m.Info.FromMe == true { - senderName = b.DCContext.GetContact(b.DCUserID).GetDisplayName() + tmpFile, err := ioutil.TempFile( + b.Config.App.DataFolder+"/tmp", + "XXXXXXX-img", + ) + + if err != nil { + b.SendLog(err.Error()) + return err } - contact, ok := b.WhappConn.Store.Contacts[senderName] - if ok { - senderName = contact.Name + err = ioutil.WriteFile(tmpFile.Name(), imageData, 0600) + + if err != nil { + b.SendLog(err.Error()) + return err } - b.DCContext.SendTextMessage( - DCID, - fmt.Sprintf("%s:\n%s", senderName, m.Text), - ) + message := b.DCContext.NewMessage(deltachat.DC_MSG_IMAGE) + message.SetText(fmt.Sprintf("%s:\n%s", senderName, m.Caption)) + message.SetFile(tmpFile.Name(), m.Type) + + b.DCContext.SendMessage(DCID, message) - return b.MessageTracker.MarkSent(&JID) + return b.MessageTracker.MarkSent(&m.Info.Id) } } + +//// +// Helpers + +func DetermineSenderName(b *BridgeContext, info whatsapp.MessageInfo) string { + senderName := info.Source.GetParticipant() + + // No participant probably means that this isn't a group chat. + if senderName == "" { + senderName = info.RemoteJid + } + + if info.FromMe == true { + return b.DCContext.GetContact(b.DCUserID).GetDisplayName() + } + + contact, ok := b.WhappConn.Store.Contacts[senderName] + if ok { + senderName = contact.Name + } + + return senderName +} diff --git a/whapp-handler.go b/whapp-handler.go index 2144cc1..52ca7cd 100644 --- a/whapp-handler.go +++ b/whapp-handler.go @@ -23,3 +23,12 @@ func (h *WhappHandler) HandleTextMessage(m whatsapp.TextMessage) { h.MessageWorker.HandleMessage(handler) } + +func (h *WhappHandler) HandleImageMessage(m whatsapp.ImageMessage) { + handler := MessageHandler{ + Jid: m.Info.RemoteJid, + Action: MakeImageMessageAction(h.BridgeContext, m), + } + + h.MessageWorker.HandleMessage(handler) +} diff --git a/whapp.go b/whapp.go index 85e2dd3..d20c0fa 100644 --- a/whapp.go +++ b/whapp.go @@ -66,7 +66,7 @@ func WhappQrLogin( go func() { qrCode := <-qrChan - tmpFile, err := ioutil.TempFile(storageDir+"/tmp", "qr") + tmpFile, err := ioutil.TempFile(storageDir+"/tmp", "XXXXXXX-qr") if err != nil { log.Fatal(err) @@ -80,9 +80,7 @@ func WhappQrLogin( message := ctx.DCContext.NewMessage(deltachat.DC_MSG_IMAGE) - log.Println("MIME: " + mime.TypeByExtension(".png")) - - message.SetFile(tmpFile.Name(), "image/png") + message.SetFile(tmpFile.Name(), mime.TypeByExtension(".png")) message.SetText("Scan this QR code from whatsapp")