4 changed files with 158 additions and 13 deletions
			
			
		@ -0,0 +1,144 @@
					 | 
				
			||||
package main | 
				
			||||
 | 
				
			||||
import ( | 
				
			||||
	"bufio" | 
				
			||||
	"fmt" | 
				
			||||
	"io/ioutil" | 
				
			||||
	"os" | 
				
			||||
	"os/exec" | 
				
			||||
	"strconv" | 
				
			||||
	"strings" | 
				
			||||
 | 
				
			||||
	"gopkg.in/redis.v5" | 
				
			||||
) | 
				
			||||
 | 
				
			||||
func printLibraryScreen(redisClient *redis.Client, username string) { | 
				
			||||
	// print header
 | 
				
			||||
	fmt.Printf(" %s\n", config.NethackLauncher.ServerDisplay) | 
				
			||||
	println("") | 
				
			||||
 | 
				
			||||
	println(" Choose a users library to view ('enter' without selection returns)") | 
				
			||||
	println("") | 
				
			||||
 | 
				
			||||
	us, err := ioutil.ReadDir(fmt.Sprintf("/%s/user", config.NethackLauncher.HackDir)) | 
				
			||||
	if err != nil { | 
				
			||||
		println(" No users exist ('enter' without selection returns)") | 
				
			||||
		panic(err) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	users := make(map[int]string) | 
				
			||||
	usersTimer := 1 | 
				
			||||
	for _, u := range us { | 
				
			||||
		fmt.Printf(" %d) %s\n", usersTimer, u.Name()) | 
				
			||||
 | 
				
			||||
		// add user to line map
 | 
				
			||||
		users[usersTimer] = fmt.Sprintf("%s", u.Name()) | 
				
			||||
		usersTimer++ | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	fmt.Println("") | 
				
			||||
	fmt.Printf(">> ") | 
				
			||||
	// start user input
 | 
				
			||||
 | 
				
			||||
	// 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) | 
				
			||||
		s, _ := strconv.Atoi(string(b)) | 
				
			||||
 | 
				
			||||
		// check if user is trying to navigate
 | 
				
			||||
		if string(b) == "\n" { | 
				
			||||
			exec.Command("stty", "-F", "/dev/tty", "echo", "-cbreak").Run() | 
				
			||||
			clearScreen() | 
				
			||||
			if username == "" { | 
				
			||||
				clearScreen() | 
				
			||||
				printWelcomeScreen(redisClient) | 
				
			||||
			} else { | 
				
			||||
				clearScreen() | 
				
			||||
				printUserScreen(redisClient, username) | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		// check if selection is in out map
 | 
				
			||||
		if users[s] != "" { | 
				
			||||
			user := strings.Split(users[s], ":") | 
				
			||||
			fmt.Printf("going to spectate '%s'\n", user[0]) | 
				
			||||
			clearScreen() | 
				
			||||
			printUserLibraryScreen(redisClient, username, user[0]) | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
func printUserLibraryScreen(redisClient *redis.Client, username, currentUser string) { | 
				
			||||
	// print header
 | 
				
			||||
	fmt.Printf(" %s\n", config.NethackLauncher.ServerDisplay) | 
				
			||||
	println("") | 
				
			||||
 | 
				
			||||
	println(" Choose a ttyrec to view ('enter' without selection returns)") | 
				
			||||
	println(" The following keybinds are available during playback:") | 
				
			||||
	println("   • + or f: double the speed of playback") | 
				
			||||
	println("   • - or s: halve the speed of playback") | 
				
			||||
	println("   • 0:      set playback speed to 0, pausing playback") | 
				
			||||
	println("   • 1:      set playback speed to 1 again") | 
				
			||||
	println("") | 
				
			||||
 | 
				
			||||
	t, err := ioutil.ReadDir(fmt.Sprintf("/%s/user/%s/ttyrec", config.NethackLauncher.HackDir, currentUser)) | 
				
			||||
	if err != nil { | 
				
			||||
		println(" No ttyrecs exist ('enter' without selection returns)") | 
				
			||||
		panic(err) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	ttyrecs := make(map[int]string) | 
				
			||||
	ttyrecsTimer := 1 | 
				
			||||
	for _, ty := range t { | 
				
			||||
		fmt.Printf(" %d) %s\n", ttyrecsTimer, ty.Name()) | 
				
			||||
 | 
				
			||||
		// add user to line map
 | 
				
			||||
		ttyrecs[ttyrecsTimer] = fmt.Sprintf("%s", ty.Name()) | 
				
			||||
		ttyrecsTimer++ | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	fmt.Println("") | 
				
			||||
	fmt.Printf(">> ") | 
				
			||||
	// start user input
 | 
				
			||||
 | 
				
			||||
	// disable input buffering
 | 
				
			||||
	exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run() | 
				
			||||
	// enable showing input on screen
 | 
				
			||||
	exec.Command("stty", "-F", "/dev/tty", "echo", "-cbreak").Run() | 
				
			||||
 | 
				
			||||
	scanner := bufio.NewScanner(os.Stdin) | 
				
			||||
	for scanner.Scan() { | 
				
			||||
		if scanner.Text() == "" { | 
				
			||||
			clearScreen() | 
				
			||||
			printLibraryScreen(redisClient, username) | 
				
			||||
		} | 
				
			||||
		// save input
 | 
				
			||||
		s := scanner.Text() | 
				
			||||
		sel, err := strconv.Atoi(s) | 
				
			||||
		if err != nil { | 
				
			||||
			fmt.Printf(" There was a problem with your last entry.\n>> ") | 
				
			||||
		} | 
				
			||||
		// check if selection is in our map
 | 
				
			||||
		if ttyrecs[sel] != "" { | 
				
			||||
			fmt.Printf("going to watch '%s'\n", ttyrecs[sel]) | 
				
			||||
			clearScreen() | 
				
			||||
 | 
				
			||||
			// set ttyrec path
 | 
				
			||||
			ttyrecPath := fmt.Sprintf("%s/user/%s/ttyrec/%s", config.NethackLauncher.HackDir, username, ttyrecs[sel]) | 
				
			||||
			tp := exec.Command("ttyplay", ttyrecPath) | 
				
			||||
			tp.Stdout = os.Stdout | 
				
			||||
			tp.Stdin = os.Stdin | 
				
			||||
			tp.Stderr = os.Stderr | 
				
			||||
			err := tp.Run() | 
				
			||||
			if err != nil { | 
				
			||||
				fmt.Print(err) | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		clearScreen() | 
				
			||||
		printUserLibraryScreen(redisClient, username, currentUser) | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue