Stop creating a new chat for each incoming message. Still spammy on restart though...
parent
cd5696954c
commit
eb0a653195
@ -0,0 +1,52 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Rhymen/go-whatsapp"
|
||||||
|
"github.com/hugot/go-deltachat/deltachat"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BridgeContext struct {
|
||||||
|
WhappConn *whatsapp.Conn
|
||||||
|
DCContext *deltachat.Context
|
||||||
|
DB *Database
|
||||||
|
DCUserID uint32
|
||||||
|
DCUserChatID uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find or create a deltachat verified group chat for a whatsapp JID and return it's ID.
|
||||||
|
func (b *BridgeContext) GetOrCreateDCIDForJID(JID string, isGroup bool) (uint32, error) {
|
||||||
|
if DCID, _ := b.DB.GetDCIDForWhappJID(JID); DCID != nil {
|
||||||
|
return *DCID, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
chatName := JID
|
||||||
|
if isGroup {
|
||||||
|
chat, ok := b.WhappConn.Store.Chats[JID]
|
||||||
|
|
||||||
|
if ok {
|
||||||
|
chatName = chat.Name
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
contact, ok := b.WhappConn.Store.Contacts[JID]
|
||||||
|
|
||||||
|
if ok {
|
||||||
|
chatName = contact.Name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DCID := b.DCContext.CreateGroupChat(true, chatName)
|
||||||
|
|
||||||
|
err := b.DB.StoreDCIDForJID(JID, DCID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return DCID, err
|
||||||
|
}
|
||||||
|
|
||||||
|
b.DCContext.AddContactToChat(DCID, b.DCUserID)
|
||||||
|
|
||||||
|
return DCID, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BridgeContext) SendLog(logString string) {
|
||||||
|
b.DCContext.SendTextMessage(b.DCUserChatID, logString)
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "log"
|
||||||
|
|
||||||
|
type ChatWorker struct {
|
||||||
|
incomingHandlers chan MessageHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *ChatWorker) Start() {
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case handler := <-w.incomingHandlers:
|
||||||
|
log.Println("Chat worker executing action")
|
||||||
|
err := handler.Action()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/Rhymen/go-whatsapp"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MessageHandler struct {
|
||||||
|
Action MessageAction
|
||||||
|
Jid string
|
||||||
|
}
|
||||||
|
|
||||||
|
type MessageAction func() error
|
||||||
|
|
||||||
|
func MakeTextMessageAction(b *BridgeContext, m whatsapp.TextMessage) MessageAction {
|
||||||
|
return func() error {
|
||||||
|
JID := m.Info.RemoteJid
|
||||||
|
|
||||||
|
DCID, err := b.GetOrCreateDCIDForJID(JID, m.Info.RemoteJid != m.Info.SenderJid)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
b.SendLog(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
senderName := m.Info.Source.GetParticipant()
|
||||||
|
contact, ok := b.WhappConn.Store.Contacts[senderName]
|
||||||
|
if ok {
|
||||||
|
senderName = contact.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
b.DCContext.SendTextMessage(
|
||||||
|
DCID,
|
||||||
|
fmt.Sprintf("%s:\n%s", senderName, m.Text),
|
||||||
|
)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "log"
|
||||||
|
|
||||||
|
type MessageWorker struct {
|
||||||
|
incomingHandlers chan MessageHandler
|
||||||
|
chatWorkers map[string]chan MessageHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMessageWorker() *MessageWorker {
|
||||||
|
return &MessageWorker{
|
||||||
|
incomingHandlers: make(chan MessageHandler),
|
||||||
|
chatWorkers: make(map[string]chan MessageHandler),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *MessageWorker) HandleMessage(m MessageHandler) {
|
||||||
|
w.incomingHandlers <- m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *MessageWorker) Start() {
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case handler := <-w.incomingHandlers:
|
||||||
|
log.Println("Got Handler for " + handler.Jid)
|
||||||
|
workerChan, ok := w.chatWorkers[handler.Jid]
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
workerChan = make(chan MessageHandler)
|
||||||
|
|
||||||
|
worker := &ChatWorker{
|
||||||
|
incomingHandlers: workerChan,
|
||||||
|
}
|
||||||
|
|
||||||
|
worker.Start()
|
||||||
|
w.chatWorkers[handler.Jid] = workerChan
|
||||||
|
}
|
||||||
|
|
||||||
|
workerChan <- handler
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
Loading…
Reference in New Issue