From ee347acb965f648306065a8bedc3e1d03b0484b2 Mon Sep 17 00:00:00 2001 From: Krumel Date: Tue, 1 Jun 2021 18:57:13 +0200 Subject: [PATCH] stuff --- go.mod | 6 ++- go.sum | 6 +++ serverwrapper.go | 114 +++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 121 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index f738a69..0031ead 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,8 @@ module krumel.moe/serverwrapper go 1.16 -require github.com/pelletier/go-toml v1.9.1 +require ( + github.com/jroimartin/gocui v0.4.0 // indirect + github.com/nsf/termbox-go v1.1.1 // indirect + github.com/pelletier/go-toml v1.9.1 +) diff --git a/go.sum b/go.sum index a8985e1..39f8c5a 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,8 @@ +github.com/jroimartin/gocui v0.4.0 h1:52jnalstgmc25FmtGcWqa0tcbMEWS6RpFLsOIO+I+E8= +github.com/jroimartin/gocui v0.4.0/go.mod h1:7i7bbj99OgFHzo7kB2zPb8pXLqMBSQegY7azfqXMkyY= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY= +github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= github.com/pelletier/go-toml v1.9.1 h1:a6qW1EVNZWH9WGI6CsYdD8WAylkoXBS5yv0XHlh17Tc= github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= diff --git a/serverwrapper.go b/serverwrapper.go index 5d5770e..14f8197 100644 --- a/serverwrapper.go +++ b/serverwrapper.go @@ -1,12 +1,118 @@ package main import ( + "bufio" "fmt" + "io" + "log" + + // "math" + "container/ring" + "os/exec" + + "github.com/jroimartin/gocui" "github.com/pelletier/go-toml" ) -func main() { - config, _ := toml.LoadFile("serverwrapper.toml") - str, _ := config.ToTomlString() - fmt.Println(str) +var settings *toml.Tree +var stdout_ring *ring.Ring +var srv_stdin io.WriteCloser + +// reload settings (and maybe other things too) +func reload() { + settings, _ = toml.LoadFile("serverwrapper.toml") } + +//builds the cmd which is called to run the server +func build_cmd() (string, string) { + return "ping", "-t 8.8.8.8" +} + +//run the server-thread +func server_run() { + //create the command and start it + cmd_str, cmd_args := build_cmd() + cmd := exec.Command(cmd_str, cmd_args) + err := cmd.Start() + if err != nil { + log.Panicln("Failed to call server command \"" + cmd.String() + "\"") + } + + //connect pipes + stdout, err := cmd.StdoutPipe() + cmd.Stderr = cmd.Stdout + srv_stdin, err = cmd.StdinPipe() //this one is global, because we write to it elsewhere + + //read pipes and write them to the ring buffer + buf := bufio.NewReader(stdout) + for { + stdout_ring.Value, _, err = buf.ReadLine() + stdout_ring = stdout_ring.Next() + } + +} + +//refresh the screen +func refresh(g *gocui.Gui) error { + v, err := g.View("srv_log") + if err != nil { + log.Panicln(err) + } + v.Clear() + + vW, vH := v.Size() + + r := stdout_ring + + for i := 0; i < vH; i++ { + fmt.Fprintln(v, r.Value) + r = r.Prev() + } + + return nil +} + +func main() { + //initialize settings by "re"loading them from disk + reload() + + //initialize the stdout/err ringbuffer + stdout_ring = ring.New(255) + + //init the CUI + g, err := gocui.NewGui(gocui.OutputNormal) + if err != nil { + log.Panicln(err) + } + defer g.Close() + + g.SetManagerFunc(layout) + + if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil { + log.Panicln(err) + } + + if err := g.MainLoop(); err != nil && err != gocui.ErrQuit { + log.Panicln(err) + } +} + +//create the CUI layout +func layout(g *gocui.Gui) error { + maxX, maxY := g.Size() + + if v, err := g.SetView("srv_log", 0, 0, maxX-1, int(float32(maxY) * 0.8)); err != nil { + if err != gocui.ErrUnknownView { + return err + } + + str, _ := settings.ToTomlString(); + fmt.Fprintln(v, str) + } + + return nil +} + +func quit(g *gocui.Gui, v *gocui.View) error { + return gocui.ErrQuit +} \ No newline at end of file