Stephen McQuay
fb0e6d92d7
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).
58 lines
1.2 KiB
Go
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
|
|
}
|