diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | go.mod | 3 | ||||
-rw-r--r-- | go.sum | 6 | ||||
-rw-r--r-- | widgets/account.go | 52 | ||||
-rw-r--r-- | widgets/aerc.go | 7 |
5 files changed, 66 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore index cc49a55..8fc975f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .go /aerc2 log +raw.log diff --git a/go.mod b/go.mod index 6cf9fb6..f70969c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,9 @@ module git.sr.ht/~sircmpwn/aerc2 require ( + github.com/emersion/go-imap v1.0.0-beta.1 + github.com/emersion/go-imap-idle v0.0.0-20180114101550-2af93776db6b + github.com/emersion/go-sasl v0.0.0-20161116183048-7e096a0a6197 // indirect github.com/gdamore/encoding v0.0.0-20151215212835-b23993cbb635 github.com/gdamore/tcell v1.0.0 github.com/go-ini/ini v1.32.0 diff --git a/go.sum b/go.sum index 728bd83..169cb9b 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,9 @@ +github.com/emersion/go-imap v1.0.0-beta.1 h1:bTCaVlUnb5mKoW9lEukusxguSYYZPer+q0g5t+vw5X0= +github.com/emersion/go-imap v1.0.0-beta.1/go.mod h1:oydmHwiyv92ZOiNfQY9BDax5heePWN8P2+W1B2T6qjc= +github.com/emersion/go-imap-idle v0.0.0-20180114101550-2af93776db6b h1:q4qkNe/W10qFGD3RWd4meQTkD0+Zrz0L4ekMvlptg60= +github.com/emersion/go-imap-idle v0.0.0-20180114101550-2af93776db6b/go.mod h1:o14zPKCmEH5WC1vU5SdPoZGgNvQx7zzKSnxPQlobo78= +github.com/emersion/go-sasl v0.0.0-20161116183048-7e096a0a6197 h1:rDJPbyliyym8ZL/Wt71kdolp6yaD4fLIQz638E6JEt0= +github.com/emersion/go-sasl v0.0.0-20161116183048-7e096a0a6197/go.mod h1:G/dpzLu16WtQpBfQ/z3LYiYJn3ZhKSGWn83fyoyQe/k= github.com/gdamore/encoding v0.0.0-20151215212835-b23993cbb635/go.mod h1:yrQYJKKDTrHmbYxI7CYi+/hbdiDT2m4Hj+t0ikCjsrQ= github.com/gdamore/tcell v1.0.0/go.mod h1:tqyG50u7+Ctv1w5VX67kLzKcj9YXR/JSBZQq/+mLl1A= github.com/go-ini/ini v1.32.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= diff --git a/widgets/account.go b/widgets/account.go index a2c5ce7..1f0cc6a 100644 --- a/widgets/account.go +++ b/widgets/account.go @@ -1,18 +1,29 @@ package widgets import ( + "log" + "git.sr.ht/~sircmpwn/aerc2/config" "git.sr.ht/~sircmpwn/aerc2/lib/ui" + "git.sr.ht/~sircmpwn/aerc2/worker" + "git.sr.ht/~sircmpwn/aerc2/worker/types" ) type AccountView struct { conf *config.AccountConfig grid *ui.Grid + logger *log.Logger onInvalidate func(d ui.Drawable) + worker *types.Worker } func NewAccountView(conf *config.AccountConfig, - statusbar ui.Drawable) *AccountView { + logger *log.Logger, statusbar ui.Drawable) (*AccountView, error) { + + worker, err := worker.NewWorker(conf.Source, logger) + if err != nil { + return nil, err + } grid := ui.NewGrid().Rows([]ui.GridSpec{ {ui.SIZE_WEIGHT, 1}, @@ -25,7 +36,44 @@ func NewAccountView(conf *config.AccountConfig, ui.NewFill('s'), ui.BORDER_RIGHT)).Span(2, 1) grid.AddChild(ui.NewFill('.')).At(0, 1) grid.AddChild(statusbar).At(1, 1) - return &AccountView{conf: conf, grid: grid} + + acct := &AccountView{ + conf: conf, + grid: grid, + logger: logger, + worker: worker, + } + + go worker.Backend.Run() + go func() { + for { + msg := <-worker.Messages + msg = worker.ProcessMessage(msg) + // TODO: dispatch to appropriate handlers + } + }() + + worker.PostAction(&types.Configure{Config: conf}, nil) + worker.PostAction(&types.Connect{}, acct.connected) + + return acct, nil +} + +func (acct *AccountView) connected(msg types.WorkerMessage) { + switch msg := msg.(type) { + case *types.Done: + acct.logger.Println("Connected.") + acct.worker.PostAction(&types.ListDirectories{}, nil) + case *types.CertificateApprovalRequest: + // TODO: Ask the user + acct.logger.Println("Approving certificate") + acct.worker.PostAction(&types.ApproveCertificate{ + Message: types.RespondTo(msg), + Approved: true, + }, acct.connected) + default: + acct.logger.Println("Connection failed.") + } } func (acct *AccountView) OnInvalidate(onInvalidate func(d ui.Drawable)) { diff --git a/widgets/aerc.go b/widgets/aerc.go index 3bd082e..4351f3b 100644 --- a/widgets/aerc.go +++ b/widgets/aerc.go @@ -42,7 +42,12 @@ func NewAerc(conf *config.AercConfig, logger *log.Logger) *Aerc { mainGrid.AddChild(tabs.TabContent).At(1, 0).Span(1, 2) for _, acct := range conf.Accounts { - tabs.Add(NewAccountView(&acct, statusbar), acct.Name) + view, err := NewAccountView(&acct, logger, statusbar) + if err != nil { + // TODO: something useful (update statusline?) + panic(err) + } + tabs.Add(view, acct.Name) } return &Aerc{ |