Make ChatWorker stop-able and make sure it gets stopped

master
Hugo Thunnissen 4 years ago
parent 8eeb6db586
commit dfd428d3a7

@ -2,16 +2,36 @@ package whappdc
import "log" import "log"
// ChatWorker receives structs of type MessageHandler and executes them sequentially. By
// executing the handlers sequentially we try to make sure that the messages are sent
// through deltachat in the right order.
type ChatWorker struct { type ChatWorker struct {
incomingHandlers chan MessageHandler incomingHandlers chan MessageHandler
quit chan bool
}
func NewChatWorker() *ChatWorker {
return &ChatWorker{
incomingHandlers: make(chan MessageHandler, 3),
quit: make(chan bool),
}
}
func (w *ChatWorker) HandleMessage(m MessageHandler) {
w.incomingHandlers <- m
}
func (w *ChatWorker) Stop() {
w.quit <- true
} }
func (w *ChatWorker) Start() { func (w *ChatWorker) Start() {
go func() { go func() {
for { for {
select { select {
case <-w.quit:
return
case handler := <-w.incomingHandlers: case handler := <-w.incomingHandlers:
log.Println("Chat worker executing action")
err := handler.Action() err := handler.Action()
if err != nil { if err != nil {

@ -1,17 +1,18 @@
package whappdc package whappdc
import "log" // 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 { type MessageWorker struct {
incomingHandlers chan MessageHandler incomingHandlers chan MessageHandler
chatWorkers map[string]chan MessageHandler chatWorkers map[string]*ChatWorker
quit chan bool quit chan bool
} }
func NewMessageWorker() *MessageWorker { func NewMessageWorker() *MessageWorker {
return &MessageWorker{ return &MessageWorker{
incomingHandlers: make(chan MessageHandler), incomingHandlers: make(chan MessageHandler),
chatWorkers: make(map[string]chan MessageHandler), chatWorkers: make(map[string]*ChatWorker),
quit: make(chan bool), quit: make(chan bool),
} }
} }
@ -22,6 +23,10 @@ func (w *MessageWorker) HandleMessage(m MessageHandler) {
func (w *MessageWorker) Stop() { func (w *MessageWorker) Stop() {
w.quit <- true w.quit <- true
for _, worker := range w.chatWorkers {
worker.Stop()
}
} }
func (w *MessageWorker) Start() { func (w *MessageWorker) Start() {
@ -31,21 +36,16 @@ func (w *MessageWorker) Start() {
case <-w.quit: case <-w.quit:
return return
case handler := <-w.incomingHandlers: case handler := <-w.incomingHandlers:
log.Println("Got Handler for " + handler.Jid) worker, ok := w.chatWorkers[handler.Jid]
workerChan, ok := w.chatWorkers[handler.Jid]
if !ok { if !ok {
workerChan = make(chan MessageHandler) worker = NewChatWorker()
worker := &ChatWorker{
incomingHandlers: workerChan,
}
worker.Start() worker.Start()
w.chatWorkers[handler.Jid] = workerChan
w.chatWorkers[handler.Jid] = worker
} }
workerChan <- handler worker.HandleMessage(handler)
} }
} }
}() }()

Loading…
Cancel
Save