// Games func (db *dbImpl) startGame(ai1, ai2 aiID, init botapi.InitialBoard) (gameID, error) { var gID gameID err := db.Update(func(tx *bolt.Tx) error { b := tx.Bucket(GameBucket) msg, s, err := capnp.NewMessage(capnp.SingleSegment(nil)) if err != nil { return err } r, err := botapi.NewRootReplay(s) if err != nil { return err } idNum, err := b.NextSequence() if err != nil { return err } gID = gameID(strconv.FormatUint(idNum, 10)) r.SetGameId(string(gID)) r.SetInitial(init) data, err := msg.Marshal() if err != nil { return err } return b.Put([]byte(gID), data) }) return gID, err }
func addReplayRound(orig botapi.Replay, round botapi.Replay_Round) (*capnp.Message, error) { newMsg, seg, err := capnp.NewMessage(capnp.SingleSegment(nil)) if err != nil { return nil, err } newReplay, err := botapi.NewRootReplay(seg) if err != nil { return nil, err } gid, err := orig.GameId() if err != nil { return nil, err } if err := newReplay.SetGameId(gid); err != nil { return nil, err } initBoard, err := orig.Initial() if err != nil { return nil, err } if err := newReplay.SetInitial(initBoard); err != nil { return nil, err } origRounds, err := orig.Rounds() if err != nil { return nil, err } rounds, _ := botapi.NewReplay_Round_List(seg, int32(origRounds.Len())+1) for i := 0; i < origRounds.Len(); i++ { if err := rounds.Set(i, origRounds.At(i)); err != nil { return nil, err } } if err := rounds.Set(rounds.Len()-1, round); err != nil { return nil, err } newReplay.SetRounds(rounds) return newMsg, nil }