Compare commits

..

3 Commits

5 changed files with 67 additions and 47 deletions

View File

@@ -3,38 +3,66 @@
BUILDOPTS=-ldflags="-s -w" -a -gcflags=all=-l -trimpath -pgo=auto BUILDOPTS=-ldflags="-s -w" -a -gcflags=all=-l -trimpath -pgo=auto
FILELIST=collection.go types.go globals.go lib.go event_parser.go buny.go commands.go main.go FILELIST=collection.go types.go globals.go lib.go event_parser.go buny.go commands.go main.go
BINARY=buny-jabber-bot
# На windows имя бинарника может зависеть не только от платформы, но и от выранной цели, для linux-а суффикс .exe
# не нужен
ifeq ($(OS),Windows_NT)
ifeq ($(strip $(GOOS)),)
BINARY=buny-jabber-bot.exe
endif
endif
# Если мы собираем бинарь под windows не на windows, то надо сделать бинарь с суффиксом .exe
ifeq ($(strip $(GOOS)),windows)
BINARY=buny-jabber-bot.exe
endif
# Явно определяем символ новой строки, чтобы избежать неоднозначности на windows
define IFS
endef
# Используем классические таргеты, где первый встречаемый является таргетом по-умолчанию
all: clean build all: clean build
build: build:
# Ну и дальше просто билдим бинарник средствами гошки
ifeq ($(OS),Windows_NT) ifeq ($(OS),Windows_NT)
# powershell # вариант с powershell на windows
ifeq ($(SHELL),sh.exe) ifeq ($(SHELL),sh.exe)
SET CGO_ENABLED=0 SET CGO_ENABLED=0
go build ${BUILDOPTS} -o "buny-jabber-bot" ${FILELIST} go build ${BUILDOPTS} -o ${BINARY} ${FILELIST}
else else
# jetbrains golang # вариант с jetbrains golang на windows
CGO_ENABLED=0 CGO_ENABLED=0
go build ${BUILDOPTS} -o "buny-jabber-bot" ${FILELIST} go build ${BUILDOPTS} -o ${BINARY} ${FILELIST}
endif endif
# bash/git bash # вариант с bash/git (windows) и bash (linux)
else else
CGO_ENABLED=0 go build ${BUILDOPTS} -o "buny-jabber-bot" ${FILELIST} CGO_ENABLED=0 go build ${BUILDOPTS} -o ${BINARY} ${FILELIST}
endif endif
# Удаляем бинарник средствами go
clean: clean:
go clean go clean
# Служебный таргет, для целей разработки. Обновляет завендоренные либы, брутальным образом.
upgrade: upgrade:
ifeq ($(OS),Windows_NT) ifeq ($(OS),Windows_NT)
# jetbrains golang, powershell # вариант с jetbrains golang на windows или powershell на windows
ifeq ($(SHELL),sh.exe) ifeq ($(SHELL),sh.exe)
if exist vendor del /F /S /Q vendor >nul if exist vendor del /F /S /Q vendor >nul
# git bash case # вариант с git/bash на windows
else else
RM -r vendor $(RM) -r vendor
endif endif
# вариант с bash на linux
else else
RM -r vendor $(RM) -r vendor
endif endif
go get -d -u -t ./... go get -d -u -t ./...
go mod tidy go mod tidy

12
buny.go
View File

@@ -94,8 +94,6 @@ func bunyPresense(v xmpp.Presence) error { //nolint:gocognit,gocyclo
) )
gTomb.Kill(err) gTomb.Kill(err)
continue
} }
return err return err
@@ -127,8 +125,6 @@ func bunyPresense(v xmpp.Presence) error { //nolint:gocognit,gocyclo
) )
gTomb.Kill(err) gTomb.Kill(err)
continue
} }
return err return err
@@ -164,8 +160,6 @@ func bunyPresense(v xmpp.Presence) error { //nolint:gocognit,gocyclo
) )
gTomb.Kill(err) gTomb.Kill(err)
continue
} }
return err return err
@@ -198,8 +192,6 @@ func bunyPresense(v xmpp.Presence) error { //nolint:gocognit,gocyclo
) )
gTomb.Kill(err) gTomb.Kill(err)
continue
} }
return err return err
@@ -256,8 +248,6 @@ func bunyChat(v xmpp.Chat) error {
) )
gTomb.Kill(err) gTomb.Kill(err)
continue
} }
return err return err
@@ -291,8 +281,6 @@ func bunyChat(v xmpp.Chat) error {
) )
gTomb.Kill(err) gTomb.Kill(err)
continue
} }
return err return err

View File

