diff options
author | Zach Latta <zach@zachlatta.com> | 2017-05-02 14:02:11 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-02 14:02:11 -0700 |
commit | dd4a449f866df09622684dc89e7cda0a9dd7fe51 (patch) | |
tree | 932a1740fc053de24b686eb4f2f95dc31004b58c | |
parent | 21653d3217598d54708acad75ed32e9e2b40c9a5 (diff) | |
parent | 323d7201729ddd30b5c6ecfff740f23dc36a413e (diff) | |
download | sshtron-dd4a449f866df09622684dc89e7cda0a9dd7fe51.tar.gz |
Merge pull request #22 from alyyousuf7/master
Add ability to choose color
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | game.go | 103 | ||||
-rw-r--r-- | main.go | 5 |
3 files changed, 69 insertions, 45 deletions
@@ -10,6 +10,12 @@ _Controls: WASD or vim keybindings to move (**do not use your arrow keys**). Esc **Code quality disclaimer:** _SSHTron was built in ~20 hours at [BrickHack 2](https://brickhack.io/). Here be dragons._ +## Want to choose color yourself? + +There are total 7 colors to choose from: Red, Green, Yellow, Blue, Magenta, Cyan and White + + $ ssh red@sshtron.zachlatta.com + ## Running Your Own Copy Clone the project and `cd` into its directory. These instructions assume that you have your `GOPATH` setup correctly. @@ -7,6 +7,7 @@ import ( "io" "math/rand" "sort" + "strings" "time" "github.com/dustinkirkland/golang-petname" @@ -95,8 +96,11 @@ const ( playerRed = color.FgRed playerGreen = color.FgGreen + playerYellow = color.FgYellow + playerBlue = color.FgBlue playerMagenta = color.FgMagenta playerCyan = color.FgCyan + playerWhite = color.FgWhite PlayerUp PlayerDirection = iota PlayerLeft @@ -104,21 +108,29 @@ const ( PlayerRight ) -var playerColors = []color.Attribute{playerRed, playerGreen, playerMagenta, - playerCyan} +var playerColors = []color.Attribute{ + playerRed, playerGreen, playerYellow, playerBlue, + playerMagenta, playerCyan, playerWhite, +} var playerBorderColors = map[color.Attribute]color.Attribute{ playerRed: color.FgHiRed, playerGreen: color.FgHiGreen, + playerYellow: color.FgHiYellow, + playerBlue: color.FgHiBlue, playerMagenta: color.FgHiMagenta, playerCyan: color.FgHiCyan, + playerWhite: color.FgHiWhite, } var playerColorNames = map[color.Attribute]string{ playerRed: "Red", playerGreen: "Green", + playerYellow: "Yellow", + playerBlue: "Blue", playerMagenta: "Magenta", playerCyan: "Cyan", + playerWhite: "White", } type PlayerTrailSegment struct { @@ -129,6 +141,7 @@ type PlayerTrailSegment struct { type Player struct { s *Session + Name string CreatedAt time.Time Direction PlayerDirection Marker rune @@ -371,51 +384,57 @@ func (gm *GameManager) GameCount() int { return len(gm.Games) } -func (gm *GameManager) Run() { - for { - select { - case c := <-gm.HandleChannel: - g := gm.getGameWithAvailability() - if g == nil { - g = NewGame(gameWidth, gameHeight) - gm.Games[g.Name] = g +func (gm *GameManager) HandleNewChannel(c ssh.Channel, color string) { + g := gm.getGameWithAvailability() + if g == nil { + g = NewGame(gameWidth, gameHeight) + gm.Games[g.Name] = g + + go g.Run() + } - go g.Run() + colorOptions := g.AvailableColors() + finalColor := colorOptions[0] + + // choose the requested color if available + color = strings.ToLower(color) + for _, clr := range colorOptions { + if strings.ToLower(playerColorNames[clr]) == color { + finalColor = clr + break + } + } + + session := NewSession(c, g.WorldWidth(), g.WorldHeight(), finalColor) + g.AddSession(session) + + go func() { + reader := bufio.NewReader(c) + for { + r, _, err := reader.ReadRune() + if err != nil { + fmt.Println(err) + break } - session := NewSession(c, g.WorldWidth(), g.WorldHeight(), - g.AvailableColors()[0]) - g.AddSession(session) - - go func() { - reader := bufio.NewReader(c) - for { - r, _, err := reader.ReadRune() - if err != nil { - fmt.Println(err) - break - } - - switch r { - case keyW, keyZ, keyK, keyComma: - session.Player.HandleUp() - case keyA, keyQ, keyH: - session.Player.HandleLeft() - case keyS, keyJ, keyO: - session.Player.HandleDown() - case keyD, keyL, keyE: - session.Player.HandleRight() - case keyCtrlC, keyEscape: - if g.SessionCount() == 1 { - delete(gm.Games, g.Name) - } - - g.RemoveSession(session) - } + switch r { + case keyW, keyZ, keyK, keyComma: + session.Player.HandleUp() + case keyA, keyQ, keyH: + session.Player.HandleLeft() + case keyS, keyJ, keyO: + session.Player.HandleDown() + case keyD, keyL, keyE: + session.Player.HandleRight() + case keyCtrlC, keyEscape: + if g.SessionCount() == 1 { + delete(gm.Games, g.Name) } - }() + + g.RemoveSession(session) + } } - } + }() } type Game struct { @@ -20,7 +20,7 @@ const ( func handler(conn net.Conn, gm *GameManager, config *ssh.ServerConfig) { // Before use, a handshake must be performed on the incoming // net.Conn. - _, chans, reqs, err := ssh.NewServerConn(conn, config) + sshConn, chans, reqs, err := ssh.NewServerConn(conn, config) if err != nil { fmt.Println("Failed to handshake with new client") return @@ -66,7 +66,7 @@ func handler(conn net.Conn, gm *GameManager, config *ssh.ServerConfig) { } }(requests) - gm.HandleChannel <- channel + gm.HandleNewChannel(channel, sshConn.User()) } } @@ -102,7 +102,6 @@ func main() { // Create the GameManager gm := NewGameManager() - go gm.Run() fmt.Printf( "Listening on port %s for SSH and port %s for HTTP...\n", |