diff options
Diffstat (limited to 'internal/fabric/fabric.go')
| -rw-r--r-- | internal/fabric/fabric.go | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/internal/fabric/fabric.go b/internal/fabric/fabric.go new file mode 100644 index 0000000..3e52e6f --- /dev/null +++ b/internal/fabric/fabric.go @@ -0,0 +1,79 @@ +package fabric + +import ( + "encoding/json" + "fmt" + "net/http" + "time" +) + +const ( + apiBase = "https://meta.fabricmc.net/v2" + userAgent = "benson/2.0 (github.com/hachem-wtf/benson)" +) + +type GameVersion struct { + Version string `json:"version"` + Stable bool `json:"stable"` +} + +type LoaderVersion struct { + Version string `json:"version"` + Stable bool `json:"stable"` +} + +type InstallerVersion struct { + Version string `json:"version"` + Stable bool `json:"stable"` +} + +type Client struct { + http *http.Client +} + +func NewClient() *Client { + return &Client{http: &http.Client{Timeout: 30 * time.Second}} +} + +func (c *Client) get(path string, out any) error { + req, err := http.NewRequest(http.MethodGet, apiBase+path, nil) + if err != nil { + return err + } + req.Header.Set("User-Agent", userAgent) + + resp, err := c.http.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("fabric: %s returned %s", path, resp.Status) + } + return json.NewDecoder(resp.Body).Decode(out) +} + +func (c *Client) GameVersions() ([]GameVersion, error) { + var versions []GameVersion + if err := c.get("/versions/game", &versions); err != nil { + return nil, err + } + return versions, nil +} + +func (c *Client) LoaderVersions() ([]LoaderVersion, error) { + var versions []LoaderVersion + if err := c.get("/versions/loader", &versions); err != nil { + return nil, err + } + return versions, nil +} + +func (c *Client) InstallerVersions() ([]InstallerVersion, error) { + var versions []InstallerVersion + if err := c.get("/versions/installer", &versions); err != nil { + return nil, err + } + return versions, nil +} |
