More lint fixes

* Correctly wrap errors
* Fix comments
* Add blank strings before continue, where it missing
* Reduce allocations
This commit is contained in:
eleksir
2023-08-06 19:02:36 -07:00
parent 267dd841a4
commit 84f7f21217
6 changed files with 82 additions and 102 deletions

17
buny.go
View File

@@ -1,7 +1,6 @@
package main package main
import ( import (
"errors"
"fmt" "fmt"
"regexp" "regexp"
"strings" "strings"
@@ -70,7 +69,7 @@ func buny(v xmpp.Presence) error { //nolint:gocognit
continue continue
} }
if re.Match([]byte(evilJid)) { if re.MatchString(evilJid) {
log.Infof("Hammer falls on %s", v.JID) log.Infof("Hammer falls on %s", v.JID)
// https://xmpp.org/extensions/xep-0045.html#ban баним вот таким сообщением // https://xmpp.org/extensions/xep-0045.html#ban баним вот таким сообщением
ban := "<item affiliation='outcast' jid='" + evilJid + "'>" ban := "<item affiliation='outcast' jid='" + evilJid + "'>"
@@ -85,12 +84,10 @@ func buny(v xmpp.Presence) error { //nolint:gocognit
"http://jabber.org/protocol/muc#admin", "http://jabber.org/protocol/muc#admin",
ban, ban,
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "unable to ban user: id=%s, err=%w",
"Unable to ban user: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
@@ -116,7 +113,7 @@ func buny(v xmpp.Presence) error { //nolint:gocognit
continue continue
} }
if re.Match([]byte(evilJid)) { if re.MatchString(evilJid) {
log.Infof("Hammer falls on %s", v.JID) log.Infof("Hammer falls on %s", v.JID)
// https://xmpp.org/extensions/xep-0045.html#ban баним вот таким сообщением // https://xmpp.org/extensions/xep-0045.html#ban баним вот таким сообщением
ban := "<item affiliation='outcast' jid='" + evilJid + "'>" ban := "<item affiliation='outcast' jid='" + evilJid + "'>"
@@ -131,12 +128,10 @@ func buny(v xmpp.Presence) error { //nolint:gocognit
"http://jabber.org/protocol/muc#admin", "http://jabber.org/protocol/muc#admin",
ban, ban,
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "unable to ban user: id=%s, err=%w",
"Unable to ban user: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)

View File

@@ -24,7 +24,7 @@ func NewCollection() *Collection {
return c return c
} }
// (collection *Collection) Get(key interface{}) (interface{}, bool) достаёт данные по заданному ключу из коллекции. // Get достаёт данные по заданному ключу из коллекции.
func (collection *Collection) Get(key interface{}) (interface{}, bool) { func (collection *Collection) Get(key interface{}) (interface{}, bool) {
obj, exists := collection.items.Load(key) obj, exists := collection.items.Load(key)
@@ -37,14 +37,14 @@ func (collection *Collection) Get(key interface{}) (interface{}, bool) {
return item.data, true return item.data, true
} }
// (collection *Collection) Set(key interface{}, value interface{}) сохраняет данные с заданным ключом в коллекцию. // Set сохраняет данные с заданным ключом в коллекцию.
func (collection *Collection) Set(key interface{}, value interface{}) { func (collection *Collection) Set(key interface{}, value interface{}) {
collection.items.Store(key, item{ collection.items.Store(key, item{
data: value, data: value,
}) })
} }
// (collection *Collection) Range(f func(key, value interface{}) bool) применяет функцию f ко всем ключам в коллекции. // Range применяет функцию f ко всем ключам в коллекции.
func (collection *Collection) Range(f func(key, value interface{}) bool) { func (collection *Collection) Range(f func(key, value interface{}) bool) {
fn := func(key, value interface{}) bool { fn := func(key, value interface{}) bool {
item := value.(item) item := value.(item)
@@ -55,12 +55,12 @@ func (collection *Collection) Range(f func(key, value interface{}) bool) {
collection.items.Range(fn) collection.items.Range(fn)
} }
// (collection *Collection) Delete(key interface{}) удаляет ключ и значение из коллекции данных. // Delete удаляет ключ и значение из коллекции данных.
func (collection *Collection) Delete(key interface{}) { func (collection *Collection) Delete(key interface{}) {
collection.items.Delete(key) collection.items.Delete(key)
} }
// (collection *Collection) Close() очищает и высвобождает ресурсы, занятые коллекцией. // Close очищает и высвобождает ресурсы, занятые коллекцией.
func (collection *Collection) Close() { func (collection *Collection) Close() {
collection.close <- struct{}{} collection.close <- struct{}{}
collection.items = sync.Map{} collection.items = sync.Map{}

View File

@@ -2,7 +2,6 @@ package main
import ( import (
"encoding/xml" "encoding/xml"
"errors"
"fmt" "fmt"
"strings" "strings"
"time" "time"
@@ -13,7 +12,8 @@ import (
"golang.org/x/exp/slices" "golang.org/x/exp/slices"
) )
func parseEvent(e interface{}) { //nolint:gocognit,gocyclo // parseEvent парсит ивенты, прилетающие из модуля xmpp (изменения presence, фразы участников, ошибки).
func parseEvent(e interface{}) { //nolint:maintidx,gocognit,gocyclo
lastServerActivity = time.Now().Unix() lastServerActivity = time.Now().Unix()
switch v := e.(type) { switch v := e.(type) {
@@ -111,12 +111,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo
xmpp.IQTypeResult, xmpp.IQTypeResult,
answer, answer,
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "unable to send version info to jabber server: id=%s, err=%w",
"Unable to send version info to jabber server: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
@@ -137,12 +135,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo
xmpp.IQTypeResult, xmpp.IQTypeResult,
"", "",
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "unable to send pong to jabber server: id=%s, err=%w",
"Unable to send pong to jabber server: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
@@ -169,12 +165,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo
xmpp.IQTypeResult, xmpp.IQTypeResult,
answer, answer,
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "unable to send last activity time to jabber server: id=%s, err=%w",
"Unable to send last activity time to jabber server: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
@@ -203,12 +197,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo
xmpp.IQTypeResult, xmpp.IQTypeResult,
answer, answer,
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "unable to send disco#info to jabber server: id=%s, err=%w",
"Unable to send disco#info to jabber server: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
@@ -235,12 +227,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo
xmpp.IQTypeError, xmpp.IQTypeError,
answer, answer,
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "unable to send disco#items to jabber server: id=%s, err=%w",
"Unable to send disco#items to jabber server: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
@@ -282,12 +272,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo
xmpp.IQTypeResult, xmpp.IQTypeResult,
answer, answer,
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "unable to send urn:xmpp:time to jabber server: id=%s, err=%w",
"Unable to send urn:xmpp:time to jabber server: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
@@ -329,12 +317,9 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo
xmpp.IQTypeError, xmpp.IQTypeError,
answer, answer,
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf("unable to send pubsub feature unimplemented to jabber server: id=%s, err=%w",
fmt.Sprintf(
"Unable to send pubsub feature unimplemented to jabber server: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
@@ -370,12 +355,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo
xmpp.IQTypeResult, xmpp.IQTypeResult,
"", "",
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "unable to send pong to jabber server: id=%s, err=%w",
"Unable to send pong to jabber server: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
@@ -460,12 +443,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo
xmpp.IQTypeError, xmpp.IQTypeError,
answer, answer,
); err != nil { ); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "unable to send set feature unimplemented to jabber server: id=%s, err=%w",
"Unable to send set feature unimplemented to jabber server: id=%s, err=%s",
id, id,
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
@@ -520,11 +501,9 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo
time.Sleep(time.Duration(config.Jabber.MucRejoinDelay) * time.Second) time.Sleep(time.Duration(config.Jabber.MucRejoinDelay) * time.Second)
if _, err := talk.JoinMUCNoHistory(iqErrorCancelNotAcceptable.By, nick); err != nil { if _, err := talk.JoinMUCNoHistory(iqErrorCancelNotAcceptable.By, nick); err != nil {
err := errors.New( err := fmt.Errorf(
fmt.Sprintf( "looks like connection to server also lost err=%w",
"Looks like connection to server also lost err=%s",
err, err,
),
) )
gTomb.Kill(err) gTomb.Kill(err)

29
lib.go
View File

@@ -2,7 +2,6 @@ package main
import ( import (
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"math/rand" "math/rand"
"os" "os"
@@ -16,7 +15,7 @@ import (
"golang.org/x/exp/slices" "golang.org/x/exp/slices"
) )
// sigHandler() Хэндлер сигналов закрывает все бд, все сетевые соединения и сваливает из приложения. // sigHandler Хэндлер сигналов закрывает все бд, все сетевые соединения и сваливает из приложения.
func sigHandler() { func sigHandler() {
log.Debug("Installing signal handler") log.Debug("Installing signal handler")
@@ -256,7 +255,7 @@ func readConfig() { //nolint:gocognit
} }
} }
// readWhitelist() читает и валидирует белые списки пользователей. // readWhitelist читает и валидирует белые списки пользователей.
func readWhitelist() { func readWhitelist() {
whitelistLoaded := false whitelistLoaded := false
executablePath, err := os.Executable() executablePath, err := os.Executable()
@@ -346,7 +345,7 @@ func readWhitelist() {
} }
} }
// readBlacklist() читает и валидирует чёрные списки пользователей. // readBlacklist читает и валидирует чёрные списки пользователей.
func readBlacklist() { func readBlacklist() {
blacklistLoaded := false blacklistLoaded := false
executablePath, err := os.Executable() executablePath, err := os.Executable()
@@ -437,7 +436,7 @@ func readBlacklist() {
} }
} }
// establishConnection() устанавливает соединение с jabber-сервером. // establishConnection устанавливает соединение с jabber-сервером.
func establishConnection() { func establishConnection() {
var err error var err error
@@ -454,6 +453,7 @@ func establishConnection() {
if err != nil { if err != nil {
gTomb.Kill(err) gTomb.Kill(err)
return return
} }
@@ -498,7 +498,7 @@ func establishConnection() {
} }
} }
// joinMuc(room string) джойнится к конференциям/каналам/комнатам в джаббере. // joinMu джойнится к конференциям/каналам/комнатам в джаббере.
func joinMuc(room string) { func joinMuc(room string) {
log.Debugf("Sending disco#info from %s to %s", talk.JID(), room) log.Debugf("Sending disco#info from %s to %s", talk.JID(), room)
@@ -581,7 +581,7 @@ func joinMuc(room string) {
} }
} }
// probeServerLiveness() проверяет живость соединения с сервером. Для многих серверов обязательная штука, без которой // probeServerLiveness проверяет живость соединения с сервером. Для многих серверов обязательная штука, без которой
// они выкидывают клиента через некоторое время неактивности. // они выкидывают клиента через некоторое время неактивности.
func probeServerLiveness() { //nolint:gocognit func probeServerLiveness() { //nolint:gocognit
defer gTomb.Done() defer gTomb.Done()
@@ -634,14 +634,13 @@ func probeServerLiveness() { //nolint:gocognit
switch { switch {
// Давненько мы не получали понгов от сервера, вероятно, соединение с сервером утеряно? // Давненько мы не получали понгов от сервера, вероятно, соединение с сервером утеряно?
case rxTimeAgo > (rxTimeout * 2): case rxTimeAgo > (rxTimeout * 2):
err := errors.New( err := fmt.Errorf( //nolint:goerr113
fmt.Sprintf( "stall connection detected. No c2s pong for %d seconds",
"Stall connection detected. No c2s pong for %d seconds",
rxTimeAgo, rxTimeAgo,
),
) )
gTomb.Kill(err) gTomb.Kill(err)
continue continue
// По-умолчанию, мы отправляем c2s пинг // По-умолчанию, мы отправляем c2s пинг
@@ -650,6 +649,7 @@ func probeServerLiveness() { //nolint:gocognit
if err := talk.PingC2S(talk.JID(), config.Jabber.Server); err != nil { if err := talk.PingC2S(talk.JID(), config.Jabber.Server); err != nil {
gTomb.Kill(err) gTomb.Kill(err)
continue continue
} }
@@ -660,6 +660,7 @@ func probeServerLiveness() { //nolint:gocognit
if err := talk.PingC2S(talk.JID(), config.Jabber.Server); err != nil { if err := talk.PingC2S(talk.JID(), config.Jabber.Server); err != nil {
gTomb.Kill(err) gTomb.Kill(err)
continue continue
} }
@@ -672,6 +673,7 @@ func probeServerLiveness() { //nolint:gocognit
if _, err := talk.SendKeepAlive(); err != nil { if _, err := talk.SendKeepAlive(); err != nil {
gTomb.Kill(err) gTomb.Kill(err)
continue continue
} }
} }
@@ -680,6 +682,7 @@ func probeServerLiveness() { //nolint:gocognit
if _, err := talk.SendKeepAlive(); err != nil { if _, err := talk.SendKeepAlive(); err != nil {
gTomb.Kill(err) gTomb.Kill(err)
continue continue
} }
} }
@@ -688,8 +691,8 @@ func probeServerLiveness() { //nolint:gocognit
} }
} }
// probeMUCLiveness() Пингует MUC-и, нужно для проверки, что клиент ещё находится в MUC-е. // probeMUCLiveness Пингует MUC-и, нужно для проверки, что клиент ещё находится в MUC-е.
func probeMUCLiveness() { func probeMUCLiveness() { //nolint:gocognit
defer gTomb.Done() defer gTomb.Done()
for { for {

15
main.go
View File

@@ -43,7 +43,6 @@ func init() {
default: default:
log.SetLevel(log.InfoLevel) log.SetLevel(log.InfoLevel)
} }
} }
func main() { func main() {
@@ -98,7 +97,7 @@ func main() {
DialTimeout: time.Duration(config.Jabber.ConnectionTimeout) * time.Second, DialTimeout: time.Duration(config.Jabber.ConnectionTimeout) * time.Second,
} }
// Через tomb попробуем попробуем сделать выход горутинок управляемым // Через tomb попробуем сделать выход горутинок управляемым
gTomb = tomb.Tomb{} gTomb = tomb.Tomb{}
// Устанавливаем соединение и гребём события, посылаемые сервером // Устанавливаем соединение и гребём события, посылаемые сервером
@@ -161,28 +160,32 @@ func myLoop() {
switch { switch {
// Стрим не читается, он закрылся с той стороны во время чтения // Стрим не читается, он закрылся с той стороны во время чтения
case errors.Is(err, io.EOF): case errors.Is(err, io.EOF):
err := errors.New("Tcp stream closed while reading") err := fmt.Errorf("tcp stream closed while reading, err=%w", err)
gTomb.Kill(err) gTomb.Kill(err)
continue continue
// Пытаемся читать закрытый сокет // Пытаемся читать закрытый сокет
case errors.Is(err, net.ErrClosed): case errors.Is(err, net.ErrClosed):
err := errors.New("Unable to read closed socket") err := fmt.Errorf("unable to read closed socket, err=%w", err)
gTomb.Kill(err) gTomb.Kill(err)
continue continue
// Не смогли записать в сокет // Не смогли записать в сокет
case errors.Is(err, net.ErrWriteToConnected): case errors.Is(err, net.ErrWriteToConnected):
err := errors.New("Unable to write to socket") err := fmt.Errorf("unable to write to socket, err=%w", err)
gTomb.Kill(err) gTomb.Kill(err)
continue continue
// Не сетевая проблема // Не сетевая проблема
default: default:
// Это уже что-то странное. // Это уже что-то странное.
// Вероятно, ошибка парсинга xml. Собственно, баг сервера, тут мы ничего поделать не можем // Вероятно, ошибка парсинга xml. Собственно, баг сервера, тут мы ничего поделать не можем
err := errors.New("error during parsing received message") err := fmt.Errorf("error during parsing received message, err=%w", err)
gTomb.Kill(err) gTomb.Kill(err)
continue continue
} }
} }

View File

@@ -25,7 +25,7 @@ type myConfig struct {
Password string `json:"password,omitempty"` Password string `json:"password,omitempty"`
Channels []string `json:"channels"` Channels []string `json:"channels"`
OutcastDomains []string `json:"outcast_domains,omitempty"` OutcastDomains []string `json:"outcast_domains,omitempty"`
} } `json:"jabber,omitempty"`
Loglevel string `json:"loglevel,omitempty"` Loglevel string `json:"loglevel,omitempty"`
Log string `json:"log,omitempty"` Log string `json:"log,omitempty"`