From 5c7d4873908f28dde33013d10543e4cf1417525b Mon Sep 17 00:00:00 2001 From: Shivesh Mandalia Date: Sat, 23 Oct 2021 18:37:06 +0100 Subject: Implement interface for my custom IMAP flags --- worker/imap/flags.go | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) (limited to 'worker/imap/flags.go') diff --git a/worker/imap/flags.go b/worker/imap/flags.go index aef1019..d71e3bb 100644 --- a/worker/imap/flags.go +++ b/worker/imap/flags.go @@ -76,6 +76,263 @@ func (imapw *IMAPWorker) handleAnsweredMessages(msg *types.AnsweredMessages) { }) } +// NOTE(shivesh): my custom flags +func (imapw *IMAPWorker) handleImportantMessages(msg *types.ImportantMessages) { + item := imap.FormatFlagsOp(imap.AddFlags, true) + flags := []interface{}{"important"} + if !msg.Important { + item = imap.FormatFlagsOp(imap.RemoveFlags, true) + flags = []interface{}{"important"} + } + uids := toSeqSet(msg.Uids) + emitErr := func(err error) { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } + if err := imapw.client.UidStore(uids, item, flags, nil); err != nil { + emitErr(err) + return + } + imapw.worker.PostAction(&types.FetchMessageHeaders{ + Uids: msg.Uids, + }, func(_msg types.WorkerMessage) { + switch m := _msg.(type) { + case *types.Error: + err := fmt.Errorf("handleImportantMessages: %v", m.Error) + imapw.worker.Logger.Printf("could not fetch headers: %s", err) + emitErr(err) + case *types.Done: + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } + }) +} + +func (imapw *IMAPWorker) handleListMessages(msg *types.ListMessages) { + item := imap.FormatFlagsOp(imap.AddFlags, true) + flags := []interface{}{"list"} + if !msg.List { + item = imap.FormatFlagsOp(imap.RemoveFlags, true) + flags = []interface{}{"list"} + } + uids := toSeqSet(msg.Uids) + emitErr := func(err error) { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } + if err := imapw.client.UidStore(uids, item, flags, nil); err != nil { + emitErr(err) + return + } + imapw.worker.PostAction(&types.FetchMessageHeaders{ + Uids: msg.Uids, + }, func(_msg types.WorkerMessage) { + switch m := _msg.(type) { + case *types.Error: + err := fmt.Errorf("handleListMessages: %v", m.Error) + imapw.worker.Logger.Printf("could not fetch headers: %s", err) + emitErr(err) + case *types.Done: + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } + }) +} + +func (imapw *IMAPWorker) handleFoodMessages(msg *types.FoodMessages) { + item := imap.FormatFlagsOp(imap.AddFlags, true) + flags := []interface{}{"food"} + if !msg.Food { + item = imap.FormatFlagsOp(imap.RemoveFlags, true) + flags = []interface{}{"food"} + } + uids := toSeqSet(msg.Uids) + emitErr := func(err error) { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } + if err := imapw.client.UidStore(uids, item, flags, nil); err != nil { + emitErr(err) + return + } + imapw.worker.PostAction(&types.FetchMessageHeaders{ + Uids: msg.Uids, + }, func(_msg types.WorkerMessage) { + switch m := _msg.(type) { + case *types.Error: + err := fmt.Errorf("handleFoodMessages: %v", m.Error) + imapw.worker.Logger.Printf("could not fetch headers: %s", err) + emitErr(err) + case *types.Done: + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } + }) +} + +func (imapw *IMAPWorker) handlePersonalMessages(msg *types.PersonalMessages) { + item := imap.FormatFlagsOp(imap.AddFlags, true) + flags := []interface{}{"personal"} + if !msg.Personal { + item = imap.FormatFlagsOp(imap.RemoveFlags, true) + flags = []interface{}{"personal"} + } + uids := toSeqSet(msg.Uids) + emitErr := func(err error) { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } + if err := imapw.client.UidStore(uids, item, flags, nil); err != nil { + emitErr(err) + return + } + imapw.worker.PostAction(&types.FetchMessageHeaders{ + Uids: msg.Uids, + }, func(_msg types.WorkerMessage) { + switch m := _msg.(type) { + case *types.Error: + err := fmt.Errorf("handlePersonalMessages: %v", m.Error) + imapw.worker.Logger.Printf("could not fetch headers: %s", err) + emitErr(err) + case *types.Done: + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } + }) +} + +func (imapw *IMAPWorker) handleWorkMessages(msg *types.WorkMessages) { + item := imap.FormatFlagsOp(imap.AddFlags, true) + flags := []interface{}{"work"} + if !msg.Work { + item = imap.FormatFlagsOp(imap.RemoveFlags, true) + flags = []interface{}{"work"} + } + uids := toSeqSet(msg.Uids) + emitErr := func(err error) { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } + if err := imapw.client.UidStore(uids, item, flags, nil); err != nil { + emitErr(err) + return + } + imapw.worker.PostAction(&types.FetchMessageHeaders{ + Uids: msg.Uids, + }, func(_msg types.WorkerMessage) { + switch m := _msg.(type) { + case *types.Error: + err := fmt.Errorf("handleWorkMessages: %v", m.Error) + imapw.worker.Logger.Printf("could not fetch headers: %s", err) + emitErr(err) + case *types.Done: + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } + }) +} + +func (imapw *IMAPWorker) handlePhysicsMessages(msg *types.PhysicsMessages) { + item := imap.FormatFlagsOp(imap.AddFlags, true) + flags := []interface{}{"physics"} + if !msg.Physics { + item = imap.FormatFlagsOp(imap.RemoveFlags, true) + flags = []interface{}{"physics"} + } + uids := toSeqSet(msg.Uids) + emitErr := func(err error) { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } + if err := imapw.client.UidStore(uids, item, flags, nil); err != nil { + emitErr(err) + return + } + imapw.worker.PostAction(&types.FetchMessageHeaders{ + Uids: msg.Uids, + }, func(_msg types.WorkerMessage) { + switch m := _msg.(type) { + case *types.Error: + err := fmt.Errorf("handlePhysicsMessages: %v", m.Error) + imapw.worker.Logger.Printf("could not fetch headers: %s", err) + emitErr(err) + case *types.Done: + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } + }) +} + +func (imapw *IMAPWorker) handleTodoMessages(msg *types.TodoMessages) { + item := imap.FormatFlagsOp(imap.AddFlags, true) + flags := []interface{}{"todo"} + if !msg.Todo { + item = imap.FormatFlagsOp(imap.RemoveFlags, true) + flags = []interface{}{"todo"} + } + uids := toSeqSet(msg.Uids) + emitErr := func(err error) { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } + if err := imapw.client.UidStore(uids, item, flags, nil); err != nil { + emitErr(err) + return + } + imapw.worker.PostAction(&types.FetchMessageHeaders{ + Uids: msg.Uids, + }, func(_msg types.WorkerMessage) { + switch m := _msg.(type) { + case *types.Error: + err := fmt.Errorf("handleTodoMessages: %v", m.Error) + imapw.worker.Logger.Printf("could not fetch headers: %s", err) + emitErr(err) + case *types.Done: + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } + }) +} + +func (imapw *IMAPWorker) handleLaterMessages(msg *types.LaterMessages) { + item := imap.FormatFlagsOp(imap.AddFlags, true) + flags := []interface{}{"later"} + if !msg.Later { + item = imap.FormatFlagsOp(imap.RemoveFlags, true) + flags = []interface{}{"later"} + } + uids := toSeqSet(msg.Uids) + emitErr := func(err error) { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } + if err := imapw.client.UidStore(uids, item, flags, nil); err != nil { + emitErr(err) + return + } + imapw.worker.PostAction(&types.FetchMessageHeaders{ + Uids: msg.Uids, + }, func(_msg types.WorkerMessage) { + switch m := _msg.(type) { + case *types.Error: + err := fmt.Errorf("handleLaterMessages: %v", m.Error) + imapw.worker.Logger.Printf("could not fetch headers: %s", err) + emitErr(err) + case *types.Done: + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } + }) +} + func (imapw *IMAPWorker) handleFlagMessages(msg *types.FlagMessages) { flags := []interface{}{flagToImap[msg.Flag]} item := imap.FormatFlagsOp(imap.AddFlags, true) -- cgit v1.2.3