|
|
|
package whappdc
|
|
|
|
|
|
|
|
import "github.com/hugot/go-deltachat/deltachat"
|
|
|
|
|
|
|
|
// MessageWorker receives structs of type MessageHandler and distributes them across chat
|
|
|
|
// workers. Each whatsapp chat should have its own worker. If a message is encountered for
|
|
|
|
// a chat that has no worker yet, it is created.
|
|
|
|
type MessageWorker struct {
|
|
|
|
incomingHandlers chan MessageHandler
|
|
|
|
chatWorkers map[string]*ChatWorker
|
|
|
|
quit chan bool
|
|
|
|
logger deltachat.Logger
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewMessageWorker(logger deltachat.Logger) *MessageWorker {
|
|
|
|
return &MessageWorker{
|
|
|
|
incomingHandlers: make(chan MessageHandler),
|
|
|
|
chatWorkers: make(map[string]*ChatWorker),
|
|
|
|
quit: make(chan bool),
|
|
|
|
logger: logger,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w *MessageWorker) HandleMessage(m MessageHandler) {
|
|
|
|
w.incomingHandlers <- m
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w *MessageWorker) Stop() {
|
|
|
|
w.quit <- true
|
|
|
|
|
|
|
|
for _, worker := range w.chatWorkers {
|
|
|
|
worker.Stop()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w *MessageWorker) Start() {
|
|
|
|
go func() {
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case <-w.quit:
|
|
|
|
return
|
|
|
|
case handler := <-w.incomingHandlers:
|
|
|
|
worker, ok := w.chatWorkers[handler.Jid]
|
|
|
|
|
|
|
|
if !ok {
|
|
|
|
worker = NewChatWorker(w.logger)
|
|
|
|
worker.Start()
|
|
|
|
|
|
|
|
w.chatWorkers[handler.Jid] = worker
|
|
|
|
}
|
|
|
|
|
|
|
|
worker.HandleMessage(handler)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
}
|