aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2019-06-09 14:55:04 -0400
committerDrew DeVault <sir@cmpwn.com>2019-06-09 14:55:04 -0400
commit05f00f0153066b9bb527773927a3244dad28ef4f (patch)
tree1e3dbd574e358fbeaf4cf46774baf1a329f649ab
parentd63653ecdeb19c0fb4b3ea976c3e5ea96b408112 (diff)
Update our message flags when server updates them
-rw-r--r--lib/msgstore.go4
-rw-r--r--worker/imap/fetch.go24
-rw-r--r--worker/imap/worker.go12
3 files changed, 35 insertions, 5 deletions
diff --git a/lib/msgstore.go b/lib/msgstore.go
index 900ec16..56725e3 100644
--- a/lib/msgstore.go
+++ b/lib/msgstore.go
@@ -112,9 +112,7 @@ func merge(to *types.MessageInfo, from *types.MessageInfo) {
if from.Envelope != nil {
to.Envelope = from.Envelope
}
- if len(from.Flags) != 0 {
- to.Flags = from.Flags
- }
+ to.Flags = from.Flags
if from.Size != 0 {
to.Size = from.Size
}
diff --git a/worker/imap/fetch.go b/worker/imap/fetch.go
index 2d5bb7f..7d1bfcf 100644
--- a/worker/imap/fetch.go
+++ b/worker/imap/fetch.go
@@ -40,7 +40,11 @@ func (imapw *IMAPWorker) handleFetchMessageBodyPart(
imapw.worker.Logger.Printf("Fetching message part")
section := &imap.BodySectionName{}
section.Path = msg.Part
- items := []imap.FetchItem{section.FetchItem()}
+ items := []imap.FetchItem{
+ imap.FetchFlags,
+ imap.FetchUid,
+ section.FetchItem(),
+ }
uids := imap.SeqSet{}
uids.AddNum(msg.Uid)
imapw.handleFetchMessages(msg, &uids, items, section)
@@ -51,7 +55,11 @@ func (imapw *IMAPWorker) handleFetchFullMessages(
imapw.worker.Logger.Printf("Fetching full messages")
section := &imap.BodySectionName{}
- items := []imap.FetchItem{section.FetchItem()}
+ items := []imap.FetchItem{
+ imap.FetchFlags,
+ imap.FetchUid,
+ section.FetchItem(),
+ }
imapw.handleFetchMessages(msg, &msg.Uids, items, section)
}
@@ -89,6 +97,12 @@ func (imapw *IMAPWorker) handleFetchMessages(
Reader: reader,
Uid: _msg.Uid,
}, nil)
+ // Update flags (to mark message as read)
+ imapw.worker.PostMessage(&types.MessageInfo{
+ Message: types.RespondTo(msg),
+ Flags: _msg.Flags,
+ Uid: _msg.Uid,
+ }, nil)
case *types.FetchMessageBodyPart:
reader := _msg.GetBody(section)
imapw.worker.PostMessage(&types.MessageBodyPart{
@@ -96,6 +110,12 @@ func (imapw *IMAPWorker) handleFetchMessages(
Reader: reader,
Uid: _msg.Uid,
}, nil)
+ // Update flags (to mark message as read)
+ imapw.worker.PostMessage(&types.MessageInfo{
+ Message: types.RespondTo(msg),
+ Flags: _msg.Flags,
+ Uid: _msg.Uid,
+ }, nil)
}
}
done <- nil
diff --git a/worker/imap/worker.go b/worker/imap/worker.go
index f71a950..373072b 100644
--- a/worker/imap/worker.go
+++ b/worker/imap/worker.go
@@ -171,6 +171,18 @@ func (w *IMAPWorker) handleImapUpdate(update client.Update) {
Recent: int(status.Recent),
Unseen: int(status.Unseen),
}, nil)
+ case *client.MessageUpdate:
+ msg := update.Message
+ if msg.Uid == 0 {
+ msg.Uid = w.seqMap[msg.SeqNum-1]
+ }
+ w.worker.PostMessage(&types.MessageInfo{
+ BodyStructure: msg.BodyStructure,
+ Envelope: msg.Envelope,
+ Flags: msg.Flags,
+ InternalDate: msg.InternalDate,
+ Uid: msg.Uid,
+ }, nil)
case *client.ExpungeUpdate:
i := update.SeqNum - 1
uid := w.seqMap[i]