107 lines
2.1 KiB
Go
107 lines
2.1 KiB
Go
package hypixel
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
const BASE_URL = "https://api.hypixel.net/v2/"
|
|
const PLAYER_ENDPOINT_URL = "player?"
|
|
|
|
type PlayerResponse struct {
|
|
Success bool `json:"success"`
|
|
Cause string `json:"cause,omitempty"`
|
|
Player Player `json:"player"`
|
|
}
|
|
|
|
type HypixelApi struct {
|
|
Key APIKey
|
|
}
|
|
|
|
func NewAPI(apiKey APIKey) *HypixelApi {
|
|
return &HypixelApi{
|
|
Key: apiKey,
|
|
}
|
|
}
|
|
|
|
func (api *HypixelApi) GetPlayer(uuid string) (*Player, error) {
|
|
_, err := api.canDoRequest()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
_, err = api.GetPlayerResponse(uuid)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return nil, nil
|
|
}
|
|
|
|
func (api *HypixelApi) GetPlayerResponse(uuid string) (*PlayerResponse, error) {
|
|
_, err := api.canDoRequest()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
url := BASE_URL + PLAYER_ENDPOINT_URL + "uuid=" + uuid
|
|
|
|
req, err := http.NewRequest("GET", url, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.Header.Add("API-Key", raw_key)
|
|
|
|
playerResponse, err := api.doPlayerRequest(req)
|
|
|
|
if !playerResponse.Success {
|
|
return nil, NewSomeError(playerResponse.Cause, url)
|
|
}
|
|
|
|
return playerResponse, nil
|
|
}
|
|
|
|
func (api *HypixelApi) canDoRequest() (bool, error) {
|
|
return true, nil
|
|
if api.Key.UsesLeft < 1 {
|
|
return false, NewAPIKeyRateLimitedException(raw_key, api.Key.UsesLeft, "Key throttle")
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func (api *HypixelApi) doPlayerRequest(request *http.Request) (*PlayerResponse, error) {
|
|
res, err := http.DefaultClient.Do(request)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
usesLeft, err := strconv.Atoi(res.Header.Get("ratelimit-remaining"))
|
|
|
|
resetStr := res.Header.Get("ratelimit-reset")
|
|
resetInt, err := strconv.ParseInt(resetStr, 10, 64)
|
|
|
|
if err != nil {
|
|
log.Fatalf("Error parsing ratelimit-reset: %v", err)
|
|
}
|
|
|
|
resetTime := time.Unix(resetInt, 0)
|
|
|
|
api.Key.UsesLeft = usesLeft
|
|
api.Key.ResetDelay = resetTime.Sub(time.Now())
|
|
api.Key.TotalUses++
|
|
|
|
body, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
var playerResponse PlayerResponse
|
|
err = json.Unmarshal(body, &playerResponse)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &playerResponse, nil
|
|
}
|