|
|
|
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)
|
|
|
|
}
|