package main import ( "bitbucket.org/hackerbots/bot" "code.google.com/p/go.net/websocket" "errors" ) type Failure struct { Reason string `json:"reason"` Type string `json:"type"` } func NewFailure(reason string) *Failure { return &Failure{ Reason: reason, Type: "failure", } } 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 servr 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, 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, 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 }