|
|
@ -7,7 +7,6 @@ import ( |
|
|
|
"bufio" |
|
|
|
"bufio" |
|
|
|
"fmt" |
|
|
|
"fmt" |
|
|
|
"io" |
|
|
|
"io" |
|
|
|
"io/ioutil" |
|
|
|
|
|
|
|
"os" |
|
|
|
"os" |
|
|
|
"os/exec" |
|
|
|
"os/exec" |
|
|
|
"strconv" |
|
|
|
"strconv" |
|
|
@ -15,7 +14,6 @@ import ( |
|
|
|
"sync" |
|
|
|
"sync" |
|
|
|
"time" |
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
|
|
"github.com/unixvoid/glogger" |
|
|
|
|
|
|
|
"golang.org/x/crypto/sha3" |
|
|
|
"golang.org/x/crypto/sha3" |
|
|
|
"gopkg.in/gcfg.v1" |
|
|
|
"gopkg.in/gcfg.v1" |
|
|
|
"gopkg.in/redis.v5" |
|
|
|
"gopkg.in/redis.v5" |
|
|
@ -45,20 +43,16 @@ var ( |
|
|
|
func main() { |
|
|
|
func main() { |
|
|
|
// read conf file
|
|
|
|
// read conf file
|
|
|
|
readConf() |
|
|
|
readConf() |
|
|
|
// init config file and logger
|
|
|
|
|
|
|
|
initLogger() |
|
|
|
|
|
|
|
// init redis connection
|
|
|
|
// init redis connection
|
|
|
|
redisClient, redisErr := initRedisConnection() |
|
|
|
redisClient, redisErr := initRedisConnection() |
|
|
|
if redisErr != nil { |
|
|
|
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) |
|
|
|
time.Sleep(config.NethackLauncher.BootstrapDelay * time.Second) |
|
|
|
redisClient, redisErr = initRedisConnection() |
|
|
|
redisClient, redisErr = initRedisConnection() |
|
|
|
if redisErr != nil { |
|
|
|
if redisErr != nil { |
|
|
|
//glogger.Error.Println("redis connection cannot be made, exiting.")
|
|
|
|
|
|
|
|
panic(redisErr) |
|
|
|
panic(redisErr) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
//glogger.Debug.Println("connection to redis succeeded.")
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// create initial files needed by nethack
|
|
|
|
// create initial files needed by nethack
|
|
|
@ -80,19 +74,6 @@ func readConf() { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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) { |
|
|
|
func initRedisConnection() (*redis.Client, error) { |
|
|
|
// init redis connection
|
|
|
|
// init redis connection
|
|
|
|
redisClient := redis.NewClient(&redis.Options{ |
|
|
|
redisClient := redis.NewClient(&redis.Options{ |
|
|
@ -108,14 +89,14 @@ func initRedisConnection() (*redis.Client, error) { |
|
|
|
func checkFiles() { |
|
|
|
func checkFiles() { |
|
|
|
// make sure record file exists
|
|
|
|
// make sure record file exists
|
|
|
|
if _, err := os.Stat(fmt.Sprintf("%s/record", config.NethackLauncher.HackDir)); os.IsNotExist(err) { |
|
|
|
if _, err := os.Stat(fmt.Sprintf("%s/record", config.NethackLauncher.HackDir)); os.IsNotExist(err) { |
|
|
|
glogger.Info.Printf("record file not found in %s/record\n", config.NethackLauncher.HackDir) |
|
|
|
fmt.Printf("record file not found in %s/record\n", config.NethackLauncher.HackDir) |
|
|
|
fmt.Printf("%s\n", err) |
|
|
|
fmt.Printf("%s\n", err) |
|
|
|
os.Exit(1) |
|
|
|
os.Exit(1) |
|
|
|
} |
|
|
|
} |
|
|
|
// make sure initial rcfile exists
|
|
|
|
// make sure initial rcfile exists
|
|
|
|
hackRCLoc := fmt.Sprintf("%s/.nethackrc", config.NethackLauncher.HackDir) |
|
|
|
hackRCLoc := fmt.Sprintf("%s/.nethackrc", config.NethackLauncher.HackDir) |
|
|
|
if _, err := os.Stat(hackRCLoc); os.IsNotExist(err) { |
|
|
|
if _, err := os.Stat(hackRCLoc); os.IsNotExist(err) { |
|
|
|
glogger.Info.Printf("initial config file not found at: %s\n", hackRCLoc) |
|
|
|
fmt.Printf("initial config file not found at: %s\n", hackRCLoc) |
|
|
|
fmt.Printf("%s\n", err) |
|
|
|
fmt.Printf("%s\n", err) |
|
|
|
os.Exit(1) |
|
|
|
os.Exit(1) |
|
|
|
} |
|
|
|
} |
|
|
@ -182,6 +163,7 @@ func printUserScreen(redisClient *redis.Client, username string) string { |
|
|
|
fmt.Printf(" Logged in as: %s\n", username) |
|
|
|
fmt.Printf(" Logged in as: %s\n", username) |
|
|
|
println("") |
|
|
|
println("") |
|
|
|
println(" l) Logout") |
|
|
|
println(" l) Logout") |
|
|
|
|
|
|
|
println(" c) Change password") |
|
|
|
println(" w) Watch games in progress") |
|
|
|
println(" w) Watch games in progress") |
|
|
|
println(" h) View highscores") |
|
|
|
println(" h) View highscores") |
|
|
|
println(" e) Edit config") |
|
|
|
println(" e) Edit config") |
|
|
@ -215,6 +197,9 @@ func printUserScreen(redisClient *redis.Client, username string) string { |
|
|
|
nh.Run() |
|
|
|
nh.Run() |
|
|
|
clearScreen() |
|
|
|
clearScreen() |
|
|
|
printUserScreen(redisClient, username) |
|
|
|
printUserScreen(redisClient, username) |
|
|
|
|
|
|
|
case "c": |
|
|
|
|
|
|
|
printChangePasswordScreen(redisClient, username) |
|
|
|
|
|
|
|
clearScreen() |
|
|
|
case "w": |
|
|
|
case "w": |
|
|
|
clearScreen() |
|
|
|
clearScreen() |
|
|
|
printProgressScreen(redisClient, username) |
|
|
|
printProgressScreen(redisClient, username) |
|
|
@ -372,6 +357,67 @@ func printRegisterScreen(redisClient *redis.Client) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func printChangePasswordScreen(redisClient *redis.Client, username string) { |
|
|
|
|
|
|
|
// TODO : configure password restriction checking
|
|
|
|
|
|
|
|
clearScreen() |
|
|
|
|
|
|
|
fmt.Printf(" %s\n", config.NethackLauncher.ServerDisplay) |
|
|
|
|
|
|
|
println("") |
|
|
|
|
|
|
|
fmt.Printf(" Welcome %s\n", username) |
|
|
|
|
|
|
|
println(" Only characters and numbers are allowed, with no spaces.") |
|
|
|
|
|
|
|
println(" 20 characters max. (blank entry aborts)") |
|
|
|
|
|
|
|
println("") |
|
|
|
|
|
|
|
//fmt.Printf(">> ")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scanner := bufio.NewScanner(os.Stdin) |
|
|
|
|
|
|
|
//for scanner.Scan() {
|
|
|
|
|
|
|
|
// if scanner.Text() == "" {
|
|
|
|
|
|
|
|
// printUserScreen(redisClient, username)
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// turn off echo display
|
|
|
|
|
|
|
|
exec.Command("stty", "-F", "/dev/tty", "-echo").Run() |
|
|
|
|
|
|
|
reader := bufio.NewReader(os.Stdin) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
noPass := true |
|
|
|
|
|
|
|
sec := "" |
|
|
|
|
|
|
|
for noPass { |
|
|
|
|
|
|
|
// pull pass the first time
|
|
|
|
|
|
|
|
fmt.Printf(" Please enter your password (blank entry aborts).\n>> ") |
|
|
|
|
|
|
|
sec0, _ := reader.ReadString('\n') |
|
|
|
|
|
|
|
sec0 = strings.Replace(sec0, "\n", "", -1) |
|
|
|
|
|
|
|
if sec0 == "" { |
|
|
|
|
|
|
|
printWelcomeScreen(redisClient) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// pull pass the second time
|
|
|
|
|
|
|
|
fmt.Printf("\n Please enter your password again.\n>> ") |
|
|
|
|
|
|
|
sec1, _ := reader.ReadString('\n') |
|
|
|
|
|
|
|
sec1 = strings.Replace(sec1, "\n", "", -1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// make sure passwords match
|
|
|
|
|
|
|
|
if sec0 == sec1 { |
|
|
|
|
|
|
|
sec = sec0 |
|
|
|
|
|
|
|
noPass = false |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
fmt.Println("Lets try that again.") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// reset display
|
|
|
|
|
|
|
|
exec.Command("stty", "-F", "/dev/tty", "echo", "-cbreak").Run() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// set user in redis
|
|
|
|
|
|
|
|
secHash := sha3.Sum512([]byte(sec)) |
|
|
|
|
|
|
|
redisClient.Set(fmt.Sprintf("user:%s", username), fmt.Sprintf("%x", secHash), 0).Err() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// back to main screen
|
|
|
|
|
|
|
|
printUserScreen(redisClient, username) |
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
if err := scanner.Err(); err != nil { |
|
|
|
|
|
|
|
fmt.Printf("%s\n", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func printProgressScreen(redisClient *redis.Client, username string) { |
|
|
|
func printProgressScreen(redisClient *redis.Client, username string) { |
|
|
|
// print header
|
|
|
|
// print header
|
|
|
|
fmt.Printf(" %s\n", config.NethackLauncher.ServerDisplay) |
|
|
|
fmt.Printf(" %s\n", config.NethackLauncher.ServerDisplay) |
|
|
|