distribute DoorProblemEvent
[svn42.git] / go / r3-netstatus / r3xmppbot / r3xmppbot.go
index 3e6f210..293be18 100644 (file)
@@ -4,7 +4,6 @@ package r3xmppbot
 
 import (
        xmpp "code.google.com/p/goexmpp"
-    "log"
     "crypto/tls"
     "os"
     "time"
@@ -143,13 +142,13 @@ type XmppBot struct {
 func (data RealraumXmppNotifierConfig) saveTo(filepath string) () {
     fh, err := os.Create(filepath)
     if err != nil {
-        log.Println(err)
+        Syslog_.Println(err)
         return
     }
     defer fh.Close()
     enc := json.NewEncoder(fh)
     if err = enc.Encode(&data); err != nil {
-        log.Println(err)
+        Syslog_.Println(err)
         return
     }
 }
@@ -157,13 +156,13 @@ func (data RealraumXmppNotifierConfig) saveTo(filepath string) () {
 func (data RealraumXmppNotifierConfig) loadFrom(filepath string) () {
     fh, err := os.Open(filepath)
     if err != nil {
-        log.Println(err)
+        Syslog_.Println(err)
         return
     }
     defer fh.Close()
     dec := json.NewDecoder(fh)
     if err = dec.Decode(&data); err != nil {
-        log.Println(err)
+        Syslog_.Println(err)
         return
     }
     for to, jiddata := range data  {
@@ -185,13 +184,16 @@ func (botdata *XmppBot) handleEventsforXMPP(xmppout chan <- xmpp.Stanza, presenc
 
     defer func() {
         if x := recover(); x != nil {
-            log.Printf("handleEventsforXMPP: run time panic: %v", x)
+            Syslog_.Printf("handleEventsforXMPP: run time panic: %v", x)
+            //FIXME: signal that xmpp bot has crashed
         }
     }()
 
        for {
                select {
-               case pe := <-presence_events:
+               case pe, pe_still_open := <-presence_events:
+            if ! pe_still_open { break }
+            Debug_.Printf("handleEventsforXMPP<-presence_events: %T %+v", pe, pe)
             switch pec := pe.(type) {
                 case xmpp.Stanza:
                     xmppout <- pec
@@ -219,11 +221,20 @@ func (botdata *XmppBot) handleEventsforXMPP(xmppout chan <- xmpp.Stanza, presenc
                     break
                 }
 
-               case je := <-jabber_events:
+               case je, je_still_open := <-jabber_events:
+            if ! je_still_open { break }
+            Debug_.Printf("handleEventsforXMPP<-jabber_events: %T %+v", je, je)
             simple_jid := removeJIDResource(je.JID)
             jid_data, jid_in_map := botdata.realraum_jids_[simple_jid]
+
+            //send status if requested, even if user never changed any settings and thus is not in map
+            if last_status_msg != nil && je.StatusNow {
+                xmppout <-  botdata.makeXMPPMessage(je.JID, last_status_msg, nil)
+            }
+
             if jid_in_map {
-                if last_status_msg != nil && (je.StatusNow || (! jid_data.Online && je.Online && jid_data.Wants == R3OnlineOnlyWithRecapInfo) ) {
+                //if R3OnlineOnlyWithRecapInfo, we want a status update when coming online
+                if last_status_msg != nil && ! jid_data.Online && je.Online && jid_data.Wants == R3OnlineOnlyWithRecapInfo {
                     xmppout <-  botdata.makeXMPPMessage(je.JID, last_status_msg, nil)
                 }
                 jid_data.Online = je.Online
@@ -249,7 +260,6 @@ func removeJIDResource(jid string) string {
 
 func (botdata *XmppBot) isAuthenticated(jid string) bool {
     authtime, in_map := botdata.jid_lastauthtime_[jid]
-    //~ log.Println("isAuthenticated", in_map, authtime, time.Now().Unix(), auth_timeout_, time.Now().Unix() - authtime > auth_timeout_)
     return in_map && time.Now().Unix() - authtime < botdata.auth_timeout_
 }
 
@@ -263,7 +273,6 @@ func (botdata *XmppBot) handleIncomingMessageDialog(inmsg xmpp.Message, xmppout
         return
     }
     bodytext :=inmsg.Body.Chardata
-    //~ log.Println("Message Body:", bodytext)
     if botdata.isAuthenticated(inmsg.GetHeader().From) {
         switch bodytext {
             case "on", "*on*":
@@ -316,7 +325,7 @@ func (botdata *XmppBot) handleIncomingXMPPStanzas(xmppin <- chan xmpp.Stanza, xm
 
     defer func() {
         if x := recover(); x != nil {
-            log.Printf("handleIncomingXMPPStanzas: run time panic: %v", x)
+            Syslog_.Printf("handleIncomingXMPPStanzas: run time panic: %v", x)
             close(jabber_events)
         }
     }()
@@ -367,8 +376,6 @@ func NewStartedBot(loginjid, loginpwd, password, state_save_dir string, insecure
 
     botdata.config_file_ = path.Join(state_save_dir, "r3xmpp."+removeJIDResource(loginjid)+".json")
 
-    //~ log.Println(botdata.config_file_)
-
     //~ logger := &StdLogger{}
     //~ xmpp.Debug = logger
     //~ xmpp.Info = logger
@@ -381,18 +388,19 @@ func NewStartedBot(loginjid, loginpwd, password, state_save_dir string, insecure
     client_jid.Set(botdata.my_jid_)
     botdata.xmppclient_, err = xmpp.NewClient(client_jid, botdata.my_login_password_, nil)
     if err != nil {
-        log.Println("Error connecting to xmpp server", err)
+        Syslog_.Println("Error connecting to xmpp server", err)
         return nil, nil, err
     }
 
     err = botdata.xmppclient_.StartSession(true, &xmpp.Presence{})
     if err != nil {
-        log.Println("'Error StartSession:", err)
+        Syslog_.Println("'Error StartSession:", err)
         return nil, nil, err
     }
 
     roster := xmpp.Roster(botdata.xmppclient_)
     for _, entry := range roster {
+        Debug_.Print(entry)
         if entry.Subscription == "from" {
             botdata.xmppclient_.Out <- botdata.makeXMPPPresence(entry.Jid, "subscribe", "","")
         }