diff --git a/cmd/buny-jabber-bot/main.go b/cmd/buny-jabber-bot/main.go index a276fec..72009bd 100644 --- a/cmd/buny-jabber-bot/main.go +++ b/cmd/buny-jabber-bot/main.go @@ -5,8 +5,11 @@ import ( "fmt" "os" "os/signal" + "regexp" "time" + _ "embed" + "buny-jabber-bot/internal/jabber" "github.com/eleksir/go-xmpp" @@ -14,8 +17,13 @@ import ( "gopkg.in/tomb.v2" ) +//go:embed version +var version string + // main - фактичеcки, начало и основное тело программы. func main() { + var err error + for { var j = jabber.Jabber{ //nolint:exhaustruct SigChan: make(chan os.Signal, 1), @@ -37,6 +45,8 @@ func main() { os.Exit(1) } + j.C.Version = version + // no panic switch j.C.Loglevel { case "fatal": @@ -66,6 +76,23 @@ func main() { log.SetOutput(logfile) } + j.C.ExeName, err = os.Executable() + + if err != nil { + log.Panicf("Unable to find my executable: %s", err) + } + + // handle pricky windows case. But honestly i do not expect it runs on windows. + if regexp.MustCompile(".[Ee][Xx][Ee]$").MatchString(j.C.ExeName) { + j.C.ExeName = j.C.ExeName[:len(j.C.ExeName)-4] + + if j.C.ExeName == "" { + j.C.ExeName = "buny-jabber-bot" + } + } + + log.Infof("Service %s v%s starting", j.C.ExeName, j.C.Version) + myLogLevel := log.GetLevel() log.Warnf("Loglevel set to %v", myLogLevel) diff --git a/cmd/buny-jabber-bot/version b/cmd/buny-jabber-bot/version new file mode 100644 index 0000000..ceab6e1 --- /dev/null +++ b/cmd/buny-jabber-bot/version @@ -0,0 +1 @@ +0.1 \ No newline at end of file diff --git a/internal/jabber/commands.go b/internal/jabber/commands.go index 79cc3b4..a35948a 100644 --- a/internal/jabber/commands.go +++ b/internal/jabber/commands.go @@ -30,9 +30,10 @@ func (j *Jabber) Cmd(v xmpp.Chat) error { } if chosenOneTalks { - answer = fmt.Sprintf("%sпомощь - этот список команд\n", j.C.CSign) - answer += fmt.Sprintf("%shelp - this commands list\n", j.C.CSign) - answer += fmt.Sprintf("%srehash - reload white and black lists", j.C.CSign) + answer = fmt.Sprintf("%sпомощь - этот список команд\n", j.C.CSign) + answer += fmt.Sprintf("%shelp - this commands list\n", j.C.CSign) + answer += fmt.Sprintf("%srehash - reload white and black lists (available to bot admins only)\n", j.C.CSign) + answer += fmt.Sprintf("%sver|%sversion - prints version of software", j.C.CSign, j.C.CSign) } else { answer = "Ничем помочь не могу. Луна не светит на тебя." } @@ -88,6 +89,13 @@ func (j *Jabber) Cmd(v xmpp.Chat) error { v.Remote, ) + var msg xmpp.Chat + msg.Remote = v.Remote + msg.Type = v.Type + msg.Text = "Ничем помочь не могу. Луна не светит на тебя." + + _, err := j.Talk.Send(msg) + return err } @@ -156,6 +164,13 @@ func (j *Jabber) Cmd(v xmpp.Chat) error { v.Remote, ) + var msg xmpp.Chat + msg.Remote = v.Remote + msg.Type = v.Type + msg.Text = "Ничем помочь не могу. Луна не светит на тебя." + + _, err := j.Talk.Send(msg) + return err } @@ -202,6 +217,29 @@ func (j *Jabber) Cmd(v xmpp.Chat) error { } return err + case v.Text == fmt.Sprintf("%sver", j.C.CSign) || v.Text == fmt.Sprintf("%sversion", j.C.CSign): + var ( + answer = fmt.Sprintf("Version %s", j.C.Version) + ) + + dest := v.Remote + + if v.Type == "groupchat" { + dest = (strings.SplitN(v.Remote, "/", 2))[0] + } + + if _, err := j.Talk.Send( + xmpp.Chat{ //nolint:exhaustruct + Remote: dest, + Text: strings.TrimSpace(answer), + Type: v.Type, + }, + ); err != nil { + err = fmt.Errorf("unable to send message to %s: %w", v.Remote, err) + + return err + } + default: return err } diff --git a/internal/jabber/event_parser.go b/internal/jabber/event_parser.go index ec40801..f1f6dd2 100644 --- a/internal/jabber/event_parser.go +++ b/internal/jabber/event_parser.go @@ -121,8 +121,8 @@ func (j *Jabber) ParseEvent(e interface{}) { //nolint:maintidx,gocognit,gocyclo if id, err := j.Talk.IqVersionResponse( v, - "buny-jabber-bot", - "1.dev", + j.C.ExeName, + j.C.Version, (strings.SplitN(runtime.GOOS, "/", 2))[0], ); err != nil { err := fmt.Errorf( diff --git a/internal/jabber/types.go b/internal/jabber/types.go index b899fea..c3d119b 100644 --- a/internal/jabber/types.go +++ b/internal/jabber/types.go @@ -58,6 +58,8 @@ type MyConfig struct { CSign string `json:"csign,omitempty"` Loglevel string `json:"loglevel,omitempty"` Log string `json:"log,omitempty"` + Version string `json:"version,omitempty"` + ExeName string `json:"exe_name,omitempty"` } // MyWhiteList прототип структурки с белым списком jid-ов.