package main import ( "bufio" "fmt" "io/ioutil" "net/http" "os" "os/exec" "time" "github.com/unixvoid/glogger" "gopkg.in/gcfg.v1" "gopkg.in/redis.v5" ) type Config struct { NethackLauncher struct { Loglevel string RecordLocation string ReclistLocation string BootstrapDelay time.Duration } Redis struct { Host string Password string } } var ( config = Config{} ) func main() { // read conf file readConf() // init config file and logger initLogger() // init redis connection redisClient, redisErr := initRedisConnection() if redisErr != nil { glogger.Debug.Printf("redis connection cannot be made, trying again in %s second(s)\n", config.NethackLauncher.BootstrapDelay*time.Second) time.Sleep(config.NethackLauncher.BootstrapDelay * time.Second) redisClient, redisErr = initRedisConnection() if redisErr != nil { glogger.Error.Println("redis connection cannot be made, exiting.") panic(redisErr) } } else { glogger.Debug.Println("connection to redis succeeded.") } screenFunction := printWelcomeScreen(redisClient) fmt.Printf("screen %s recieved\n", screenFunction) } func readConf() { // init config file err := gcfg.ReadFileInto(&config, "config.gcfg") if err != nil { panic(fmt.Sprintf("Could not load config.gcfg, error: %s\n", err)) } } func initLogger() { // init logger if config.NethackLauncher.Loglevel == "debug" { glogger.LogInit(os.Stdout, os.Stdout, os.Stdout, os.Stderr) } else if config.NethackLauncher.Loglevel == "cluster" { glogger.LogInit(os.Stdout, os.Stdout, ioutil.Discard, os.Stderr) } else if config.NethackLauncher.Loglevel == "info" { glogger.LogInit(os.Stdout, ioutil.Discard, ioutil.Discard, os.Stderr) } else { glogger.LogInit(ioutil.Discard, ioutil.Discard, ioutil.Discard, os.Stderr) } } func initRedisConnection() (*redis.Client, error) { // init redis connection redisClient := redis.NewClient(&redis.Options{ Addr: config.Redis.Host, Password: config.Redis.Password, DB: 0, }) _, redisErr := redisClient.Ping().Result() return redisClient, redisErr } func checkFiles() { // make sure record file exists if _, err := os.Stat(config.NethackLauncher.RecordLocation); os.IsNotExist(err) { glogger.Info.Printf("record file not found in %s\n", config.NethackLauncher.RecordLocation) fmt.Printf("%s\n", err) os.Exit(1) } // make sure reclist bin exists if _, err := os.Stat(config.NethackLauncher.ReclistLocation); os.IsNotExist(err) { glogger.Info.Printf("reclist binary not found in %s\n", config.NethackLauncher.ReclistLocation) fmt.Printf("%s\n", err) os.Exit(1) } } func clearScreen() { cmd := exec.Command("clear") cmd.Stdout = os.Stdout cmd.Run() } func printWelcomeScreen(redisClient *redis.Client) string { clearScreen() println("unixvoid.com underground nethack server") println("") println(" Not logged in.") println("") println(" l) Login") println(" r) Register new user") println(" w) Watch games in progress") println(" q) Quit") println("") fmt.Printf(">> ") // disable input buffering exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run() // do not display entered characters on the screen exec.Command("stty", "-F", "/dev/tty", "-echo").Run() var b []byte = make([]byte, 1) for { os.Stdin.Read(b) switch string(b) { case "l": // restart display exec.Command("stty", "-F", "/dev/tty", "echo").Run() clearScreen() printLoginScreen(redisClient) case "r": clearScreen() return ("r") case "w": clearScreen() return ("w") case "q": clearScreen() os.Exit(0) default: } } } func printLoginScreen(redisClient *redis.Client) { println("unixvoid.com underground nethack server") println("") println(" Please enter your username. (blank entry aborts)") println("") fmt.Printf(">> ") scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { if scanner.Text() == "" { printWelcomeScreen(redisClient) } fmt.Printf("you entered '%s'\n", scanner.Text()) // check redis for user } if err := scanner.Err(); err != nil { fmt.Printf("%s\n", err) } } func gethighscore(w http.ResponseWriter, r *http.Request) { // run script output, err := exec.Command(config.NethackLauncher.ReclistLocation, "-f", config.NethackLauncher.RecordLocation).CombinedOutput() if err != nil { fmt.Printf("%s\n", err) } fmt.Fprintf(w, "%s\n", output) }