Skip to content

Commit

Permalink
generate unique id using timestamp + random bits
Browse files Browse the repository at this point in the history
- used rs/xid package
- change Players to use id as key
- players with same name can now play concurrently
  • Loading branch information
seeratsekhon committed May 25, 2018
1 parent ce31a2f commit 3677f09
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 19 deletions.
5 changes: 2 additions & 3 deletions server/arena/arena.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,13 @@ func (a *Arena) CollisionDetection() {
}

// AddPlayer adds a new player to the arena
func (a *Arena) AddPlayer(n string, ws *websocket.Conn) error {
func (a *Arena) AddPlayer(id string, n string, ws *websocket.Conn) error {
color, err := a.generateRandomColor()
if err != nil {
return err
}

position := a.generateCoordinate(models.PlayerRadius)
a.Players[n] = models.CreatePlayer(n, position, color, ws)
a.Players[id] = models.CreatePlayer(id, n, position, color, ws)
return nil
}

Expand Down
37 changes: 22 additions & 15 deletions server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"time"

"github.com/gorilla/websocket"
"github.com/rs/xid"
"github.com/ubclaunchpad/bumper/server/arena"
"github.com/ubclaunchpad/bumper/server/models"
)
Expand All @@ -29,6 +30,11 @@ var upgrader = websocket.Upgrader{
},
}

func genUniqueId() string {
id := xid.New()
return id.String()
}

// ServeHTTP handles a connection from a client
// Upgrades client's connection to WebSocket and listens for messages
func (g *Game) ServeHTTP(w http.ResponseWriter, r *http.Request) {
Expand All @@ -40,12 +46,13 @@ func (g *Game) ServeHTTP(w http.ResponseWriter, r *http.Request) {
defer ws.Close()

name := r.URL.Query().Get("name")
id := genUniqueId()
for {
var msg models.Message
err := ws.ReadJSON(&msg)
if err != nil {
log.Printf("%v\n", err)
delete(g.Arena.Players, name)
delete(g.Arena.Players, id)
break
}

Expand All @@ -58,15 +65,15 @@ func (g *Game) ServeHTTP(w http.ResponseWriter, r *http.Request) {
continue
}

err := g.Arena.AddPlayer(name, ws)
err := g.Arena.AddPlayer(id, name, ws)
if err != nil {
log.Printf("Error adding player:\n%v", err)
continue
}

initialMsg := models.Message{
Type: "initial",
Data: name,
Data: id,
}
MessageChannel <- initialMsg

Expand All @@ -77,11 +84,11 @@ func (g *Game) ServeHTTP(w http.ResponseWriter, r *http.Request) {
log.Printf("%v\n", err)
continue
}
if _, ok := g.Arena.Players[name]; ok {
if _, ok := g.Arena.Players[id]; ok {
if kh.IsPressed {
g.Arena.Players[name].KeyDownHandler(kh.Key)
g.Arena.Players[id].KeyDownHandler(kh.Key)
} else {
g.Arena.Players[name].KeyUpHandler(kh.Key)
g.Arena.Players[id].KeyUpHandler(kh.Key)
}
}

Expand Down Expand Up @@ -119,13 +126,13 @@ func tick(g *Game) {
}

// update every client
for name := range g.Arena.Players {
p := g.Arena.Players[name]
for id := range g.Arena.Players {
p := g.Arena.Players[id]
err := p.SendJSON(&msg)
if err != nil {
log.Printf("error: %v", err)
p.Close()
delete(g.Arena.Players, name)
delete(g.Arena.Players, id)
}
}
}
Expand All @@ -137,8 +144,8 @@ func messageEmitter(g *Game) {

switch msg.Type {
case "initial":
name := msg.Data.(string)
p := g.Arena.Players[name]
id := msg.Data.(string)
p := g.Arena.Players[id]

initalMsg := models.Message{
Type: "initial",
Expand All @@ -153,23 +160,23 @@ func messageEmitter(g *Game) {
if err != nil {
log.Printf("error: %v", err)
p.Close()
delete(g.Arena.Players, name)
delete(g.Arena.Players, id)
}

case "death":
name := msg.Data.(string)
id := msg.Data.(string)
deathMsg := models.Message{
Type: "death",
Data: nil,
}

p := g.Arena.Players[name]
p := g.Arena.Players[id]
err := p.SendJSON(&deathMsg)
if err != nil {
log.Printf("error: %v", err)
p.Close()
}
delete(g.Arena.Players, name)
delete(g.Arena.Players, id)

default:
log.Println("Unknown message type to emit")
Expand Down
4 changes: 3 additions & 1 deletion server/models/player.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ type KeysPressed struct {
// Player contains data and state about a player's object
type Player struct {
Name string `json:"name"`
ID string `json:"id"`
Position Position `json:"position"`
Velocity Velocity `json:"-"`
Color string `json:"color"`
Expand All @@ -48,9 +49,10 @@ type Player struct {

// CreatePlayer constructs an instance of player with
// given position, color, and WebSocket connection
func CreatePlayer(n string, p Position, c string, ws *websocket.Conn) *Player {
func CreatePlayer(id string, n string, p Position, c string, ws *websocket.Conn) *Player {
return &Player{
Name: n,
ID: id,
Position: p,
Velocity: Velocity{},
Color: c,
Expand Down

0 comments on commit 3677f09

Please sign in to comment.