diff --git a/buny.go b/buny.go index 102c89d..8afac37 100644 --- a/buny.go +++ b/buny.go @@ -1,7 +1,6 @@ package main import ( - "errors" "fmt" "regexp" "strings" @@ -70,7 +69,7 @@ func buny(v xmpp.Presence) error { //nolint:gocognit continue } - if re.Match([]byte(evilJid)) { + if re.MatchString(evilJid) { log.Infof("Hammer falls on %s", v.JID) // https://xmpp.org/extensions/xep-0045.html#ban баним вот таким сообщением ban := "" @@ -85,12 +84,10 @@ func buny(v xmpp.Presence) error { //nolint:gocognit "http://jabber.org/protocol/muc#admin", ban, ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to ban user: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf( + "unable to ban user: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) @@ -116,7 +113,7 @@ func buny(v xmpp.Presence) error { //nolint:gocognit continue } - if re.Match([]byte(evilJid)) { + if re.MatchString(evilJid) { log.Infof("Hammer falls on %s", v.JID) // https://xmpp.org/extensions/xep-0045.html#ban баним вот таким сообщением ban := "" @@ -131,12 +128,10 @@ func buny(v xmpp.Presence) error { //nolint:gocognit "http://jabber.org/protocol/muc#admin", ban, ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to ban user: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf( + "unable to ban user: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) diff --git a/collection.go b/collection.go index d99613e..9ec783a 100644 --- a/collection.go +++ b/collection.go @@ -24,7 +24,7 @@ func NewCollection() *Collection { return c } -// (collection *Collection) Get(key interface{}) (interface{}, bool) достаёт данные по заданному ключу из коллекции. +// Get достаёт данные по заданному ключу из коллекции. func (collection *Collection) Get(key interface{}) (interface{}, bool) { obj, exists := collection.items.Load(key) @@ -37,14 +37,14 @@ func (collection *Collection) Get(key interface{}) (interface{}, bool) { return item.data, true } -// (collection *Collection) Set(key interface{}, value interface{}) сохраняет данные с заданным ключом в коллекцию. +// Set сохраняет данные с заданным ключом в коллекцию. func (collection *Collection) Set(key interface{}, value interface{}) { collection.items.Store(key, item{ data: value, }) } -// (collection *Collection) Range(f func(key, value interface{}) bool) применяет функцию f ко всем ключам в коллекции. +// Range применяет функцию f ко всем ключам в коллекции. func (collection *Collection) Range(f func(key, value interface{}) bool) { fn := func(key, value interface{}) bool { item := value.(item) @@ -55,12 +55,12 @@ func (collection *Collection) Range(f func(key, value interface{}) bool) { collection.items.Range(fn) } -// (collection *Collection) Delete(key interface{}) удаляет ключ и значение из коллекции данных. +// Delete удаляет ключ и значение из коллекции данных. func (collection *Collection) Delete(key interface{}) { collection.items.Delete(key) } -// (collection *Collection) Close() очищает и высвобождает ресурсы, занятые коллекцией. +// Close очищает и высвобождает ресурсы, занятые коллекцией. func (collection *Collection) Close() { collection.close <- struct{}{} collection.items = sync.Map{} diff --git a/event_parser.go b/event_parser.go index 522ead1..18859d7 100644 --- a/event_parser.go +++ b/event_parser.go @@ -2,7 +2,6 @@ package main import ( "encoding/xml" - "errors" "fmt" "strings" "time" @@ -13,7 +12,8 @@ import ( "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() switch v := e.(type) { @@ -111,12 +111,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo xmpp.IQTypeResult, answer, ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to send version info to jabber server: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf( + "unable to send version info to jabber server: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) @@ -137,12 +135,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo xmpp.IQTypeResult, "", ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to send pong to jabber server: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf( + "unable to send pong to jabber server: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) @@ -169,12 +165,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo xmpp.IQTypeResult, answer, ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to send last activity time to jabber server: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf( + "unable to send last activity time to jabber server: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) @@ -203,12 +197,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo xmpp.IQTypeResult, answer, ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to send disco#info to jabber server: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf( + "unable to send disco#info to jabber server: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) @@ -235,12 +227,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo xmpp.IQTypeError, answer, ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to send disco#items to jabber server: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf( + "unable to send disco#items to jabber server: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) @@ -282,12 +272,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo xmpp.IQTypeResult, answer, ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to send urn:xmpp:time to jabber server: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf( + "unable to send urn:xmpp:time to jabber server: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) @@ -329,12 +317,9 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo xmpp.IQTypeError, answer, ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to send pubsub feature unimplemented to jabber server: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf("unable to send pubsub feature unimplemented to jabber server: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) @@ -370,12 +355,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo xmpp.IQTypeResult, "", ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to send pong to jabber server: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf( + "unable to send pong to jabber server: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) @@ -460,12 +443,10 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo xmpp.IQTypeError, answer, ); err != nil { - err := errors.New( - fmt.Sprintf( - "Unable to send set feature unimplemented to jabber server: id=%s, err=%s", - id, - err, - ), + err := fmt.Errorf( + "unable to send set feature unimplemented to jabber server: id=%s, err=%w", + id, + err, ) gTomb.Kill(err) @@ -520,11 +501,9 @@ func parseEvent(e interface{}) { //nolint:gocognit,gocyclo time.Sleep(time.Duration(config.Jabber.MucRejoinDelay) * time.Second) if _, err := talk.JoinMUCNoHistory(iqErrorCancelNotAcceptable.By, nick); err != nil { - err := errors.New( - fmt.Sprintf( - "Looks like connection to server also lost err=%s", - err, - ), + err := fmt.Errorf( + "looks like connection to server also lost err=%w", + err, ) gTomb.Kill(err) diff --git a/lib.go b/lib.go index 295155a..8339160 100644 --- a/lib.go +++ b/lib.go @@ -2,7 +2,6 @@ package main import ( "encoding/json" - "errors" "fmt" "math/rand" "os" @@ -16,7 +15,7 @@ import ( "golang.org/x/exp/slices" ) -// sigHandler() Хэндлер сигналов закрывает все бд, все сетевые соединения и сваливает из приложения. +// sigHandler Хэндлер сигналов закрывает все бд, все сетевые соединения и сваливает из приложения. func sigHandler() { log.Debug("Installing signal handler") @@ -256,7 +255,7 @@ func readConfig() { //nolint:gocognit } } -// readWhitelist() читает и валидирует белые списки пользователей. +// readWhitelist читает и валидирует белые списки пользователей. func readWhitelist() { whitelistLoaded := false executablePath, err := os.Executable() @@ -346,7 +345,7 @@ func readWhitelist() { } } -// readBlacklist() читает и валидирует чёрные списки пользователей. +// readBlacklist читает и валидирует чёрные списки пользователей. func readBlacklist() { blacklistLoaded := false executablePath, err := os.Executable() @@ -437,7 +436,7 @@ func readBlacklist() { } } -// establishConnection() устанавливает соединение с jabber-сервером. +// establishConnection устанавливает соединение с jabber-сервером. func establishConnection() { var err error @@ -454,6 +453,7 @@ func establishConnection() { if err != nil { gTomb.Kill(err) + return } @@ -498,7 +498,7 @@ func establishConnection() { } } -// joinMuc(room string) джойнится к конференциям/каналам/комнатам в джаббере. +// joinMu джойнится к конференциям/каналам/комнатам в джаббере. func joinMuc(room string) { 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 defer gTomb.Done() @@ -634,14 +634,13 @@ func probeServerLiveness() { //nolint:gocognit switch { // Давненько мы не получали понгов от сервера, вероятно, соединение с сервером утеряно? case rxTimeAgo > (rxTimeout * 2): - err := errors.New( - fmt.Sprintf( - "Stall connection detected. No c2s pong for %d seconds", - rxTimeAgo, - ), + err := fmt.Errorf( //nolint:goerr113 + "stall connection detected. No c2s pong for %d seconds", + rxTimeAgo, ) gTomb.Kill(err) + continue // По-умолчанию, мы отправляем c2s пинг @@ -650,6 +649,7 @@ func probeServerLiveness() { //nolint:gocognit if err := talk.PingC2S(talk.JID(), config.Jabber.Server); err != nil { gTomb.Kill(err) + continue } @@ -660,6 +660,7 @@ func probeServerLiveness() { //nolint:gocognit if err := talk.PingC2S(talk.JID(), config.Jabber.Server); err != nil { gTomb.Kill(err) + continue } @@ -672,6 +673,7 @@ func probeServerLiveness() { //nolint:gocognit if _, err := talk.SendKeepAlive(); err != nil { gTomb.Kill(err) + continue } } @@ -680,6 +682,7 @@ func probeServerLiveness() { //nolint:gocognit if _, err := talk.SendKeepAlive(); err != nil { gTomb.Kill(err) + continue } } @@ -688,8 +691,8 @@ func probeServerLiveness() { //nolint:gocognit } } -// probeMUCLiveness() Пингует MUC-и, нужно для проверки, что клиент ещё находится в MUC-е. -func probeMUCLiveness() { +// probeMUCLiveness Пингует MUC-и, нужно для проверки, что клиент ещё находится в MUC-е. +func probeMUCLiveness() { //nolint:gocognit defer gTomb.Done() for { diff --git a/main.go b/main.go index 8129ffa..99ec052 100644 --- a/main.go +++ b/main.go @@ -43,7 +43,6 @@ func init() { default: log.SetLevel(log.InfoLevel) } - } func main() { @@ -98,7 +97,7 @@ func main() { DialTimeout: time.Duration(config.Jabber.ConnectionTimeout) * time.Second, } - // Через tomb попробуем попробуем сделать выход горутинок управляемым + // Через tomb попробуем сделать выход горутинок управляемым gTomb = tomb.Tomb{} // Устанавливаем соединение и гребём события, посылаемые сервером @@ -161,28 +160,32 @@ func myLoop() { switch { // Стрим не читается, он закрылся с той стороны во время чтения 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) + continue // Пытаемся читать закрытый сокет 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) + continue // Не смогли записать в сокет 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) + continue // Не сетевая проблема default: // Это уже что-то странное. // Вероятно, ошибка парсинга xml. Собственно, баг сервера, тут мы ничего поделать не можем - err := errors.New("error during parsing received message") + err := fmt.Errorf("error during parsing received message, err=%w", err) gTomb.Kill(err) + continue } } diff --git a/types.go b/types.go index 0baabda..c5d5faf 100644 --- a/types.go +++ b/types.go @@ -25,7 +25,7 @@ type myConfig struct { Password string `json:"password,omitempty"` Channels []string `json:"channels"` OutcastDomains []string `json:"outcast_domains,omitempty"` - } + } `json:"jabber,omitempty"` Loglevel string `json:"loglevel,omitempty"` Log string `json:"log,omitempty"`