Implement ImageMessage handler

master
Hugo Thunnissen 4 years ago
parent 3bccb1cf61
commit d549dc407a

@ -1,11 +1,14 @@
package main package main
import ( import (
"log"
"github.com/Rhymen/go-whatsapp" "github.com/Rhymen/go-whatsapp"
"github.com/hugot/go-deltachat/deltachat" "github.com/hugot/go-deltachat/deltachat"
) )
type BridgeContext struct { type BridgeContext struct {
Config *Config
WhappConn *whatsapp.Conn WhappConn *whatsapp.Conn
DCContext *deltachat.Context DCContext *deltachat.Context
DB *Database DB *Database
@ -43,3 +46,14 @@ func (b *BridgeContext) GetOrCreateDCIDForJID(JID string) (uint32, error) {
func (b *BridgeContext) SendLog(logString string) { func (b *BridgeContext) SendLog(logString string) {
b.DCContext.SendTextMessage(b.DCUserChatID, logString) 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
}

@ -167,7 +167,7 @@ func (d *Database) WhappMessageWasSent(ID string) (bool, error) {
rawWasSent := bucket.Get([]byte(ID)) rawWasSent := bucket.Get([]byte(ID))
if len(rawWasSent) > 0 && uint8(rawWasSent[0]) == uint8(1) { if len(rawWasSent) > 0 {
wasSent = true wasSent = true
} }

@ -47,6 +47,7 @@ func main() {
} }
bridgeCtx := &BridgeContext{ bridgeCtx := &BridgeContext{
Config: config,
DB: db, DB: db,
MessageTracker: messageTracker, MessageTracker: messageTracker,
} }

@ -2,9 +2,10 @@ package main
import ( import (
"fmt" "fmt"
"log" "io/ioutil"
"github.com/Rhymen/go-whatsapp" "github.com/Rhymen/go-whatsapp"
"github.com/hugot/go-deltachat/deltachat"
) )
type MessageHandler struct { type MessageHandler struct {
@ -16,48 +17,98 @@ type MessageAction func() error
func MakeTextMessageAction(b *BridgeContext, m whatsapp.TextMessage) MessageAction { func MakeTextMessageAction(b *BridgeContext, m whatsapp.TextMessage) MessageAction {
return func() error { 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 { if err != nil {
log.Println(err)
b.SendLog(err.Error()) b.SendLog(err.Error())
return err
} }
// Messgae has already been sent senderName := DetermineSenderName(b, m.Info)
if wasSent == true {
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 return nil
} }
JID := m.Info.RemoteJid
DCID, err := b.GetOrCreateDCIDForJID(JID) DCID, err := b.GetOrCreateDCIDForJID(JID)
if err != nil { if err != nil {
log.Println(err)
b.SendLog(err.Error()) 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. imageData, err := m.Download()
if senderName == "" {
senderName = m.Info.RemoteJid if err != nil {
b.SendLog(err.Error())
return err
} }
if m.Info.FromMe == true { tmpFile, err := ioutil.TempFile(
senderName = b.DCContext.GetContact(b.DCUserID).GetDisplayName() b.Config.App.DataFolder+"/tmp",
"XXXXXXX-img",
)
if err != nil {
b.SendLog(err.Error())
return err
} }
contact, ok := b.WhappConn.Store.Contacts[senderName] err = ioutil.WriteFile(tmpFile.Name(), imageData, 0600)
if ok {
senderName = contact.Name if err != nil {
b.SendLog(err.Error())
return err
} }
b.DCContext.SendTextMessage( message := b.DCContext.NewMessage(deltachat.DC_MSG_IMAGE)
DCID, message.SetText(fmt.Sprintf("%s:\n%s", senderName, m.Caption))
fmt.Sprintf("%s:\n%s", senderName, m.Text), 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
}

@ -23,3 +23,12 @@ func (h *WhappHandler) HandleTextMessage(m whatsapp.TextMessage) {
h.MessageWorker.HandleMessage(handler) 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)
}

@ -66,7 +66,7 @@ func WhappQrLogin(
go func() { go func() {
qrCode := <-qrChan qrCode := <-qrChan
tmpFile, err := ioutil.TempFile(storageDir+"/tmp", "qr") tmpFile, err := ioutil.TempFile(storageDir+"/tmp", "XXXXXXX-qr")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@ -80,9 +80,7 @@ func WhappQrLogin(
message := ctx.DCContext.NewMessage(deltachat.DC_MSG_IMAGE) message := ctx.DCContext.NewMessage(deltachat.DC_MSG_IMAGE)
log.Println("MIME: " + mime.TypeByExtension(".png")) message.SetFile(tmpFile.Name(), mime.TypeByExtension(".png"))
message.SetFile(tmpFile.Name(), "image/png")
message.SetText("Scan this QR code from whatsapp") message.SetText("Scan this QR code from whatsapp")

Loading…
Cancel
Save