X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=r3-netstatus%2Fmain.go;h=6f53ac3bd64b80a2c750cc39905473d5a5d7d49e;hb=4c36e4d9f491d1f75295e7c8a3c31e5aaa59acc8;hp=f7828b92db8ec80b8e231252cd3fdc0460c14c60;hpb=63eb752b0e125d962bcd5a4d56afb2616ab2af67;p=svn42.git diff --git a/r3-netstatus/main.go b/r3-netstatus/main.go index f7828b9..6f53ac3 100644 --- a/r3-netstatus/main.go +++ b/r3-netstatus/main.go @@ -22,6 +22,7 @@ var ( xmpp_login_ struct {jid string; pass string} xmpp_bot_authstring_ string xmpp_state_save_dir_ string + button_press_timeout_ int64 = 3600 ) //------- @@ -37,56 +38,103 @@ func init() { //------- +func IfThenElseStr(c bool, strue, sfalse string) string { + if c {return strue} else {return sfalse} +} + +func composeMessage(present, locked, shut bool, who string, ts int64) string { + return fmt.Sprintf("%s (Door is %s and %s and was last used%s at %s)", + IfThenElseStr(present, "Somebody is present!" , "Everybody left."), + IfThenElseStr(locked, "locked","unlocked"), + IfThenElseStr(shut, "shut","ajar"), + IfThenElseStr(len(who) == 0,"", " by " + who), + time.Unix(ts,0).String()) +} + func EventToXMPP(ps *pubsub.PubSub, xmpp_presence_events_chan_ chan <- interface{}) { - events := ps.Sub("presence","door","buttons") - var present, locked, shut bool = false, true, true - var who string = "Unknown" + events := ps.Sub("presence","door","buttons","updateinterval") + defer func() { + if x := recover(); x != nil { + fmt.Printf("handleIncomingXMPPStanzas: run time panic: %v", x) + ps.Unsub(events, "presence","door","buttons","updateinterval") + close(xmpp_presence_events_chan_) + } + }() + + var present, locked, shut bool = false, true, true + var last_buttonpress int64 = 0 + var who string + button_msg := "The button has been pressed ! Propably someone is bored and in need of company ! ;-)" + present_status := r3xmppbot.XMPPStatusEvent{r3xmppbot.ShowOnline,"Somebody is present"} + notpresent_status := r3xmppbot.XMPPStatusEvent{r3xmppbot.ShowNotAvailabe,"Nobody is here"} + button_status := r3xmppbot.XMPPStatusEvent{r3xmppbot.ShowFreeForChat, "The button has been pressed :-)"} + + xmpp_presence_events_chan_ <- r3xmppbot.XMPPStatusEvent{r3xmppbot.ShowNotAvailabe, "Nobody is here"} + for eventinterface := range(events) { switch event := eventinterface.(type) { case PresenceUpdate: present = event.Present - xmpp_presence_events_chan_ <- r3xmppbot.XMPPPresenceEvent{Present: present, Who: who, DoorLock: locked, DoorShut: shut, Button: false} + xmpp_presence_events_chan_ <- r3xmppbot.XMPPMsgEvent{Msg: composeMessage(present, locked, shut, who, event.Ts), DistributeLevel: r3xmppbot.R3OnlineOnlyInfo, RememberAsStatus: true} + if present { + xmpp_presence_events_chan_ <- present_status + } else { + xmpp_presence_events_chan_ <- notpresent_status + } case DoorCommandEvent: - who = event.Who - xmpp_presence_events_chan_ <- fmt.Sprintln("DoorCommand: ",event.Command, "using", event.Using, "by", event.Who, event.Ts) + if len(event.Who) > 0 && len(event.Using) > 0 { + who = fmt.Sprintf("%s (%s)",event.Who, event.Using) + } else { + who = event.Who + } + xmpp_presence_events_chan_ <- fmt.Sprintln("DoorCommand:",event.Command, "using", event.Using, "by", event.Who, time.Unix(event.Ts,0)) case DoorStatusUpdate: locked = event.Locked shut = event.Shut - xmpp_presence_events_chan_ <- fmt.Sprintln("DoorStatus locked:",event.Locked, "shut:", event.Shut, event.Ts) + xmpp_presence_events_chan_ <- r3xmppbot.XMPPMsgEvent{Msg: composeMessage(present, locked, shut, who, event.Ts), DistributeLevel: r3xmppbot.R3DebugInfo, RememberAsStatus: true} case ButtonPressUpdate: - xmpp_presence_events_chan_ <- r3xmppbot.XMPPPresenceEvent{Present: present, Who: who, DoorLock: locked, DoorShut: shut, Button: true} + xmpp_presence_events_chan_ <- r3xmppbot.XMPPMsgEvent{Msg: button_msg, DistributeLevel: r3xmppbot.R3OnlineOnlyInfo} + xmpp_presence_events_chan_ <- button_status + last_buttonpress = event.Ts + case TimeTick: + if present && last_buttonpress > 0 && time.Now().Unix() - last_buttonpress > button_press_timeout_ { + xmpp_presence_events_chan_ <- present_status + last_buttonpress = 0 + } } } } func main() { - var err error + var xmpperr error var bot *r3xmppbot.XmppBot - bot, xmpp_presence_events_chan_, err = r3xmppbot.NewStartedBot(xmpp_login_.jid, xmpp_login_.pass, xmpp_bot_authstring_, xmpp_state_save_dir_, true) - if err != nil { - fmt.Println(err) - return - } - defer bot.StopBot() - + bot, xmpp_presence_events_chan_, xmpperr = r3xmppbot.NewStartedBot(xmpp_login_.jid, xmpp_login_.pass, xmpp_bot_authstring_, xmpp_state_save_dir_, true) + newlinequeue := make(chan string, 1) ps := pubsub.New(1) //~ brn := brain.New() defer close(newlinequeue) defer ps.Shutdown() //~ defer brn.Shutdown() - - ticker := time.NewTicker(time.Duration(7) * time.Minute) + go EventToWeb(ps) - go EventToXMPP(ps, xmpp_presence_events_chan_) - go ReadFromUSocket(presence_socket_path_, newlinequeue) - for { - select { - case e := <-newlinequeue: - ParseSocketInputLine(e, ps) //, brn) - case <-ticker.C: - ps.Pub(TimeTick{time.Now().Unix()}, "publishjson") - } - } + if xmpperr == nil { + defer bot.StopBot() + go EventToXMPP(ps, xmpp_presence_events_chan_) + } else { + fmt.Println(xmpperr) + fmt.Println("XMPP Bot disabled") + } + go ReadFromUSocket(presence_socket_path_, newlinequeue) + ticker := time.NewTicker(time.Duration(7) * time.Minute) + + for { + select { + case e := <-newlinequeue: + ParseSocketInputLine(e, ps) //, brn) + case <-ticker.C: + ps.Pub(TimeTick{time.Now().Unix()}, "updateinterval") + } + } }