67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
package osuapi
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// Client is an osu! API client that is able to make API requests.
|
|
type Client struct {
|
|
client *http.Client
|
|
key string
|
|
}
|
|
|
|
// NewClient generates a new Client based on an API key.
|
|
func NewClient(key string) *Client {
|
|
c := &Client{&http.Client{}, key}
|
|
return c
|
|
}
|
|
|
|
func (c Client) makerq(endpoint string, queryString url.Values) ([]byte, error) {
|
|
queryString.Set("k", c.key)
|
|
req, err := http.NewRequest("GET", "https://osu.ppy.sh/api/"+endpoint+"?"+queryString.Encode(), nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
// if we are rate limiting requests, then wait before making request
|
|
if requestsAvailable != nil {
|
|
<-requestsAvailable
|
|
}
|
|
resp, err := c.client.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
data, err := ioutil.ReadAll(resp.Body)
|
|
defer resp.Body.Close()
|
|
return data, err
|
|
}
|
|
|
|
type testResponse struct {
|
|
Error string `json:"error"`
|
|
}
|
|
|
|
// Test makes sure the API is working (and the API key is valid).
|
|
func (c Client) Test() error {
|
|
resp, err := c.makerq("get_user", url.Values{
|
|
"u": []string{
|
|
"2",
|
|
},
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var tr testResponse
|
|
err = json.Unmarshal(resp, &tr)
|
|
// Ignore cannot unmarshal stuff
|
|
if err != nil && err.Error() != "json: cannot unmarshal array into Go value of type osuapi.testResponse" {
|
|
return err
|
|
}
|
|
if tr.Error != "" {
|
|
return errors.New("osuapi: " + tr.Error)
|
|
}
|
|
return nil
|
|
}
|