server/protocol.go
Stephen McQuay fb0e6d92d7 Sorted out extra load
turns out we were never exiting the loop even when all bots left. Games now
shut down when there ever has been bots and they all leave (or are killed,
I think).
2013-09-04 23:23:05 -07:00

58 lines
1.2 KiB
Go

package main
import (
"bitbucket.org/hackerbots/bot"
"code.google.com/p/go.net/websocket"
"errors"
)
func Negociate(ws *websocket.Conn, id string, width, height float64) (*bot.Config, error) {
var err error
err = websocket.JSON.Send(ws, bot.NewIdRequest(id))
if err != nil {
return nil, errors.New("generic server error")
}
var clientid bot.ClientID
err = websocket.JSON.Receive(ws, &clientid)
if err != nil {
return nil, errors.New("could not parse id")
}
if v, msg := clientid.Valid(); !v {
websocket.JSON.Send(
ws,
bot.NewFailure(msg),
)
return nil, errors.New(msg)
}
gameParam := bot.NewGameParam(width, height)
err = websocket.JSON.Send(ws, gameParam)
if err != nil {
websocket.JSON.Send(ws, bot.NewFailure("generic server error"))
return nil, err
}
switch clientid.Type {
case "robot":
var conf bot.Config
for {
err = websocket.JSON.Receive(ws, &conf)
if err != nil {
return nil, err
}
// TODO: verify conf's type
if conf.Stats.Valid() {
_ = websocket.JSON.Send(ws, bot.NewHandshake(id, true))
break
} else {
_ = websocket.JSON.Send(ws, bot.NewHandshake(id, false))
}
}
return &conf, nil
case "spectator":
return nil, nil
}
return nil, nil
}