diff --git a/Design.txt b/Design.txt
index 2b1975d..de078cc 100644
--- a/Design.txt
+++ b/Design.txt
@@ -1,12 +1,5 @@
Oсобенности реализации клиентской части.
-Общие положения
-------------------------------------------------------------------------------------------------------------------------
-
-Nick для room-ов един и не может задаваться на per-conference основе. На этом завязаны отсылка ping-ов и определение
-pong-ов, как минимум. Хотя формально джойниться можно с любым ником :) но что-то не хочется потом распутывать этот
-клубок.
-
XEP-0410 MUC Self-Ping (Schrödinger's Chat)
------------------------------------------------------------------------------------------------------------------------
diff --git a/README.md b/README.md
index 8dbc01b..140b1f3 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,17 @@
# Buny Jabber Bot
-Простой бот, работающий по протоколу xmpp. Его задача - банить абьюзеров чата.
-
-Этот бот автоматизирует уборку человеческой грязи. Самый важный вопрос, который следует себе задать перед его
-использованием - а не забаню ли я кого-то лишнего?
+
+
+ |
+Простой бот, работающий по протоколу xmpp. Его задача - банить абьюзеров чата. При его
+создании не стояло задачи сделать что-то красивое в архитектурном или каком-то другм плане. |
+
+
+| Этот бот автоматизирует уборку человеческой грязи. Самый важный вопрос, который следует себе
+задать перед его использованием - а не забаню ли я кого-то лишнего?
+ |
+
+
## Что он может?
@@ -11,12 +19,12 @@
работает по классическим механикам (шифрованный канал связи, без возможности коммуникации в незашифрованном виде),
без поддержки механизма start tls. (Что-то в гошке или на стороне сервера при выборе StartTLS не работает.)
* Имеет возможность заносить пользователей в бан-лист, согласно заданным в чёрном списке правилам:
- - по совпадению с регулярными выражениями в nick-е или jid-е злодея
- - по регулярным выражениям характерных фраз.
+ - По совпадению с регулярными выражениями в nick-е или jid-е злодея
+ - По регулярным выражениям характерных фраз.
- Правила можно настроить как глобально, для всех комнат, где присутствует бот, так и для каждой комнаты отдельно.
- При изменении списка правил бота не надо перезапускать, достаточно отдать ему команду rehash либо в приват, либо
прям в чатике.
-* Есть настройка заходить в разные комнаты под разными никами
+* Есть настройка заходить в разные комнаты под разными никами.
## Что он не может?
@@ -48,7 +56,7 @@ make
Почему нельзя оставить комнату анонимной? А тут всё просто, в банлист заносится реальный jid пользователя, а не его ник.
Соответственно, бот должен видеть этот самый реальный jid. В анонимной комнате бот не сможет увидеть реальный jid.
-А автокик - это конечно хорошо, но есть нюанс: можно, например, гадить ником, поэтому бот в автокик не умеет.
+А автокик - это, конечно, хорошо, но есть нюанс: можно, например, гадить ником, поэтому бот в автокик не умеет.
## Как работает бан?
diff --git a/assets/avatar.png b/assets/avatar.png
new file mode 100644
index 0000000..9fd4dda
Binary files /dev/null and b/assets/avatar.png differ
diff --git a/data/sample_config.json b/data/sample_config.json
index 60bc0f5..863cd4b 100644
--- a/data/sample_config.json
+++ b/data/sample_config.json
@@ -190,8 +190,9 @@
# command sign символ-суффикс команды, например !rehash или !help. По-умолчанию "!".
"csign" : "!",
- # Многословность логов. Если не задано, то info. Debug - ДЕЙСТВИТЕЛЬНО вербозный уровень логгирования.
- # Есть ещё trace :)
+ # Многословность логов. Если не задано, то info.
+ # Есть разные уровни trace, debug, debug, info, warn, error, fatal.
+ # Практически задействованы только trace, debug, info.
"loglevel": "debug",
# Если не задан, логи идут в STDOUT
diff --git a/lib.go b/lib.go
index e435ad8..3de87c9 100644
--- a/lib.go
+++ b/lib.go
@@ -42,8 +42,8 @@ func sigHandler() {
if isConnected && !shutdown {
log.Debug("Try to set our presence to Unavailable and status to Offline")
- // Вот тут понадобится коллекция известных пользователей, чтобы им разослать presence, что бот свалил в offline
- // Пока за неимением лучшего сообщим об этом самим себе.
+ // Вот тут понадобится коллекция известных пользователей, чтобы им разослать presence, что бот свалил в
+ // offline. Пока за неимением лучшего сообщим об этом самим себе.
for _, room := range roomsConnected {
if _, err := talk.SendPresence(
xmpp.Presence{ //nolint:exhaustruct
@@ -317,7 +317,7 @@ func establishConnection() {
}
}
-// joinMu джойнится к конференциям/каналам/комнатам в джаббере.
+// joinMuс джойнится к конференциям/каналам/комнатам в джаббере.
func joinMuc(room string) {
log.Debugf("Sending disco#info from %s to %s", talk.JID(), room)
@@ -411,7 +411,7 @@ func joinMuc(room string) {
}
// probeServerLiveness проверяет живость соединения с сервером. Для многих серверов обязательная штука, без которой
-// они выкидывают клиента через некоторое время неактивности.
+// они выкидывают (дисконнектят) клиента через некоторое время неактивности.
func probeServerLiveness() { //nolint:gocognit
for {
select {
diff --git a/main.go b/main.go
index ce9c186..ec76b18 100644
--- a/main.go
+++ b/main.go
@@ -50,9 +50,9 @@ func init() {
}
}
-// main - фактичеки начало и соновное тело программы.
+// main - фактичеcки начало и основное тело программы.
func main() {
- // Откроем лог и скормим его логгеру
+ // Откроем лог и скормим его логгеру.
if config.Log != "" {
logfile, err := os.OpenFile(config.Log, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
@@ -85,13 +85,16 @@ func main() {
os.Exit(1)
}
- // github.com/mattn/go-xmpp пишет в stdio, нам этого не надо, ловим выхлоп его в logrus с уровнем trace
+ // github.com/mattn/go-xmpp пишет в stdio, нам этого не надо, ловим выхлоп его в logrus с уровнем trace.
xmpp.DebugWriter = log.WithFields(log.Fields{"logger": "stdlib"}).WriterLevel(log.TraceLevel)
- // Хэндлер сигналов не надо трогать, он нужен для завершения программы целиком
+ // Хэндлер сигналов не надо трогать, он нужен для завершения программы целиком.
go sigHandler()
signal.Notify(sigChan, os.Interrupt)
+ // Враппер основной программы. Фактически на каждой серьёзной ошибке, например, сетевой, mainLoop и некоторые
+ // вспомогательные корутины прекращает свою работу. Здесь мы это ловим и запускаем их снова. Задача в том, чтобы
+ // запустить все асинхронные процессы заново, с чистого листа, но уже с распарсенным конфигом.
for {
options = &xmpp.Options{ //nolint:exhaustruct
Host: fmt.Sprintf("%s:%d", config.Jabber.Server, config.Jabber.Port),
@@ -112,12 +115,13 @@ func main() {
DialTimeout: time.Duration(config.Jabber.ConnectionTimeout) * time.Second,
}
- // Через tomb попробуем сделать выход горутинок управляемым
+ // Через tomb попробуем сделать завершение горутинок управляемым.
gTomb = tomb.Tomb{}
- // Устанавливаем соединение и гребём события, посылаемые сервером
+ // Устанавливаем соединение и гребём события, посылаемые сервером - основной и вспомогательные циклы программы.
myLoop()
+ // Логгируем причину завершения mainLoop и вспомогательных циклов программы.
log.Error(gTomb.Wait())
// Если у нас wire error, то вызов .Close() повлечёт за собой ошибку, но мы вынуждены звать .Close(), чтоб
@@ -129,7 +133,7 @@ func main() {
}
}
-// Основной цикл программы
+// Основной цикл программы.
func myLoop() {
for {
select {