mirror of https://github.com/icedream/icecon.git
75 lines
1.3 KiB
Go
75 lines
1.3 KiB
Go
package ui
|
|
|
|
import (
|
|
"bufio"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/icedream/icecon/internal/rcon"
|
|
"github.com/icedream/icecon/internal/ui"
|
|
)
|
|
|
|
func init() {
|
|
ui.RegisterUserInterface(ui.UserInterfaceProvider{
|
|
New: NewConsoleUserInterface,
|
|
})
|
|
}
|
|
|
|
type consoleUserInterface struct {
|
|
rcon *rcon.Client
|
|
bufferedStdin *bufio.Reader
|
|
}
|
|
|
|
func NewConsoleUserInterface(rconClient *rcon.Client) (ui.UserInterface, error) {
|
|
return &consoleUserInterface{
|
|
rcon: rconClient,
|
|
bufferedStdin: bufio.NewReader(os.Stdin),
|
|
}, nil
|
|
}
|
|
|
|
func (ui *consoleUserInterface) readLineFromInput() (input string, err error) {
|
|
for {
|
|
if line, hasMoreInLine, err := ui.bufferedStdin.ReadLine(); err != nil {
|
|
return input, err
|
|
} else {
|
|
input += string(line)
|
|
if !hasMoreInLine {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (ui *consoleUserInterface) Run() error {
|
|
for {
|
|
input, err := ui.readLineFromInput()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
continue
|
|
}
|
|
|
|
// "quit" => exit shell
|
|
if strings.EqualFold(strings.TrimSpace(input), "quit") {
|
|
break
|
|
}
|
|
|
|
err = ui.rcon.Send(input)
|
|
if err != nil {
|
|
log.Println(err)
|
|
continue
|
|
}
|
|
msg, err := ui.rcon.Receive()
|
|
if err != nil {
|
|
log.Println(err)
|
|
continue
|
|
}
|
|
switch strings.ToLower(msg.Name) {
|
|
case "print":
|
|
log.Println(string(msg.Data))
|
|
}
|
|
}
|
|
return nil
|
|
}
|