Implement help, помощь, rehash commands, restrict presence collection precedure

This commit is contained in:
eleksir
2023-09-03 14:52:35 +03:00
parent 91eac5cb6d
commit ca384b5165
7 changed files with 322 additions and 54 deletions

123
lib.go
View File

@@ -2,11 +2,13 @@ package main
import (
"encoding/json"
"errors"
"fmt"
"math/rand"
"os"
"path/filepath"
"reflect"
"strings"
"syscall"
"time"
@@ -68,14 +70,19 @@ func sigHandler() {
// readConfig читает и валидирует конфиг, а также выставляет некоторые default-ы, если значений для параметров в конфиге
// нет.
func readConfig() { //nolint:gocognit,gocyclo
configLoaded := false
executablePath, err := os.Executable()
func readConfig() error { //nolint:gocognit,gocyclo
var (
err error
executablePath string
configLoaded = false
)
executablePath, err = os.Executable()
if err != nil {
log.Errorf("Unable to get current executable path: %s", err)
err := fmt.Errorf("unable to get current executable path: %w", err)
os.Exit(1)
return err
}
configJSONPath := fmt.Sprintf("%s/data/config.json", filepath.Dir(executablePath))
@@ -210,8 +217,7 @@ func readConfig() { //nolint:gocognit,gocyclo
}
if sampleConfig.Jabber.Nick == "" {
log.Errorf("Jabber nick is not defined in config, quitting")
os.Exit(1)
return errors.New("jabber nick is not defined in config, quitting") //nolint:goerr113
}
if sampleConfig.Jabber.Resource == "" {
@@ -227,13 +233,15 @@ func readConfig() { //nolint:gocognit,gocyclo
}
// Если sampleConfig.Jabber.Password не задан, то авторизации не будет
// Если sampleConfig.Jabber.Sasl не задан, то авторизация происходит через NickServ
// Если sampleConfig.Jabber.BanPhrasesEnable не задан, то он false
// Если не задано ни одного мастера, то бот сам себе мастер
if len(sampleConfig.Jabber.BotMasters) == 0 {
sampleConfig.Jabber.BotMasters[0] = sampleConfig.Jabber.User
}
// Если список фраз, с которыми банят пустой, то вносим в него одну позицию с пустой строкой
if len(sampleConfig.Jabber.BanPhrases) == 0 {
sampleConfig.Jabber.BanPhrases[0] = ""
// Нам бот нужен в каких-то чат-румах, а не "просто так"
if len(sampleConfig.Jabber.Channels) < 1 {
return errors.New("no jabber channels/rooms defined in config, quitting") //nolint:goerr113
}
// Если список фраз с которыми стартует бот пустой, вносим в него 1 запись с пустой строкой
@@ -249,10 +257,15 @@ func readConfig() { //nolint:gocognit,gocyclo
// Если sampleConfig.Jabber.RuntimeStatus.RotationTime не задан, то он равен 0
// Если sampleConfig.Jabber.RuntimeStatus.RotationSplayTime не задан, то он равен 0
// Нам бот нужен в каких-то чат-румах, а не "просто так"
if len(sampleConfig.Jabber.Channels) < 1 {
log.Errorf("No jabber channels/rooms defined in config, quitting")
os.Exit(1)
// Если sampleConfig.Jabber.BanPhrasesEnable не задан, то он false
// Если список фраз, с которыми банят пустой, то вносим в него одну позицию с пустой строкой
if len(sampleConfig.Jabber.BanPhrases) == 0 {
sampleConfig.Jabber.BanPhrases[0] = ""
}
if sampleConfig.CSign == "" {
sampleConfig.CSign = "!"
}
if sampleConfig.Loglevel == "" {
@@ -271,19 +284,26 @@ func readConfig() { //nolint:gocognit,gocyclo
}
if !configLoaded {
log.Error("Config was not loaded! Refusing to start.")
os.Exit(1)
return errors.New("config was not loaded!") //nolint:goerr113
}
return err //nolint:wrapcheck
}
// readWhitelist читает и валидирует белые списки пользователей.
func readWhitelist() {
whitelistLoaded := false
executablePath, err := os.Executable()
func readWhitelist() error {
var (
whitelistLoaded = false
err error
executablePath string
)
executablePath, err = os.Executable()
if err != nil {
log.Errorf("Unable to get current executable path: %s", err)
os.Exit(1)
err = fmt.Errorf("unable to get current executable path: %w", err)
return err
}
whitelistJSONPath := fmt.Sprintf("%s/data/whitelist.json", filepath.Dir(executablePath))
@@ -360,21 +380,26 @@ func readWhitelist() {
}
if !whitelistLoaded {
log.Error("Whitelist was not loaded! Refusing to start.")
os.Exit(1)
return errors.New("whitelist was not loaded!") //nolint:goerr113
}
return err
}
// readBlacklist читает и валидирует чёрные списки пользователей.
func readBlacklist() {
blacklistLoaded := false
executablePath, err := os.Executable()
func readBlacklist() error {
var (
blacklistLoaded = false
err error
executablePath string
)
executablePath, err = os.Executable()
if err != nil {
log.Errorf("Unable to get current executable path: %s", err)
err = fmt.Errorf("unable to get current executable path: %w", err)
os.Exit(1)
return err
}
whitelistJSONPath := fmt.Sprintf("%s/data/blacklist.json", filepath.Dir(executablePath))
@@ -451,10 +476,10 @@ func readBlacklist() {
}
if !blacklistLoaded {
log.Error("Blacklist was not loaded! Refusing to start.")
os.Exit(1)
return errors.New("blacklist was not loaded!")
}
return err
}
// establishConnection устанавливает соединение с jabber-сервером.
@@ -582,7 +607,7 @@ func joinMuc(room string) {
go RotateStatus(room)
// Время прoверить участников на предмет злобности
// Время проверить участников на предмет злобности
namesInterface, present := roomPresences.Get(room)
// Если room есть в списке presence-ов, то фигачим. room там должен быть, просто обязан.
@@ -855,4 +880,32 @@ func interfaceToStringSlice(iface interface{}) []string {
return mySlice
}
// getRealJIDfromNick достаёт из запомненных presence-ов по даденному nick-у real jid с resource-ом. Nick должен
// содержать имя конфы, откуда участник.
func getRealJIDfromNick(fullNick string) string {
var p xmpp.Presence
room := (strings.SplitN(fullNick, "/", 2))[0]
// Достанем presence участника
presenceJSONInterface, present := roomPresences.Get(room)
// Никого нет дома
if !present {
return ""
}
presenceJSONStrings := interfaceToStringSlice(presenceJSONInterface)
for _, presepresenceJSONString := range presenceJSONStrings {
_ = json.Unmarshal([]byte(presepresenceJSONString), &p)
if p.From == fullNick {
return p.JID
}
}
return ""
}
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */