mc-monitor/main.go

96 lines
2.0 KiB
Go

package main
import (
"fmt"
"log"
"strings"
"time"
"github.com/jroimartin/gocui"
)
var dcfg *DynmapConfig
var serverName, baseURL string
var close bool
const VIEW_KEY = "MAIN_VIEW_KEY"
func main() {
serverName = "minecraft.br0xen.com"
fmt.Println(serverName)
baseURL = "http://minecraft.br0xen.com:8123/up/"
dcfg = NewDynmapConfig(serverName, baseURL)
dcfg.Update()
g, err := gocui.NewGui(gocui.OutputNormal)
if err != nil {
log.Panicln(err)
}
defer g.Close()
list := NewListWidget(VIEW_KEY, 1, 1, LeftPad(" ", 35)+"\n\n\n\n\n\n\n\n")
g.SetManager(list)
if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
log.Panicln(err)
}
go func() {
for !close {
dcfg.Update()
g.Update(func(g *gocui.Gui) error {
lst, _ := g.View(VIEW_KEY)
lst.Clear()
fmt.Fprintln(lst, Center(dcfg.Name, 35))
fmt.Fprintln(lst, Center(fmt.Sprintf("~ %s ~", dcfg.GetServerTime()), 35))
num := fmt.Sprintf("[ %d ]", dcfg.GetOnlinePlayerCount())
for _, v := range dcfg.GetPlayerList() {
fmt.Fprintln(lst, "* %s", v)
}
for i := dcfg.GetOnlinePlayerCount(); i < 6; i++ {
fmt.Fprintln(lst, " ")
}
fmt.Fprintln(lst, LeftPad(num, 35))
return nil
})
time.Sleep(time.Second * 5)
}
}()
if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
log.Panicln(err)
}
close = true
}
func quit(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit
}
type ListWidget struct {
name string
x, y int
w, h int
body string
}
func NewListWidget(name string, x, y int, body string) *ListWidget {
lines := strings.Split(body, "\n")
w := 0
for _, l := range lines {
if len(l) > w {
w = len(l)
}
}
h := len(lines) + 1
w = w + 1
return &ListWidget{name: name, x: x, y: y, w: w, h: h, body: body}
}
func (w *ListWidget) Layout(g *gocui.Gui) error {
v, err := g.SetView(w.name, w.x, w.y, w.x+w.w, w.y+w.h)
if err != nil {
if err != gocui.ErrUnknownView {
return err
}
fmt.Fprint(v, w.body)
}
return nil
}