More lint fixes
* Correctly wrap errors * Fix comments * Add blank strings before continue, where it missing * Reduce allocations
This commit is contained in:
25
buny.go
25
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 := "<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)
|
||||
|
||||
@@ -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{}
|
||||
|
||||
101
event_parser.go
101
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)
|
||||
|
||||
31
lib.go
31
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 {
|
||||
|
||||
15
main.go
15
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
|
||||
}
|
||||
}
|
||||
|
||||
2
types.go
2
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"`
|
||||
|
||||
Reference in New Issue
Block a user