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 }