first finale version
This commit is contained in:
parent
10f1fae475
commit
4640fc8406
28
README.md
28
README.md
|
@ -1,26 +1,26 @@
|
||||||
# hook2xmpp
|
# ccchatbot
|
||||||
|
|
||||||
|
|
||||||
[![pipeline status](https://dev.sum7.eu/genofire/hook2xmpp/badges/master/pipeline.svg)](https://dev.sum7.eu/genofire/hook2xmpp/pipelines)
|
[![pipeline status](https://dev.sum7.eu/ccchb/ccchatbot/badges/master/pipeline.svg)](https://dev.sum7.eu/ccchb/ccchatbot/pipelines)
|
||||||
[![coverage report](https://dev.sum7.eu/genofire/hook2xmpp/badges/master/coverage.svg)](https://dev.sum7.eu/genofire/hook2xmpp/pipelines)
|
[![coverage report](https://dev.sum7.eu/ccchb/ccchatbot/badges/master/coverage.svg)](https://dev.sum7.eu/ccchb/ccchatbot/pipelines)
|
||||||
[![Go Report Card](https://goreportcard.com/badge/dev.sum7.eu/genofire/hook2xmpp)](https://goreportcard.com/report/dev.sum7.eu/genofire/hook2xmpp)
|
[![Go Report Card](https://goreportcard.com/badge/dev.sum7.eu/ccchb/ccchatbot)](https://goreportcard.com/report/dev.sum7.eu/ccchb/ccchatbot)
|
||||||
[![GoDoc](https://godoc.org/dev.sum7.eu/genofire/hook2xmpp?status.svg)](https://godoc.org/dev.sum7.eu/genofire/hook2xmpp)
|
[![GoDoc](https://godoc.org/dev.sum7.eu/ccchb/ccchatbot?status.svg)](https://godoc.org/dev.sum7.eu/ccchb/ccchatbot)
|
||||||
|
|
||||||
|
|
||||||
## Get hook2xmpp
|
## Get ccchatbot
|
||||||
|
|
||||||
#### Download
|
#### Download
|
||||||
|
|
||||||
Latest Build binary from ci here:
|
Latest Build binary from ci here:
|
||||||
|
|
||||||
[Download All](https://dev.sum7.eu/genofire/hook2xmpp/-/jobs/artifacts/master/download/?job=build-my-project) (with config example)
|
[Download All](https://dev.sum7.eu/ccchb/ccchatbot/-/jobs/artifacts/master/download/?job=build-my-project) (with config example)
|
||||||
|
|
||||||
[Download Binary](https://dev.sum7.eu/genofire/hook2xmpp/-/jobs/artifacts/master/raw/bin/hook2xmpp?inline=false&job=build-my-project)
|
[Download Binary](https://dev.sum7.eu/ccchb/ccchatbot/-/jobs/artifacts/master/raw/bin/ccchatbot?inline=false&job=build-my-project)
|
||||||
|
|
||||||
#### Build
|
#### Build
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go get -u dev.sum7.eu/genofire/hook2xmpp
|
go get -u dev.sum7.eu/ccchb/ccchatbot
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configure
|
## Configure
|
||||||
|
@ -29,10 +29,10 @@ see `config_example.toml`
|
||||||
|
|
||||||
## Start / Boot
|
## Start / Boot
|
||||||
|
|
||||||
_/lib/systemd/system/hook2xmpp.service_ :
|
_/lib/systemd/system/ccchatbot.service_ :
|
||||||
```
|
```
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=hook2xmpp
|
Description=ccchatbot
|
||||||
After=network.target
|
After=network.target
|
||||||
# After=ejabberd.service
|
# After=ejabberd.service
|
||||||
# After=prosody.service
|
# After=prosody.service
|
||||||
|
@ -40,7 +40,7 @@ After=network.target
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
# User=notRoot
|
# User=notRoot
|
||||||
ExecStart=/opt/go/bin/hook2xmpp --config /etc/hook2xmpp.conf
|
ExecStart=/opt/go/bin/ccchatbot --config /etc/ccchatbot.conf
|
||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=5sec
|
RestartSec=5sec
|
||||||
|
|
||||||
|
@ -48,5 +48,5 @@ RestartSec=5sec
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
```
|
```
|
||||||
|
|
||||||
Start: `systemctl start hook2xmpp`
|
Start: `systemctl start ccchatbot`
|
||||||
Autostart: `systemctl enable hook2xmpp`
|
Autostart: `systemctl enable ccchatbot`
|
||||||
|
|
|
@ -7,5 +7,5 @@ password = "test"
|
||||||
|
|
||||||
[schalter]
|
[schalter]
|
||||||
url = "https://schalter.ccchb.de/spaceapi.json"
|
url = "https://schalter.ccchb.de/spaceapi.json"
|
||||||
|
interval = 5000000000
|
||||||
mucs = ["ffhb_events@conference.chat.sum7.eu","#ccchb@irc.hackint.org"]
|
mucs = ["ffhb_events@conference.chat.sum7.eu","#ccchb@irc.hackint.org"]
|
||||||
|
|
4
main.go
4
main.go
|
@ -52,7 +52,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
cm := xmpp.NewStreamManager(client, func(s xmpp.Sender) {
|
cm := xmpp.NewStreamManager(client, func(s xmpp.Sender) {
|
||||||
config.Schalter.Run(s)
|
config.Schalter.Start(s)
|
||||||
})
|
})
|
||||||
go func() {
|
go func() {
|
||||||
err := cm.Run()
|
err := cm.Run()
|
||||||
|
@ -64,6 +64,8 @@ func main() {
|
||||||
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
||||||
sig := <-sigs
|
sig := <-sigs
|
||||||
|
|
||||||
|
config.Schalter.Close()
|
||||||
|
|
||||||
runtime.LeaveAllMUCs(client)
|
runtime.LeaveAllMUCs(client)
|
||||||
|
|
||||||
log.Infof("closed by receiving: %s", sig)
|
log.Infof("closed by receiving: %s", sig)
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package schalter
|
package schalter
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"dev.sum7.eu/genofire/golang-lib/worker"
|
||||||
"github.com/bdlm/log"
|
"github.com/bdlm/log"
|
||||||
"gosrc.io/xmpp"
|
"gosrc.io/xmpp"
|
||||||
"gosrc.io/xmpp/stanza"
|
"gosrc.io/xmpp/stanza"
|
||||||
|
@ -17,8 +20,11 @@ type Schalter struct {
|
||||||
Users []string `toml:"users"`
|
Users []string `toml:"users"`
|
||||||
MUCs []string `toml:"mucs"`
|
MUCs []string `toml:"mucs"`
|
||||||
|
|
||||||
|
Interval time.Duration `toml:"interval"`
|
||||||
|
|
||||||
state bool
|
state bool
|
||||||
spaceName string
|
spaceName string
|
||||||
|
worker *worker.Worker
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Schalter) updatePresence(c xmpp.Sender) {
|
func (s *Schalter) updatePresence(c xmpp.Sender) {
|
||||||
|
@ -32,7 +38,7 @@ func (s *Schalter) updatePresence(c xmpp.Sender) {
|
||||||
c.Send(pres)
|
c.Send(pres)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Schalter) Run(c xmpp.Sender) {
|
func (s *Schalter) Start(c xmpp.Sender) {
|
||||||
if s.Nickname == "" {
|
if s.Nickname == "" {
|
||||||
s.Nickname = "ccchalter"
|
s.Nickname = "ccchalter"
|
||||||
}
|
}
|
||||||
|
@ -42,4 +48,33 @@ func (s *Schalter) Run(c xmpp.Sender) {
|
||||||
runtime.JoinMUC(c, m, s.Nickname)
|
runtime.JoinMUC(c, m, s.Nickname)
|
||||||
}
|
}
|
||||||
log.Infof("started schalter with state: %s", s.stateString())
|
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() {
|
||||||
|
s.updatePresence(c)
|
||||||
|
text := fmt.Sprintf("%s changed to closed", s.state)
|
||||||
|
if s.state {
|
||||||
|
text = fmt.Sprintf("%s changed to open", s.state)
|
||||||
|
}
|
||||||
|
runtime.SendText(c, s.Users, s.MUCs, text, text)
|
||||||
|
log.Infof("worker detect changes of status: %s", text)
|
||||||
|
} else {
|
||||||
|
log.Debug("worker run, but no changes detected")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Schalter) Close() {
|
||||||
|
if s.worker != nil {
|
||||||
|
s.worker.Close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
package schalter
|
||||||
|
|
||||||
|
type SpaceAPI struct {
|
||||||
|
API string `json:"api"`
|
||||||
|
Space string `json:"space"`
|
||||||
|
Logo string `json:"logo"`
|
||||||
|
URL string `json:"url"`
|
||||||
|
Location struct {
|
||||||
|
Address string `json:"address,omitempty"`
|
||||||
|
Lat float64 `json:"lat"`
|
||||||
|
Lon float64 `json:"lon"`
|
||||||
|
} `json:"location"`
|
||||||
|
SpaceFed struct {
|
||||||
|
SpaceNet bool `json:"spacenet"`
|
||||||
|
Spacesaml bool `json:"spacesaml"`
|
||||||
|
SpacePhone bool `json:"spacephone"`
|
||||||
|
} `json:"spacefed,omitempty"`
|
||||||
|
Cam []string `json:"cam,omitempty"`
|
||||||
|
Stream struct {
|
||||||
|
M4 bool `json:"m4,omitempty"`
|
||||||
|
MJPEG bool `json:"mjpeg,omitempty"`
|
||||||
|
UStream bool `json:"ustream,omitempty"`
|
||||||
|
} `json:"stream,omitempty"`
|
||||||
|
State struct {
|
||||||
|
Open bool `json:"open"`
|
||||||
|
Lastchange float64 `json:"lastchange,omitempty"`
|
||||||
|
TriggerPerson string `json:"trigger_person,omitempty"`
|
||||||
|
Message string `json:"message,omitempty"`
|
||||||
|
Icon struct {
|
||||||
|
Open string `json:"open"`
|
||||||
|
Closed string `json:"closed"`
|
||||||
|
} `json:"icon,omitempty"`
|
||||||
|
} `json:"state"`
|
||||||
|
// ..
|
||||||
|
}
|
|
@ -1,6 +1,12 @@
|
||||||
package schalter
|
package schalter
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"dev.sum7.eu/genofire/golang-lib/file"
|
||||||
|
"dev.sum7.eu/genofire/golang-lib/http"
|
||||||
|
"github.com/bdlm/log"
|
||||||
|
)
|
||||||
|
|
||||||
func (s *Schalter) stateString() string {
|
func (s *Schalter) stateString() string {
|
||||||
if s.state {
|
if s.state {
|
||||||
|
@ -9,5 +15,24 @@ func (s *Schalter) stateString() string {
|
||||||
return fmt.Sprintf("%s is closed", s.spaceName)
|
return fmt.Sprintf("%s is closed", s.spaceName)
|
||||||
}
|
}
|
||||||
func (s *Schalter) fetchState() bool {
|
func (s *Schalter) fetchState() bool {
|
||||||
|
if s.Path != "" && s.URL != "" {
|
||||||
|
log.Panic("it is not possible to set path and url to ")
|
||||||
|
}
|
||||||
|
api := SpaceAPI{}
|
||||||
|
if s.Path != "" {
|
||||||
|
if err := file.ReadJSON(s.Path, &api); err != nil {
|
||||||
|
log.WithField("path", s.Path).Errorf("unable to read spaceapi from file: %s", err)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if err := http.JSONRequest(s.URL, &api); err != nil {
|
||||||
|
log.WithField("url", s.URL).Errorf("unable to http request spaceapi: %s", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
changed := api.State.Open != s.state
|
||||||
|
s.state = api.State.Open
|
||||||
|
s.spaceName = api.Space
|
||||||
|
return changed
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue