aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkt programs <ktprograms@gmail.com>2022-09-25 09:55:21 +0800
committerRobin Jarry <robin@jarry.cc>2022-09-29 17:14:07 +0200
commit9c0e54f9d9afb5f4a9d91ca9766fc2ef2cfd82de (patch)
tree2e2e6fd94233c3cb73d2b7fe9797ec603d9ff461
parentbf2bf8c242cbddce684acd55743caa9b749f6d46 (diff)
downloadaerc-9c0e54f9d9afb5f4a9d91ca9766fc2ef2cfd82de.tar.gz
imap: stop checkmail if there are pending actions
Pass message containing remaining directories to check. Account widget will recursively call CheckMail with the remaining directories until a Done message is returned. Only needed for IMAP worker as other workers run check-mail-cmd in a separate goroutine. Suggested-By: Tim Culverhouse <tim@timculverhouse.com> Signed-off-by: kt programs <ktprograms@gmail.com> Tested-by: Tim Culverhouse <tim@timculverhouse.com>
-rw-r--r--widgets/account.go25
-rw-r--r--worker/imap/checkmail.go13
-rw-r--r--worker/types/messages.go5
3 files changed, 37 insertions, 6 deletions
diff --git a/widgets/account.go b/widgets/account.go
index 382a07a8..c131f335 100644
--- a/widgets/account.go
+++ b/widgets/account.go
@@ -438,12 +438,25 @@ func (acct *AccountView) CheckMail() {
Timeout: acct.acct.CheckMailTimeout,
}
acct.checkingMail = true
- acct.worker.PostAction(msg, func(_ types.WorkerMessage) {
- acct.SetStatus(statusline.ConnectionActivity(""))
- acct.Lock()
- acct.checkingMail = false
- acct.Unlock()
- })
+
+ var cb func(types.WorkerMessage)
+ cb = func(response types.WorkerMessage) {
+ dirsMsg, ok := response.(*types.CheckMailDirectories)
+ if ok {
+ checkMailMsg := &types.CheckMail{
+ Directories: dirsMsg.Directories,
+ Command: acct.acct.CheckMailCmd,
+ Timeout: acct.acct.CheckMailTimeout,
+ }
+ acct.worker.PostAction(checkMailMsg, cb)
+ } else { // Done
+ acct.SetStatus(statusline.ConnectionActivity(""))
+ acct.Lock()
+ acct.checkingMail = false
+ acct.Unlock()
+ }
+ }
+ acct.worker.PostAction(msg, cb)
}
// CheckMailReset resets the check-mail timer
diff --git a/worker/imap/checkmail.go b/worker/imap/checkmail.go
index 21f2e4bb..e0aef71b 100644
--- a/worker/imap/checkmail.go
+++ b/worker/imap/checkmail.go
@@ -13,7 +13,13 @@ func (w *IMAPWorker) handleCheckMailMessage(msg *types.CheckMail) {
imap.StatusRecent,
imap.StatusUnseen,
}
+ var remaining []string
for _, dir := range msg.Directories {
+ if len(w.worker.Actions) > 0 {
+ remaining = append(remaining, dir)
+ continue
+ }
+
logging.Debugf("Getting status of directory %s", dir)
status, err := w.client.Status(dir, items)
if err != nil {
@@ -38,5 +44,12 @@ func (w *IMAPWorker) handleCheckMailMessage(msg *types.CheckMail) {
}, nil)
}
}
+ if len(remaining) > 0 {
+ w.worker.PostMessage(&types.CheckMailDirectories{
+ Message: types.RespondTo(msg),
+ Directories: remaining,
+ }, nil)
+ return
+ }
w.worker.PostMessage(&types.Done{Message: types.RespondTo(msg)}, nil)
}
diff --git a/worker/types/messages.go b/worker/types/messages.go
index 9194cbe4..00a1a781 100644
--- a/worker/types/messages.go
+++ b/worker/types/messages.go
@@ -255,3 +255,8 @@ type LabelList struct {
Message
Labels []string
}
+
+type CheckMailDirectories struct {
+ Message
+ Directories []string
+}