ripple-api/vendor/gopkg.in/thehowl/go-osuapi.v1/get_replay.go

58 lines
1.4 KiB
Go
Raw Normal View History

2017-01-14 17:42:10 +00:00
package osuapi
import (
"bytes"
"encoding/base64"
"encoding/json"
"errors"
"io"
"net/url"
"strconv"
)
// GetReplayOpts are the options that MUST be used to fetch a replay.
// ALL of the fields are **REQUIRED**, with an exception for UserID/Username,
// of which only one is required.
type GetReplayOpts struct {
UserID int
Username string
Mode Mode
BeatmapID int
}
type replayResponse struct {
Content string `json:"content"`
}
// GetReplay makes a get_replay request to the osu! API. Returns a reader from
// which the replay can be retrieved.
func (c Client) GetReplay(opts GetReplayOpts) (io.Reader, error) {
vals := url.Values{}
if opts.BeatmapID == 0 {
return nil, errors.New("osuapi: BeatmapID MUST be set in GetReplayOpts")
}
vals.Add("m", strconv.Itoa(int(opts.Mode)))
vals.Add("b", strconv.Itoa(opts.BeatmapID))
switch {
case opts.UserID != 0:
vals.Add("u", strconv.Itoa(opts.UserID))
vals.Add("type", "id")
case opts.Username != "":
vals.Add("u", opts.Username)
vals.Add("type", "string")
default:
return nil, errors.New("osuapi: either UserID or Username MUST be set in GetReplayOpts")
}
data, err := c.makerq("get_replay", vals)
if err != nil {
return nil, err
}
rr := replayResponse{}
err = json.Unmarshal(data, &rr)
if err != nil {
return nil, err
}
reader := bytes.NewBuffer([]byte(rr.Content))
return base64.NewDecoder(base64.StdEncoding, reader), nil
}