package main import ( "context" "encoding/json" "fmt" "net/http" ) const ( atURL = "https://at.hackerspace.pl/api" ) // atStatus is the result of queruing checkinator/at (Hackerspace presence // service). type atStatus struct { // Users is the list of present and publicly visible users. Users []atUser `json:"users"` // ESPs is the number of ESP{8266,32} devices. ESPs int `json:"esps"` // Kektops is the number of nettop “Kektop” devices. Kektops int `json:"kektops"` // Unknown is the number of unknown devices in the network. Unknown int `json:"unknown"` } type atUser struct { Login string `json:"login"` } func getAt(ctx context.Context) (*atStatus, error) { r, err := http.NewRequestWithContext(ctx, "GET", atURL, nil) if err != nil { return nil, fmt.Errorf("NewRequest(%q): %w", atURL, err) } res, err := http.DefaultClient.Do(r) if err != nil { return nil, fmt.Errorf("GET: %w", err) } defer res.Body.Close() var status atStatus if err := json.NewDecoder(res.Body).Decode(&status); err != nil { return nil, fmt.Errorf("when decoding JSON: %w", err) } return &status, nil }