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

25
buny.go
View File

@@ -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 := "<item affiliation='outcast' jid='" + evilJid + "'>"
@@ -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 := "<item affiliation='outcast' jid='" + evilJid + "'>"
@@ -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)

View File

@@ -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{}

View File

@@ -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)

31
lib.go
View File

@@ -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 {

15
main.go
View File

@@ -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
}
}

View File

@@ -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"`