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