1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
wtf/wtf.go
2018-05-16 10:39:24 -07:00

227 lines
5.0 KiB
Go

package main
import (
"flag"
//"fmt"
"os"
"time"
"github.com/gdamore/tcell"
"github.com/olebedev/config"
"github.com/rivo/tview"
"github.com/senorprogrammer/wtf/bamboohr"
"github.com/senorprogrammer/wtf/clocks"
"github.com/senorprogrammer/wtf/gcal"
"github.com/senorprogrammer/wtf/git"
"github.com/senorprogrammer/wtf/github"
"github.com/senorprogrammer/wtf/help"
"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/system"
"github.com/senorprogrammer/wtf/textfile"
"github.com/senorprogrammer/wtf/todo"
"github.com/senorprogrammer/wtf/weather"
"github.com/senorprogrammer/wtf/wtf"
)
/* -------------------- Built-in Support Documentation -------------------- */
//func displayCommandInfo(args []string) {
//if len(args) == 0 {
//return
//}
//cmd := args[0]
//switch cmd {
//case "help", "--help":
//displayHelpInfo()
//case "version", "--version":
//displayVersionInfo()
//}
//}
//func displayHelpInfo() {
//fmt.Println("Help is coming...")
//os.Exit(0)
//}
//func displayVersionInfo() {
//fmt.Printf("Version: %s\n", version)
//os.Exit(0)
//}
/* -------------------- Functions -------------------- */
func addToGrid(grid *tview.Grid, widget wtf.Wtfable) {
if widget.Disabled() {
return
}
grid.AddItem(
widget.TextView(),
widget.Top(),
widget.Left(),
widget.Height(),
widget.Width(),
0,
0,
false,
)
}
// Grid stores all the widgets onscreen (like an HTML table)
func buildGrid(modules []wtf.Wtfable) *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
}
func keyboardIntercept(event *tcell.EventKey) *tcell.EventKey {
switch event.Key() {
case tcell.KeyCtrlR:
refreshAllModules()
case tcell.KeyTab:
FocusTracker.Next()
case tcell.KeyBacktab:
FocusTracker.Prev()
case tcell.KeyEsc:
FocusTracker.None()
default:
return event
}
return event
}
// redrawApp redraws the rendered views to screen on a defined interval (set in config.yml)
// Use this because each textView widget can have it's own update interval, and I don't want to
// manage drawing co-ordination amongst them all. If you need to have a
// widget redraw on it's own schedule, use the view's SetChangedFunc() and pass it `app`.
func redrawApp(app *tview.Application) {
tick := time.NewTicker(time.Duration(Config.UInt("wtf.refreshInterval", 2)) * time.Second)
quit := make(chan struct{})
for {
select {
case <-tick.C:
app.Draw()
case <-quit:
tick.Stop()
return
}
}
}
func refreshAllModules() {
for _, module := range Widgets {
go module.Refresh()
}
}
/* -------------------- Main -------------------- */
var Config *config.Config
var FocusTracker wtf.FocusTracker
var Widgets []wtf.Wtfable
var (
builtat = "dev"
version = "dev"
)
func main() {
// This all allows the user to pass flags in however they prefer. It supports the likes
// of:
// wtf help | -help | --help
// wtf version | -version | --version
flagConf := flag.String("config", "~/.wtf/config.yml", "Path to config file")
flagHelp := flag.Bool("help", false, "Show help")
flagVers := flag.Bool("version", false, "Show version info")
flag.Parse()
if *flagHelp {
help.DisplayHelpInfo()
}
if *flagVers {
help.DisplayVersionInfo(version)
}
help.DisplayCommandInfo(flag.Args(), version)
/* -------------------- end flag parsing and handling -------------------- */
// Responsible for creating the configuration directory and default
// configuration file if they don't already exist
wtf.CreateConfigDir()
wtf.WriteConfigFile()
Config = wtf.LoadConfigFile(*flagConf)
app := tview.NewApplication()
pages := tview.NewPages()
bamboohr.Config = Config
clocks.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
system.Config = Config
textfile.Config = Config
todo.Config = Config
weather.Config = Config
wtf.Config = Config
Widgets = []wtf.Wtfable{
bamboohr.NewWidget(),
clocks.NewWidget(),
gcal.NewWidget(),
git.NewWidget(app, pages),
github.NewWidget(app, pages),
jira.NewWidget(),
newrelic.NewWidget(),
opsgenie.NewWidget(),
security.NewWidget(),
status.NewWidget(),
system.NewWidget(builtat, version),
textfile.NewWidget(app, pages),
todo.NewWidget(app, pages),
weather.NewWidget(app, pages),
}
FocusTracker = wtf.FocusTracker{
App: app,
Idx: -1,
Widgets: Widgets,
}
// Loop in a routine to redraw the screen
go redrawApp(app)
grid := buildGrid(Widgets)
pages.AddPage("grid", grid, true, true)
app.SetInputCapture(keyboardIntercept)
if err := app.SetRoot(pages, true).Run(); err != nil {
os.Exit(1)
}
}