You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.6 KiB
96 lines
2.6 KiB
package main |
|
|
|
import ( |
|
"fmt" |
|
"os" |
|
"os/exec" |
|
"time" |
|
|
|
"gopkg.in/redis.v5" |
|
) |
|
|
|
func printUserScreen(redisClient *redis.Client, username string) string { |
|
clearScreen() |
|
fmt.Printf(" %s\n", config.NethackLauncher.ServerDisplay) |
|
println("") |
|
fmt.Printf(" Logged in as: %s\n", username) |
|
println("") |
|
println(" l) Logout") |
|
println(" c) Change password") |
|
println(" w) Watch games in progress") |
|
println(" h) View highscores") |
|
println(" a) View all scores") |
|
println(" e) Edit config") |
|
println(" r) Recover from crash") |
|
fmt.Printf(" p) Play NetHack %s\n", config.NethackLauncher.NethackVersion) |
|
fmt.Printf(" o) Play Shadow of the Wyrm %s\n", config.NethackLauncher.SotwVersion) |
|
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", "-cbreak").Run() |
|
clearScreen() |
|
printWelcomeScreen(redisClient) |
|
case "e": |
|
hackRCLoc := fmt.Sprintf("%s/user/%s/.nethackrc", config.NethackLauncher.HackDir, username) |
|
exec.Command("stty", "-F", "/dev/tty", "echo", "-cbreak").Run() |
|
clearScreen() |
|
nh := exec.Command("vim", "-Z", hackRCLoc) |
|
nh.Stdout = os.Stdout |
|
nh.Stdin = os.Stdin |
|
nh.Stderr = os.Stderr |
|
nh.Run() |
|
clearScreen() |
|
printUserScreen(redisClient, username) |
|
case "c": |
|
printChangePasswordScreen(redisClient, username) |
|
clearScreen() |
|
case "w": |
|
clearScreen() |
|
printProgressScreen(redisClient, username) |
|
case "h": |
|
clearScreen() |
|
printHighScores(redisClient, username) |
|
case "a": |
|
clearScreen() |
|
printAllScores(redisClient, username) |
|
case "p": |
|
wg.Add(1) |
|
currentTime := time.Now().UTC() |
|
fulltime := currentTime.Format("2006-01-02.03:04:05") |
|
go runGame(username, fulltime) |
|
watcher := startWatcher(username, fulltime, redisClient) |
|
wg.Wait() |
|
close(watcher) |
|
printUserScreen(redisClient, username) |
|
case "o": |
|
wg.Add(1) |
|
currentTime := time.Now().UTC() |
|
fulltime := currentTime.Format("2006-01-02.03:04:05") |
|
go runSotwGame(username, fulltime) |
|
watcher := startWatcher(username, fulltime, redisClient) |
|
wg.Wait() |
|
close(watcher) |
|
printUserScreen(redisClient, username) |
|
case "r": |
|
clearScreen() |
|
recoverSave(redisClient, username) |
|
case "q": |
|
exec.Command("stty", "-F", "/dev/tty", "echo", "-cbreak").Run() |
|
clearScreen() |
|
os.Exit(0) |
|
default: |
|
} |
|
} |
|
}
|
|
|