| 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 |
| } |