more cosmetic changes
[svn42.git] / r3-webstatus-spaceapi / spaceapi / spaceapi.go
index 7e08819..4162295 100644 (file)
@@ -10,61 +10,161 @@ const max_num_events int = 4
 
 type SpaceInfo map[string]interface{}
 
-func (nsi SpaceInfo) UpdateSensorData(what, where, value string) {
-       if nsi["sensors"] == nil {
-               sensorlist := make([]SpaceInfo, 1)
-               sensorlist[0] = SpaceInfo{what: SpaceInfo{where: value}}
-               nsi["sensors"] = sensorlist
-       } else {
-               sensorlist, ok := nsi["sensors"].([]SpaceInfo) //type assertion (panics if false)
-               if ok {
-                       for _, sensor := range sensorlist {
-                               if sensor[what] != nil {
-                                       sensorinfo, ok2 := sensor[what].(SpaceInfo)
-                                       if ok2 {
-                                               sensorinfo[where] = value
-                                               return
-                                       } else {
-                                               panic("Wrong Type of sensorinfo: Should never happen")
-                                       }
-                               }
-                       }
-                       //else
-                       nsi["sensors"] = append(sensorlist, SpaceInfo{what: SpaceInfo{where: value}})
-               } else {
-                       panic("Wrong Type of sensorlist: Should never happen")
-               }
+type SpaceDoorLockSensor struct {
+       value       bool
+    location    string
+    name        string
+    description string
+}
+
+type SpaceDoorAjarSensor struct {
+       value       bool
+    location    string
+    name        string
+    description string
+}
+
+func MakeTempSensor(name, where, unit string, value float64) SpaceInfo {
+    listofwhats := make([]SpaceInfo, 1)
+    listofwhats[0] = SpaceInfo{
+               "value":    value,
+               "unit":     unit,
+               "location": where,
+               "name":     name,
+               "description": ""}
+    return SpaceInfo{"temperature": listofwhats}
+}
+
+func MakeTempCSensor(name, where string, value float64) SpaceInfo {
+    return MakeTempSensor(name,where,"\u00b0C",value)
+}
+
+func MakeIlluminationSensor(name, where, unit string, value int64) SpaceInfo {
+    listofwhats := make([]SpaceInfo, 1)
+    listofwhats[0] = SpaceInfo{
+               "value":    value,
+               "unit":     unit,
+               "location": where,
+               "name":     name,
+               "description": ""}
+    return SpaceInfo{"ext_illumination": listofwhats}
+}
+
+func MakePowerConsumptionSensor(name, where, unit string, value int64) SpaceInfo {
+    listofwhats := make([]SpaceInfo, 1)
+    listofwhats[0] = SpaceInfo{
+               "value":    value,
+               "unit":     unit,
+               "location": where,
+               "name":     name,
+               "description": ""}
+    return SpaceInfo{"power_consumption": listofwhats}
+}
+
+func MakeNetworkConnectionsSensor(name, where, nettype string, value, machines int64) SpaceInfo {
+    listofwhats := make([]SpaceInfo, 1)
+    listofwhats[0] = SpaceInfo{
+               "value":    value,
+        "type":     nettype,
+        "machines": machines,
+               "location": where,
+               "name":     name,
+               "description": ""}
+    return SpaceInfo{"network_connections": listofwhats}
+}
+
+func MakeMemberCountSensor(name, where string, value int64) SpaceInfo {
+    listofwhats := make([]SpaceInfo, 1)
+    listofwhats[0] = SpaceInfo{
+               "value":    value,
+               "location": where,
+               "name":     name,
+               "description": ""}
+    return SpaceInfo{"total_member_count": listofwhats}
+}
+
+func MakeDoorLockSensor(name, where string, value bool) SpaceInfo {
+    listofwhats := make([]SpaceInfo, 1)
+    listofwhats[0] = SpaceInfo{
+               "value":    value,
+               "location": where,
+               "name":     name,
+               "description": ""}
+    return SpaceInfo{"door_locked": listofwhats}
+}
+
+func MakeDoorAjarSensor(name, where string, value bool) SpaceInfo {
+    listofwhats := make([]SpaceInfo, 1)
+    listofwhats[0] = SpaceInfo{
+               "value":    value,
+               "location": where,
+               "name":     name,
+               "description": ""}
+    return SpaceInfo{"ext_door_ajar": listofwhats}
+}
+
+func (nsi SpaceInfo) MergeInSensor(sensorinfo SpaceInfo) {
+    if nsi["sensors"] == nil {
+        nsi["sensors"] = SpaceInfo{}
+        //~ listofwhats := make([]SpaceInfo, 1)
+        //~ listofwhats[0] = sensortype.(SpaceInfo)
+               //~ sensorobj := SpaceInfo{what: listofwhats}
+               //~ nsi["sensors"] = sensorobj
        }
+    sensorobj := nsi["sensors"].(SpaceInfo)
+    for what, subsensorobjlist := range sensorinfo {
+        if sensorobj[what] == nil {
+            sensorobj[what] = subsensorobjlist
+        } else {
+            existingsensorobjslist := sensorobj[what].([]SpaceInfo)
+            for _, newsensorobj := range subsensorobjlist.([]SpaceInfo) {
+                foundandsubstituted := false
+                for i:=0; i< len(existingsensorobjslist); i++ {
+                    if existingsensorobjslist[i]["name"] == newsensorobj["name"] {
+                        existingsensorobjslist[i] = newsensorobj
+                        foundandsubstituted = true
+                    }
+                }
+                if foundandsubstituted == false {
+                    sensorobj[what] = append(sensorobj[what].([]SpaceInfo), newsensorobj)
+                    //note that we do not change existingsensorobjslist here but directly sensorobj[what] !!
+                    //the implications being that, if we have several newsensorobj in the list:
+                    //  a) optimisation: we only check them against the existing ones and spare ourselves the work of checking a newsensorobj's name against a just added other newsensorobjs's name
+                    //  b) if the array sensorinfo[what] has several objects with the same name, nsi["sensors"] will also end up with these name conflicts
+                }
+            }
+        }
+    }
 }
 
-func (nsi SpaceInfo) AddSpaceContactInfo(phone, irc, email, ml, jabber string) SpaceInfo {
+func (nsi SpaceInfo) AddSpaceContactInfo(phone, irc, email, ml, jabber, issuemail string) SpaceInfo {
        nsi["contact"] = SpaceInfo{
                "phone":  phone,
                "email":  email,
                "ml":     ml,
-               "jabber": jabber}
+               "jabber": jabber,
+        "issue_mail": issuemail}
+    nsi["issue_report_channels"] = [3]string{"issue_mail","email","ml"}
        return nsi
 }
 
-func (nsi SpaceInfo) AddSpaceFeed(name, mimetype, url string) SpaceInfo {
-       newfeed := SpaceInfo{"name": name, "type": mimetype, "url": url}
+func (nsi SpaceInfo) AddSpaceFeed(feedtype, url string) SpaceInfo {
+       newfeed := SpaceInfo{"url": url}
        if nsi["feeds"] == nil {
-               feedlist := make([]SpaceInfo, 1)
-               feedlist[0] = newfeed
-               nsi["feeds"] = feedlist
+        nsi["feeds"] = SpaceInfo{feedtype: newfeed}
        } else {
-               feedlist, ok := nsi["feeds"].([]SpaceInfo) //type assertion (panics if false)
+               feedobj, ok := nsi["feeds"].(SpaceInfo) //type assertion (panics if false)
                if ok {
-                       nsi["feeds"] = append(feedlist, newfeed)
+            feedobj[feedtype] = newfeed
                } else {
-                       panic("Wrong Type of feedlist: Should never happen")
+                       panic("Wrong Type of feedobj: Should never happen")
                }
        }
        return nsi
 }
 
 func (nsi SpaceInfo) AddSpaceEvent(name, eventtype, extra string) SpaceInfo {
-       newevent := SpaceInfo{"name": name, "type": eventtype, "t": time.Now().Unix(), "extra": extra}
+       newevent := SpaceInfo{"name": name, "type": eventtype, "timestamp": time.Now().Unix(), "extra": extra}
        if nsi["events"] == nil {
                eventlist := make([]SpaceInfo, 1)
                eventlist[0] = newevent
@@ -85,12 +185,12 @@ func (nsi SpaceInfo) AddSpaceEvent(name, eventtype, extra string) SpaceInfo {
 
 func (nsi SpaceInfo) AddSpaceAddress(address string) SpaceInfo {
        nsi["address"] = address
-       return nsi
-}
-
-func (nsi SpaceInfo) AddSpaceLatLon(lat float64, lon float64) SpaceInfo {
-       nsi["lat"] = lat
-       nsi["lon"] = lon
+    if nsi["location"] != nil {
+        location, ok := nsi["location"].(SpaceInfo)
+        if ok {
+            location["address"] = address
+        }
+    }
        return nsi
 }
 
@@ -98,9 +198,15 @@ func (nsi SpaceInfo) SetStatus(open bool, status string) {
        nsi["status"] = status
        nsi["open"] = open
        nsi["lastchange"] = time.Now().Unix()
+    state, ok := nsi["state"].(SpaceInfo)
+    if ok {
+        state["message"] = status
+        state["open"] = open
+        state["lastchange"] = nsi["lastchange"]
+    }
 }
 
-func NewSpaceInfo(space string, url string, logo string, open_icon string, closed_icon string) SpaceInfo {
+func NewSpaceInfo(space string, url string, logo string, open_icon string, closed_icon string, lat float64, lon float64) SpaceInfo {
        nsi := map[string]interface{}{
                "api":        "0.13",
                "space":      space,
@@ -108,9 +214,22 @@ func NewSpaceInfo(space string, url string, logo string, open_icon string, close
                "logo":       logo,
                "open":       false,
                "lastchange": time.Now().Unix(),
-               "icon": map[string]interface{}{
-                       "open":   open_icon,
-                       "closed": closed_icon}}
+               "icon":       SpaceInfo{
+            "open":     open_icon,
+            "closed":   closed_icon,
+        },
+        "state":       SpaceInfo{
+            "open":      false,
+            "lastchange":time.Now().Unix(),
+            "icon":     SpaceInfo{
+                "open":     open_icon,
+                "closed":   closed_icon},
+            },
+        "location":   SpaceInfo{
+            "lat":      lat,
+            "lon":      lon},
+        "contact" :   SpaceInfo {},
+    }
        return nsi
 }