X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=r3-netstatus%2Fmain.go;h=6f53ac3bd64b80a2c750cc39905473d5a5d7d49e;hb=4c36e4d9f491d1f75295e7c8a3c31e5aaa59acc8;hp=8e6610dff2bec6c0a11c4c8ea0ba2c3a8490fd4d;hpb=7a1d5c204fd7670740daa7fad05958a1266cb50a;p=svn42.git diff --git a/r3-netstatus/main.go b/r3-netstatus/main.go index 8e6610d..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 ) //------- @@ -46,23 +47,47 @@ func composeMessage(present, locked, shut bool, who string, ts int64) string { IfThenElseStr(present, "Somebody is present!" , "Everybody left."), IfThenElseStr(locked, "locked","unlocked"), IfThenElseStr(shut, "shut","ajar"), - IfThenElseStr(who == "","", " by " + who), + 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") + 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.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 + 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 @@ -70,19 +95,21 @@ func EventToXMPP(ps *pubsub.PubSub, xmpp_presence_events_chan_ chan <- interface 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.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) @@ -91,16 +118,23 @@ func main() { 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") + } + } }