1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00

Move the scheduler up into /app

This commit is contained in:
Chris Cummer 2019-07-27 06:45:14 -07:00
parent a6d18e286a
commit cfd3c731ba
4 changed files with 40 additions and 41 deletions

37
app/scheduler.go Normal file
View File

@ -0,0 +1,37 @@
package app
import (
"time"
"github.com/wtfutil/wtf/wtf"
)
// Schedule kicks off the first refresh of a module's data and then queues the rest of the
// data refreshes on a timer
func Schedule(widget wtf.Wtfable) {
widget.Refresh()
interval := time.Duration(widget.RefreshInterval()) * time.Second
if interval <= 0 {
return
}
tick := time.NewTicker(interval)
quit := make(chan struct{})
for {
select {
case <-tick.C:
if widget.Enabled() {
widget.Refresh()
} else {
tick.Stop()
return
}
case <-quit:
tick.Stop()
return
}
}
}

View File

@ -47,8 +47,6 @@ func NewWtfApp(app *tview.Application, config *config.Config, configFilePath str
wtf.ValidateWidgets(wtfApp.Widgets) wtf.ValidateWidgets(wtfApp.Widgets)
wtfApp.scheduleWidgets()
return &wtfApp return &wtfApp
} }
@ -56,13 +54,12 @@ func NewWtfApp(app *tview.Application, config *config.Config, configFilePath str
// Start initializes the app // Start initializes the app
func (wtfApp *WtfApp) Start() { func (wtfApp *WtfApp) Start() {
wtfApp.scheduleWidgets()
go wtfApp.watchForConfigChanges() go wtfApp.watchForConfigChanges()
} }
// Stop kills all the currently-running widgets in this app // Stop kills all the currently-running widgets in this app
func (wtfApp *WtfApp) Stop() { func (wtfApp *WtfApp) Stop() {
// TODO: Pretty sure we should kill their go routines that run them as well
// otherwise....?
wtfApp.disableAllWidgets() wtfApp.disableAllWidgets()
} }
@ -115,7 +112,7 @@ func (wtfApp *WtfApp) refreshAllWidgets() {
func (wtfApp *WtfApp) scheduleWidgets() { func (wtfApp *WtfApp) scheduleWidgets() {
for _, widget := range wtfApp.Widgets { for _, widget := range wtfApp.Widgets {
go wtf.Schedule(widget) go Schedule(widget)
} }
} }

View File

@ -2,8 +2,7 @@ package wtf
// Enablable is the interface that enforces enable/disable capabilities on a module // Enablable is the interface that enforces enable/disable capabilities on a module
type Enablable interface { type Enablable interface {
Disable()
Disabled() bool Disabled() bool
Enabled() bool Enabled() bool
Disable()
} }

View File

@ -1,42 +1,8 @@
package wtf package wtf
import (
"time"
)
// Schedulable is the interface that enforces scheduling capabilities on a module // Schedulable is the interface that enforces scheduling capabilities on a module
type Schedulable interface { type Schedulable interface {
Refresh() Refresh()
Refreshing() bool Refreshing() bool
RefreshInterval() int RefreshInterval() int
} }
// Schedule kicks off the first refresh of a module's data and then queues the rest of the
// data refreshes on a timer
func Schedule(widget Wtfable) {
widget.Refresh()
interval := time.Duration(widget.RefreshInterval()) * time.Second
if interval <= 0 {
return
}
tick := time.NewTicker(interval)
quit := make(chan struct{})
for {
select {
case <-tick.C:
if widget.Enabled() {
widget.Refresh()
} else {
tick.Stop()
return
}
case <-quit:
tick.Stop()
return
}
}
}