Implement random startup/runtime status, cosmetic fixes

* Implement random startup status from array in config
* Implement random runtime status from array in config
* Implement runtime status rotation
* Remove noecho option from config and from code
* Use separate goroutine to set statuses
This commit is contained in:
eleksir
2023-08-17 09:48:57 -07:00
parent ce9561b488
commit 8a67a91ffb
5 changed files with 163 additions and 30 deletions

107
lib.go
View File

@@ -67,7 +67,7 @@ func sigHandler() {
// readConfig читает и валидирует конфиг, а также выставляет некоторые default-ы, если значений для параметров в конфиге
// нет.
func readConfig() { //nolint:gocognit
func readConfig() { //nolint:gocognit,gocyclo
configLoaded := false
executablePath, err := os.Executable()
@@ -228,6 +228,26 @@ func readConfig() { //nolint:gocognit
// Если sampleConfig.Jabber.Password не задан, то авторизации не будет
// Если sampleConfig.Jabber.Sasl не задан, то авторизация происходит через NickServ
// Если sampleConfig.Jabber.BanPhrasesEnable не задан, то он false
// Если список фраз, с которыми банят пустой, то вносим в него одну позицию с пустой строкой
if len(sampleConfig.Jabber.BanPhrases) == 0 {
sampleConfig.Jabber.BanPhrases[0] = ""
}
// Если список фраз с которыми стартует бот пустой, вносим в него 1 запись с пустой строкой
if len(sampleConfig.Jabber.StartupStatus) == 0 {
sampleConfig.Jabber.StartupStatus[0] = ""
}
// Если список статусов, с которыми работает бот пустой, вносим в него 1 запись с пустой строкой
if len(sampleConfig.Jabber.RuntimeStatus.Text) == 0 {
sampleConfig.Jabber.RuntimeStatus.Text[0] = ""
}
// Если 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")
@@ -471,16 +491,7 @@ func establishConnection() {
go joinMuc(room)
}
if _, err := talk.SendPresence(
xmpp.Presence{ //nolint:exhaustruct
Status: "Ready to chat",
},
); err != nil {
log.Infof("Unable to send presence to jabber server: %s", err)
gTomb.Kill(err)
return
}
go RotateStatus("")
lastActivity = time.Now().Unix()
connecting = false
@@ -568,17 +579,9 @@ func joinMuc(room string) {
// Вот теперь точно можно слать статус.
log.Infof("Joined to MUC: %s", room)
if _, err := talk.SendPresence(
xmpp.Presence{ //nolint:exhaustruct
To: room,
Status: "Ready to chat",
},
); err != nil {
log.Infof("Unable to send presence to MUC %s: %s", room, err)
gTomb.Kill(err)
go RotateStatus(room)
return
}
return
}
// probeServerLiveness проверяет живость соединения с сервером. Для многих серверов обязательная штука, без которой
@@ -759,4 +762,66 @@ func probeMUCLiveness() { //nolint:gocognit
}
}
// RotateStatus периодически изменяет статус бота в MUC-е согласно настройкам из кофига.
func RotateStatus(room string) {
defer gTomb.Done()
for {
select {
case <-gTomb.Dying():
return
default:
// TODO: Переделать на ticker-ы
totalSleepTime := time.Duration(config.Jabber.RuntimeStatus.RotationTime) * time.Second
totalSleepTime += time.Duration(config.Jabber.RuntimeStatus.RotationSplayTime) * time.Second
for {
status := randomPhrase(config.Jabber.RuntimeStatus.Text)
log.Debugf("Set status for MUC: %s to: %s", room, status)
var p xmpp.Presence
if room != "" {
p = xmpp.Presence{ //nolint:exhaustruct
To: room,
Status: status,
}
} else {
p = xmpp.Presence{ //nolint:exhaustruct
Status: status,
}
}
if _, err := talk.SendPresence(p); err != nil {
log.Infof("Unable to send presence to MUC %s: %s", room, err)
gTomb.Kill(err)
return
}
// Если мы не хотим ротировать, то цикл нам тут не нужен, просто выходим.
if config.Jabber.RuntimeStatus.RotationTime == 0 {
gTomb.Done()
return
}
time.Sleep(totalSleepTime)
}
}
}
}
// randomPhrase Выдаёт одну рандомную фразу из даденного списка фраз.
func randomPhrase(list []string) string {
phrase := ""
if listLen := len(list); listLen > 0 {
phrase = list[rand.Intn(listLen)] //nolint:gosec
}
return phrase
}
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */