Compare commits
3 Commits
5b730c9684
...
b126052cb6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b126052cb6 | ||
|
|
637d7778e3 | ||
|
|
ddd5e46dbf |
48
Makefile
48
Makefile
@@ -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
12
buny.go
@@ -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
|
||||||
|
|||||||
@@ -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
21
lib.go
@@ -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
24
main.go
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user