@@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"encoding/xml" "encoding/xml"
"fmt" "fmt"
"runtime"
"sort" "sort"
"strings" "strings"
"time" "time"
@@ -117,9 +118,9 @@ func parseEvent(e interface{}) { //nolint:maintidx,gocognit,gocyclo
if id, err := talk.IqVersionResponse( if id, err := talk.IqVersionResponse(
v, v,
"bunyPresense-jabber-bot", "buny-jabber-bot",
"1.с_чем-то", "1.dev",
"линупс", (strings.SplitN(runtime.GOOS, "/", 2))[0],
); err != nil { ); err != nil {
err := fmt.Errorf( err := fmt.Errorf(
"unable to send version info to jabber server: id=%s, err=%w", "unable to send version info to jabber server: id=%s, err=%w",

21
lib.go
View File

@@ -509,6 +509,8 @@ func establishConnection() {
log.Errorf("Try to send initial KeepAlive, got error: %s", err) log.Errorf("Try to send initial KeepAlive, got error: %s", err)
gTomb.Kill(err) gTomb.Kill(err)
return
} }
log.Info("Connected") log.Info("Connected")
@@ -544,6 +546,8 @@ func joinMuc(room string) {
log.Infof("Unable to send disco#info to MUC %s: %s", room, err) log.Infof("Unable to send disco#info to MUC %s: %s", room, err)
gTomb.Kill(err) gTomb.Kill(err)
return
} }
// Ждём, пока muc нам вернёт список фичей. // Ждём, пока muc нам вернёт список фичей.
@@ -576,6 +580,8 @@ func joinMuc(room string) {
log.Errorf("Unable to join to MUC: %s", room) log.Errorf("Unable to join to MUC: %s", room)
gTomb.Kill(err) gTomb.Kill(err)
return
} }
log.Infof("Joining to MUC: %s", room) log.Infof("Joining to MUC: %s", room)
@@ -684,7 +690,7 @@ func probeServerLiveness() { //nolint:gocognit
gTomb.Kill(err) gTomb.Kill(err)
continue return
// По-умолчанию, мы отправляем c2s пинг // По-умолчанию, мы отправляем c2s пинг
default: default:
@@ -693,7 +699,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 return
} }
serverPingTimestampTx = time.Now().Unix() serverPingTimestampTx = time.Now().Unix()
@@ -704,7 +710,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 return
} }
serverPingTimestampTx = time.Now().Unix() serverPingTimestampTx = time.Now().Unix()
@@ -717,7 +723,7 @@ func probeServerLiveness() { //nolint:gocognit
if _, err := talk.SendKeepAlive(); err != nil { if _, err := talk.SendKeepAlive(); err != nil {
gTomb.Kill(err) gTomb.Kill(err)
continue return
} }
} }
} else { // Сервер не ответил на disco#info } else { // Сервер не ответил на disco#info
@@ -726,7 +732,7 @@ func probeServerLiveness() { //nolint:gocognit
if _, err := talk.SendKeepAlive(); err != nil { if _, err := talk.SendKeepAlive(); err != nil {
gTomb.Kill(err) gTomb.Kill(err)
continue return
} }
} }
} }
@@ -768,7 +774,8 @@ func probeMUCLiveness() { //nolint:gocognit
if err := talk.PingS2S(talk.JID(), room+"/"+config.Jabber.Nick); err != nil { if err := talk.PingS2S(talk.JID(), room+"/"+config.Jabber.Nick); err != nil {
gTomb.Kill(err) gTomb.Kill(err)
continue
return
} }
}(room) }(room)
*/ */
@@ -790,6 +797,8 @@ func probeMUCLiveness() { //nolint:gocognit
if err := talk.PingS2S(talk.JID(), room); err != nil { if err := talk.PingS2S(talk.JID(), room); err != nil {
err := fmt.Errorf("unable to ping MUC %s: %w", room, err) err := fmt.Errorf("unable to ping MUC %s: %w", room, err)
gTomb.Kill(err) gTomb.Kill(err)
return
} }
}(room) }(room)
} }

24
main.go
View File

@@ -171,37 +171,31 @@ func myLoop() {
if err != nil { if err != nil {
log.Errorf("Unable to get events from server: %s", err) log.Errorf("Unable to get events from server: %s", err)
// Попробуем скрасить печальные будни generic-ошибок...
switch { switch {
// Стрим не читается, он закрылся с той стороны во время чтения // Стрим не читается, он закрылся с той стороны во время чтения
case errors.Is(err, io.EOF): case errors.Is(err, io.EOF):
err := fmt.Errorf("tcp stream closed while reading, err=%w", err) err = fmt.Errorf("tcp stream closed while reading, err=%w", err)
gTomb.Kill(err)
continue
// Пытаемся читать закрытый сокет // Пытаемся читать закрытый сокет
case errors.Is(err, net.ErrClosed): case errors.Is(err, net.ErrClosed):
err := fmt.Errorf("unable to read closed socket, err=%w", err) err = fmt.Errorf("unable to read closed socket, err=%w", err)
gTomb.Kill(err)
continue
// Не смогли записать в сокет // Не смогли записать в сокет
case errors.Is(err, net.ErrWriteToConnected): case errors.Is(err, net.ErrWriteToConnected):
err := fmt.Errorf("unable to write to socket, err=%w", err) err = fmt.Errorf("unable to write to socket, err=%w", err)
gTomb.Kill(err)
continue
// Не сетевая проблема // Не сетевая проблема
default: default:
// Это уже что-то странное. // Это уже что-то странное.
// Вероятно, ошибка парсинга xml. Собственно, баг сервера, тут мы ничего поделать не можем // Вероятно, ошибка парсинга xml. Собственно, баг сервера, тут мы ничего поделать не можем
err := fmt.Errorf("error during parsing received message, err=%w", err) err = fmt.Errorf("error during parsing received message, err=%w", err)
}
gTomb.Kill(err) gTomb.Kill(err)
continue // Не забываем выходить на ошибке :(
} return
} }
parseEvent(chat) parseEvent(chat)