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

139 lines
3.0 KiB
Go

package main
import (
"flag"
"os"
"time"
"github.com/gdamore/tcell"
"github.com/olebedev/config"
"github.com/rivo/tview"
"github.com/senorprogrammer/wtf/bamboohr"
"github.com/senorprogrammer/wtf/gcal"
"github.com/senorprogrammer/wtf/git"
"github.com/senorprogrammer/wtf/github"
"github.com/senorprogrammer/wtf/jira"
"github.com/senorprogrammer/wtf/newrelic"
"github.com/senorprogrammer/wtf/opsgenie"
"github.com/senorprogrammer/wtf/security"
"github.com/senorprogrammer/wtf/status"
"github.com/senorprogrammer/wtf/textfile"
"github.com/senorprogrammer/wtf/weather"
"github.com/senorprogrammer/wtf/wtf"
)
func addToGrid(grid *tview.Grid, widget wtf.TextViewer) {
if widget.Disabled() {
return
}
grid.AddItem(
widget.TextView(),
widget.Top(),
widget.Left(),
widget.Height(),
widget.Width(),
0,
0,
false, // has focus
)
}
// Grid stores all the widgets onscreen (like an HTML table)
func buildGrid(modules []wtf.TextViewer) *tview.Grid {
grid := tview.NewGrid()
grid.SetColumns(wtf.ToInts(Config.UList("wtf.grid.columns"))...)
grid.SetRows(wtf.ToInts(Config.UList("wtf.grid.rows"))...)
grid.SetBorder(false)
for _, module := range modules {
addToGrid(grid, module)
go wtf.Schedule(module)
}
return grid
}
// FIXME: Not a fan of how this function has to reach outside itself, grab
// Modules, and then operate on them. Should be able to pass that in instead
func keyboardIntercept(event *tcell.EventKey) *tcell.EventKey {
// Ctrl-R: force-refreshes every widget
if event.Key() == tcell.KeyCtrlR {
for _, module := range Widgets {
go module.Refresh()
}
} else if event.Key() == tcell.KeyTab {
}
return event
}
func refresher(app *tview.Application) {
tick := time.NewTicker(time.Duration(Config.UInt("wtf.refreshInterval", 1)) * time.Second)
quit := make(chan struct{})
for {
select {
case <-tick.C:
app.Draw()
case <-quit:
tick.Stop()
return
}
}
}
var result = wtf.CreateConfigDir()
var Config *config.Config
var Widgets []wtf.TextViewer
/* -------------------- Main -------------------- */
func main() {
// Optional argument to accept path to a config file
configFile := flag.String("config", "~/.wtf/config.yml", "Path to config file")
flag.Parse()
Config = wtf.LoadConfigFile(*configFile)
wtf.Config = Config
bamboohr.Config = Config
gcal.Config = Config
git.Config = Config
github.Config = Config
jira.Config = Config
newrelic.Config = Config
opsgenie.Config = Config
security.Config = Config
status.Config = Config
textfile.Config = Config
weather.Config = Config
Widgets = []wtf.TextViewer{
bamboohr.NewWidget(),
gcal.NewWidget(),
git.NewWidget(),
github.NewWidget(),
jira.NewWidget(),
newrelic.NewWidget(),
opsgenie.NewWidget(),
security.NewWidget(),
status.NewWidget(),
textfile.NewWidget(),
weather.NewWidget(),
}
app := tview.NewApplication()
app.SetInputCapture(keyboardIntercept)
// Loop in a routine to redraw the screen
go refresher(app)
grid := buildGrid(Widgets)
if err := app.SetRoot(grid, true).Run(); err != nil {
os.Exit(1)
}
}