Implement ImageMessage handler

master
Hugo Thunnissen 4 years ago
parent 3bccb1cf61
commit d549dc407a

@ -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
}

@ -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
}

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

@ -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
}

@ -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)
}

@ -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")

Loading…
Cancel
Save