+func RunXMPPBot(ps *pubsub.PubSub, zmqctx *zmq.Context) {
+ var xmpperr error
+ var bot *r3xmppbot.XmppBot
+ var xmpp_presence_events_chan chan interface{}
+ for {
+ bot, xmpp_presence_events_chan, xmpperr = r3xmppbot.NewStartedBot(xmpp_login_.jid, xmpp_login_.pass, xmpp_bot_authstring_, xmpp_state_save_dir_, true)
+ if xmpperr == nil {
+ Syslog_.Printf("Successfully (re)started XMPP Bot")
+ // subscribe before QueryLatestEventsAndInjectThem and EventToXMPP
+ psevents := ps.Sub("presence","door","buttons","updateinterval","sensors","xmppmeta")
+ QueryLatestEventsAndInjectThem(ps, zmqctx)
+ ps.Pub(EventToXMPPStartupFinished{}, "xmppmeta")
+ EventToXMPP(bot, psevents, xmpp_presence_events_chan)
+ // unsubscribe right away, since we don't known when reconnect will succeed and we don't want to block PubSub
+ ps.Unsub(psevents, "presence","door","buttons","updateinterval","sensors","xmppmeta")
+ bot.StopBot()
+ } else {
+ Syslog_.Printf("Error starting XMPP Bot: %s", xmpperr.Error())
+ }
+ time.Sleep(10 * time.Second)
+ }
+}
+