draftbot/cube.go

82 lines
1.7 KiB
Go

package draftbot
import (
"encoding/json"
"io/ioutil"
"net/http"
"strings"
"git.fromouter.space/mcg/draft"
"git.fromouter.space/mcg/draft/mlp"
)
func loadCube(cubeURL string) ([]draft.Card, error) {
// Fetch document
resp, err := http.Get(cubeURL)
if err != nil {
return nil, err
}
respBytes, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
if err != nil {
return nil, err
}
// Each line is a card ID
cardids := strings.Split(string(respBytes), "\n")
cards := make([]draft.Card, 0)
// Convert to draft.Card
for _, cardid := range cardids {
cardid := strings.TrimSpace(cardid)
if len(cardid) < 1 {
// Skip empty lines
continue
}
cards = append(cards, draft.Card{ID: cardid})
}
return cards, nil
}
// I8PCubeConfig is an external JSON doc with the I8PCube pack seeding schema and card list
type I8PCubeConfig struct {
Schema mlp.I8PSchema
ProblemPackSize int
Cards map[mlp.I8PType][]string
}
// ToCube creates a I8PCube from the config
func (cfg *I8PCubeConfig) ToCube() (*mlp.I8PCube, error) {
// Load cards from given list
var err error
pool := make(mlp.I8PPool)
for typ, cardids := range cfg.Cards {
pool[typ], err = mlp.LoadCardList(cardids, true)
if err != nil {
return nil, err
}
}
// Make cube and return it
return mlp.MakeI8PCube(pool, cfg.Schema, cfg.ProblemPackSize), nil
}
func loadI8PCube(cubeURL string) (*mlp.I8PCube, error) {
// Fetch document
resp, err := http.Get(cubeURL)
if err != nil {
return nil, err
}
// Deserialize response to JSON object
var cubeconf I8PCubeConfig
err = json.NewDecoder(resp.Body).Decode(&cubeconf)
resp.Body.Close()
if err != nil {
return nil, err
}
// Create cube from config
return cubeconf.ToCube()
}