| package main |
| |
| import ( |
| "context" |
| "time" |
| |
| "code.hackerspace.pl/hscloud/hswaw/site/calendar" |
| "github.com/golang/glog" |
| ) |
| |
| const ( |
| openDayWeekday = time.Thursday |
| openDayHour = 18 |
| ) |
| |
| // SpaceAPIResponse, per https://spaceapi.io/ - kinda. Mostly rewritten from |
| // old implementation, someone should update this to use the official schema. |
| type SpaceAPIResponse struct { |
| API string `json:"api"` |
| Space string `json:"space"` |
| Logo string `json:"logo"` |
| URL string `json:"url"` |
| Location SpaceAPILocation `json:"location"` |
| State SpaceAPIState `json:"state"` |
| Contact map[string]string `json:"contact"` |
| IssueReportChannels []string `json:"issue_report_channels"` |
| Projects []string `json:"projects"` |
| Feeds map[string]SpaceAPIFeed `json:"feeds"` |
| Sensors map[string][]SpaceAPISensor `json:"sensors"` |
| } |
| |
| type SpaceAPILocation struct { |
| Latitude float64 `json:"lat"` |
| Longitude float64 `json:"lon"` |
| Address string `json:"address"` |
| } |
| |
| type SpaceAPIState struct { |
| Open bool `json:"open"` |
| Message string `json:"message"` |
| Icon struct { |
| Open string `json:"open"` |
| Closed string `json:"closed"` |
| } `json:"icon"` |
| } |
| |
| type SpaceAPIFeed struct { |
| Type string `json:"type"` |
| URL string `json:"url"` |
| } |
| |
| type SpaceAPISensor struct { |
| Value int `json:"value"` |
| Names []string `json:"names"` |
| } |
| |
| func generateSpaceAPIResponse(ctx context.Context) SpaceAPIResponse { |
| state := SpaceAPIState{} |
| state.Icon.Open = "https://static.hackerspace.pl/img/status-open-small.png" |
| state.Icon.Closed = "https://static.hackerspace.pl/img/status-closed-small.png" |
| |
| location, _ := time.LoadLocation("Europe/Warsaw") |
| now := time.Now().In(location) |
| hour, _, _ := now.Clock() |
| |
| peopleNowPresent := SpaceAPISensor{} |
| atState, err := getAt(ctx) |
| if err != nil { |
| glog.Errorf("Failed to get checkinator status: %v", err) |
| } else { |
| peopleNowPresent.Names = make([]string, len(atState.Users)) |
| for i, u := range atState.Users { |
| peopleNowPresent.Names[i] = u.Login |
| } |
| peopleNowPresent.Value = len(peopleNowPresent.Names) |
| } |
| |
| if peopleNowPresent.Value > 0 { |
| state.Open = true |
| } |
| |
| if state.Open && now.Weekday() == openDayWeekday && hour >= openDayHour { |
| state.Message = "open for public" |
| } else { |
| state.Message = "members only" |
| } |
| |
| res := SpaceAPIResponse{ |
| API: "0.13", |
| Space: "Warsaw Hackerspace", |
| Logo: "https://static.hackerspace.pl/img/syrenka-black.png", |
| URL: "https://hackerspace.pl", |
| Location: SpaceAPILocation{ |
| Latitude: 52.24160, |
| Longitude: 20.98485, |
| Address: "ul. Wolność 2A, 01-018 Warszawa, Poland", |
| }, |
| State: state, |
| Contact: map[string]string{ |
| "irc": "irc://irc.libera.chat/#hswaw", |
| "twitter": "@hackerspacepl", |
| "facebook": "hackerspacepl", |
| "ml": "waw@lists.hackerspace.pl", |
| }, |
| IssueReportChannels: []string{"irc"}, |
| Projects: []string{ |
| "https://wiki.hackerspace.pl/projects", |
| }, |
| Feeds: map[string]SpaceAPIFeed{ |
| "blog": SpaceAPIFeed{ |
| Type: "atom", |
| URL: feedsURLs["blog"], |
| }, |
| "calendar": SpaceAPIFeed{ |
| Type: "ical", |
| URL: calendar.EventsURL, |
| }, |
| "wiki": SpaceAPIFeed{ |
| Type: "rss", |
| URL: "https://wiki.hackerspace.pl/feed.php", |
| }, |
| }, |
| Sensors: map[string][]SpaceAPISensor{ |
| "people_now_present": []SpaceAPISensor{peopleNowPresent}, |
| }, |
| } |
| |
| return res |
| } |