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 }