package schalter import ( "fmt" "time" "dev.sum7.eu/genofire/golang-lib/worker" "github.com/bdlm/log" "gosrc.io/xmpp" "gosrc.io/xmpp/stanza" "dev.sum7.eu/ccchb/ccchatbot/runtime" ) type Schalter struct { URL string `toml:"url"` Path string `toml:"path"` Nickname string `toml:"nickname"` Users []string `toml:"users"` MUCs []string `toml:"mucs"` Interval time.Duration `toml:"interval"` ChangeEvent []func(bool) state bool spaceName string worker *worker.Worker } func (s *Schalter) updatePresence(c xmpp.Sender) { pres := stanza.Presence{ Show: stanza.PresenceShowXA, Status: s.stateString(), } if s.state { pres.Show = stanza.PresenceShowChat } c.Send(pres) } func (s *Schalter) Start(c xmpp.Sender) { if s.Nickname == "" { s.Nickname = "ccchalter" } s.fetchState() s.updatePresence(c) for _, m := range s.MUCs { runtime.JoinMUC(c, m, s.Nickname) } log.Infof("started schalter with state: %s", s.stateString()) if s.worker == nil { s.worker = worker.NewWorker(s.Interval, s.run(c)) s.worker.Start() } else { log.Error("worker already running?") } } func (s *Schalter) run(c xmpp.Sender) func() { return func() { if s.fetchState() { for _, f := range s.ChangeEvent { f(s.state) } log.Infof("worker detect changes of status: %s", s.stateString()) } else { log.Debug("worker run, but no changes detected") } } } func (s *Schalter) XMPPChangeEvent(c xmpp.Sender) func(bool) { return func(state bool) { s.updatePresence(c) text := fmt.Sprintf("%s changed to closed", s.spaceName) if state { text = fmt.Sprintf("%s changed to open", s.spaceName) } runtime.SendText(c, s.Users, s.MUCs, text, text) } } func (s *Schalter) Close() { if s.worker != nil { s.worker.Close() } }