hudly/hypixel/api.go
2024-10-22 18:49:14 -06:00

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
}