summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--worker/maildir/worker.go56
1 files changed, 50 insertions, 6 deletions
diff --git a/worker/maildir/worker.go b/worker/maildir/worker.go
index 3c15f2c..17123c6 100644
--- a/worker/maildir/worker.go
+++ b/worker/maildir/worker.go
@@ -96,7 +96,7 @@ func (w *Worker) handleFSEvent(ev fsnotify.Event) {
 	w.worker.PostMessage(&types.DirectoryContents{
 		Uids: sortedUids,
 	}, nil)
-	dirInfo := w.getDirectoryInfo()
+	dirInfo := w.getDirectoryInfo(w.selectedName)
 	dirInfo.Recent = len(newUnseen)
 	w.worker.PostMessage(&types.DirectoryInfo{
 		Info: dirInfo,
@@ -114,9 +114,9 @@ func (w *Worker) err(msg types.WorkerMessage, err error) {
 	}, nil)
 }
 
-func (w *Worker) getDirectoryInfo() *models.DirectoryInfo {
+func (w *Worker) getDirectoryInfo(name string) *models.DirectoryInfo {
 	dirInfo := &models.DirectoryInfo{
-		Name:     w.selectedName,
+		Name:     name,
 		Flags:    []string{},
 		ReadOnly: false,
 		// total messages
@@ -125,15 +125,27 @@ func (w *Worker) getDirectoryInfo() *models.DirectoryInfo {
 		Recent: 0,
 		// total unread
 		Unseen: 0,
+
+		AccurateCounts: true,
 	}
-	uids, err := w.c.UIDs(*w.selected)
+
+	dir := w.c.Dir(name)
+
+	uids, err := w.c.UIDs(dir)
 	if err != nil {
 		w.worker.Logger.Printf("could not get uids: %v", err)
 		return dirInfo
 	}
 	dirInfo.Exists = len(uids)
+
+	recent, err := dir.UnseenCount()
+	if err != nil {
+		w.worker.Logger.Printf("could not get unseen count: %v", err)
+	}
+	dirInfo.Recent = recent
+
 	for _, uid := range uids {
-		message, err := w.c.Message(*w.selected, uid)
+		message, err := w.c.Message(dir, uid)
 		if err != nil {
 			w.worker.Logger.Printf("could not get message: %v", err)
 			continue
@@ -153,6 +165,7 @@ func (w *Worker) getDirectoryInfo() *models.DirectoryInfo {
 			dirInfo.Unseen++
 		}
 	}
+	dirInfo.Unseen += dirInfo.Recent
 	return dirInfo
 }
 
@@ -229,6 +242,10 @@ func (w *Worker) handleListDirectories(msg *types.ListDirectories) error {
 				Attributes: []string{},
 			},
 		}, nil)
+
+		w.worker.PostMessage(&types.DirectoryInfo{
+			Info: w.getDirectoryInfo(name),
+		}, nil)
 	}
 	return nil
 }
@@ -265,7 +282,7 @@ func (w *Worker) handleOpenDirectory(msg *types.OpenDirectory) error {
 
 	// TODO: why does this need to be sent twice??
 	info := &types.DirectoryInfo{
-		Info: w.getDirectoryInfo(),
+		Info: w.getDirectoryInfo(msg.Directory),
 	}
 	w.worker.PostMessage(info, nil)
 	w.worker.PostMessage(info, nil)
@@ -392,6 +409,10 @@ func (w *Worker) handleFetchMessageBodyPart(
 		Info:    info,
 	}, nil)
 
+	w.worker.PostMessage(&types.DirectoryInfo{
+		Info: w.getDirectoryInfo(w.selectedName),
+	}, nil)
+
 	return nil
 }
 
@@ -430,6 +451,11 @@ func (w *Worker) handleDeleteMessages(msg *types.DeleteMessages) error {
 		w.worker.Logger.Printf("error removing some messages: %v", err)
 		return err
 	}
+
+	w.worker.PostMessage(&types.DirectoryInfo{
+		Info: w.getDirectoryInfo(w.selectedName),
+	}, nil)
+
 	return nil
 }
 
@@ -452,10 +478,15 @@ func (w *Worker) handleReadMessages(msg *types.ReadMessages) error {
 			w.err(msg, err)
 			continue
 		}
+
 		w.worker.PostMessage(&types.MessageInfo{
 			Message: types.RespondTo(msg),
 			Info:    info,
 		}, nil)
+
+		w.worker.PostMessage(&types.DirectoryInfo{
+			Info: w.getDirectoryInfo(w.selectedName),
+		}, nil)
 	}
 	return nil
 }
@@ -466,6 +497,15 @@ func (w *Worker) handleCopyMessages(msg *types.CopyMessages) error {
 	if err != nil {
 		return err
 	}
+
+	w.worker.PostMessage(&types.DirectoryInfo{
+		Info: w.getDirectoryInfo(w.selectedName),
+	}, nil)
+
+	w.worker.PostMessage(&types.DirectoryInfo{
+		Info: w.getDirectoryInfo(msg.Destination),
+	}, nil)
+
 	return nil
 }
 
@@ -482,6 +522,10 @@ func (w *Worker) handleAppendMessage(msg *types.AppendMessage) error {
 		w.worker.Logger.Printf("could not write message to destination: %v", err)
 		return err
 	}
+
+	w.worker.PostMessage(&types.DirectoryInfo{
+		Info: w.getDirectoryInfo(msg.Destination),
+	}, nil)
 	return nil
 }