forked from mamu/spacepanel_aggregator
76 lines
1.1 KiB
Go
76 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type State int
|
|
|
|
const (
|
|
Unknown = State(iota)
|
|
Outdated
|
|
Close
|
|
Open
|
|
)
|
|
|
|
var ColorMap = map[State]string{
|
|
Unknown: "#000000",
|
|
Outdated: "#0000ff",
|
|
Close: "#ff0000",
|
|
Open: "#00ff00",
|
|
}
|
|
|
|
type Space struct {
|
|
State State
|
|
URL string
|
|
}
|
|
|
|
type StateAggregator struct {
|
|
ledList map[int][]*Space
|
|
mtx sync.RWMutex
|
|
}
|
|
|
|
func NewStateAggregator(spaceList map[string][]string) *StateAggregator {
|
|
s := &StateAggregator{
|
|
ledList: make(map[int][]*Space),
|
|
}
|
|
|
|
i := 0
|
|
for _, spaceUrls := range spaceList {
|
|
for _, url := range spaceUrls {
|
|
space := &Space{
|
|
URL: url,
|
|
}
|
|
|
|
go StartPollWorker(space)
|
|
s.ledList[i] = append(s.ledList[i], space)
|
|
}
|
|
i++
|
|
}
|
|
|
|
return s
|
|
}
|
|
|
|
func GetBestStateFromList(spaces []*Space) State {
|
|
state := Unknown
|
|
for _, space := range spaces {
|
|
if space.State > state {
|
|
state = space.State
|
|
}
|
|
}
|
|
|
|
return state
|
|
}
|
|
|
|
func (s *StateAggregator) GetLedStates() []string {
|
|
var states []string
|
|
|
|
s.mtx.RLock()
|
|
for _, spaceList := range s.ledList {
|
|
states = append(states, ColorMap[GetBestStateFromList(spaceList)])
|
|
}
|
|
s.mtx.RUnlock()
|
|
|
|
return states
|
|
}
|