You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.2 KiB
Go

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