Files
buny-jabber-bot/internal/jabber/main_loop.go
2024-10-21 19:47:11 +03:00

78 lines
2.5 KiB
Go

package jabber
import (
"time"
log "github.com/sirupsen/logrus"
)
// MyLoop - основной цикл программы.
func (j *Jabber) MyLoop() {
for {
select {
case <-j.GTomb.Dying():
j.GTomb.Done()
return //nolint:nlreturn
default:
// Зададим начальное значение глобальным переменным
j.ServerPingTimestampRx = 0
j.ServerPingTimestampTx = 0
j.RoomsConnected = make([]string, 1)
j.LastActivity = 0
j.LastServerActivity = 0
j.LastMucActivity = NewCollection()
j.ServerCapsQueried = false
j.ServerCapsList = NewCollection()
j.MucCapsList = NewCollection()
j.ServerPingTimestampTx = 0
j.ServerPingTimestampRx = 0
j.RoomPresences = NewCollection()
// Установим коннект
j.EstablishConnection()
j.ServerPingTimestampRx = time.Now().Unix() // Считаем, что если коннект запустился, то первый пинг успешен.
// Тыкаем сервер палочкой, проверяем, что коннект жив и вываливаемся из mainLoop, если он не жив.
go j.ProbeServerLiveness()
// Тыкаем muc-и палочкой, проверяем, что они живы и вываливаемся из mainLoop, если пинги пропали.
// Если пинги до комнаты пропали, то это фактически значит, что либо сервер потерял связь с MUC-компонентом,
// либо у нас какой-то wire error.
go j.ProbeMUCLiveness()
// Гребём ивенты...
for {
// Стриггерилось завершение работы приложения, или соединение не установлено (порвалось, например)
// грести не надо
if j.Shutdown {
break
}
if !j.IsConnected {
// Tight loop - это наверно не очень хорошо, думаю, ничего страшного не будет, если мы поспим 100мс.
time.Sleep(100 * time.Millisecond)
continue
}
// Вынимаем ивент из "провода"
chat, err := j.Talk.Recv()
if err != nil {
log.Errorf("Unable to get events from server: %s", err)
j.GTomb.Kill(err)
// Не забываем выходить на ошибке :(
return
}
j.ParseEvent(chat)
}
}
}
}
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */