ArinDash/main.go

210 lines
6.1 KiB
Go

package main
import (
"ArinDash/util"
"ArinDash/widgets"
"context"
"github.com/mum4k/termdash"
"github.com/mum4k/termdash/align"
"github.com/mum4k/termdash/cell"
"github.com/mum4k/termdash/container"
"github.com/mum4k/termdash/container/grid"
"github.com/mum4k/termdash/keyboard"
"github.com/mum4k/termdash/linestyle"
"github.com/mum4k/termdash/terminal/tcell"
"github.com/mum4k/termdash/terminal/terminalapi"
"github.com/mum4k/termdash/widgets/textinput"
)
const rootID = "root"
func quitter(cancel context.CancelFunc) func(k *terminalapi.Keyboard) {
quitter := func(k *terminalapi.Keyboard) {
if k.Key == keyboard.KeyEsc || k.Key == keyboard.KeyCtrlC {
cancel()
}
}
return quitter
}
func initWidgets(ctx context.Context, term *tcell.Terminal) {
var titleUpdate = make(chan string)
widgets.Create(ctx, term,
widgets.New("Clock", widgets.Clock()),
widgets.New("Date", widgets.Date()),
widgets.New("Calendar", widgets.Calendar()),
widgets.New("CalendarEvents", widgets.CalendarEvents()),
widgets.New("Weather", widgets.Weather()),
widgets.New("ChangeTitle", widgets.TextInput(titleUpdate, textinput.Label("Update Title: "), textinput.PlaceHolder("New Title"))),
widgets.New("Wifi", widgets.WifiQRCode()),
widgets.New("NetworkDevices", widgets.NetworkDevices()),
widgets.New("Docker", widgets.DockerList()),
widgets.New("HTTPProber", widgets.HTTPProber()),
widgets.New("PiHole", widgets.PiholeStats()),
widgets.New("PiHoleBlocked", widgets.PiholeBlocked()),
widgets.New("NinaWarnings", widgets.NinaWarnings()),
widgets.New("News", widgets.News()),
)
}
func layout() []container.Option {
builder := grid.New()
builder.Add(
grid.ColWidthFixed(84,
grid.RowHeightFixed(44,
grid.Widget(widgets.Get["Wifi"],
container.BorderTitle("Wifi"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite)),
),
grid.RowHeightFixed(46,
grid.Widget(widgets.Get["NetworkDevices"],
container.BorderTitle("Network Devices"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
container.PaddingLeft(1),
container.PaddingTop(1),
),
),
),
grid.ColWidthPerc(62,
grid.RowHeightFixed(44,
grid.ColWidthFixed(40,
grid.RowHeightFixed(8,
grid.Widget(widgets.Get["Clock"],
container.AlignHorizontal(align.HorizontalCenter),
container.BorderTitle("Time"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
),
),
grid.RowHeightFixed(12,
grid.Widget(widgets.Get["PiHole"],
container.BorderTitle("pi-hole"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
container.PaddingLeft(1),
container.PaddingTop(1),
),
),
grid.RowHeightFixed(40,
grid.Widget(widgets.Get["PiHoleBlocked"],
container.BorderTitle("pi-hole (Blocked Percent)"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
),
),
),
grid.ColWidthFixed(26,
grid.RowHeightFixed(20,
grid.Widget(widgets.Get["Calendar"],
container.BorderTitle("Calendar"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
container.PaddingLeft(1),
container.PaddingTop(1),
),
),
grid.RowHeightFixed(25,
grid.Widget(widgets.Get["empty"],
container.Border(linestyle.Light),
container.BorderColor(cell.ColorGreen),
),
),
),
grid.ColWidthFixed(25,
grid.RowHeightFixed(20,
grid.Widget(widgets.Get["CalendarEvents"],
container.BorderTitle("Events"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
container.PaddingLeft(1),
container.PaddingTop(1),
),
),
grid.RowHeightFixed(13,
grid.Widget(widgets.Get["Weather"],
container.BorderTitle("Weather"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
container.PaddingLeft(1),
),
),
grid.RowHeightFixed(85,
grid.Widget(widgets.Get["empty"],
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
),
),
),
),
grid.RowHeightFixed(20,
grid.RowHeightFixed(20,
grid.Widget(widgets.Get["News"],
container.BorderTitle("News"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
container.PaddingLeft(1),
container.PaddingTop(1),
),
),
grid.RowHeightFixed(20,
grid.Widget(widgets.Get["NinaWarnings"],
container.BorderTitle("BBK Warnings"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
container.PaddingLeft(1),
container.PaddingTop(1),
),
),
),
),
grid.ColWidthPerc(35,
grid.RowHeightFixed(20,
grid.Widget(widgets.Get["empty"],
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
),
),
grid.RowHeightFixed(24,
grid.Widget(widgets.Get["HTTPProber"],
container.BorderTitle("Website Status"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
container.PaddingLeft(1),
container.PaddingTop(1),
),
),
grid.RowHeightFixed(40,
grid.Widget(widgets.Get["Docker"],
container.BorderTitle("Docker"),
container.Border(linestyle.Light),
container.BorderColor(cell.ColorWhite),
container.PaddingLeft(1),
container.PaddingTop(1),
),
),
),
)
return util.PanicOnErrorWithResult(builder.Build())
}
func main() {
term := util.PanicOnErrorWithResult(tcell.New(tcell.ColorMode(terminalapi.ColorMode256)))
defer term.Close()
ctx, cancel := context.WithCancel(context.Background())
initWidgets(ctx, term)
rootContainer := util.PanicOnErrorWithResult(container.New(term, container.ID(rootID)))
util.PanicOnError(rootContainer.Update(rootID, layout()...))
util.PanicOnError(termdash.Run(ctx, term, rootContainer, termdash.KeyboardSubscriber(quitter(cancel)), termdash.RedrawInterval(util.RedrawInterval)))
}