Files
buny-jabber-bot/internal/jabber/main_loop.go
2025-11-15 15:52:34 +03:00

77 lines
2.5 KiB
Go

package jabber
import (
"time"
log "github.com/sirupsen/logrus"
)
// MyLoop - основной цикл программы.
func (j *Jabber) MyLoop() error {
for {
// Зададим начальное значение глобальным переменным.
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()
// Установим коннект.
if err := j.EstablishConnection(); err != nil {
log.Error(err)
return err
}
j.ServerPingTimestampRx = time.Now().Unix() // Считаем, что если коннект запустился, то первый пинг успешен.
// Тыкаем сервер палочкой, проверяем, что коннект жив и вываливаемся из mainLoop, если он не жив.
j.GTomb.Go(
func() error {
err := j.ProbeServerLiveness()
log.Error(err)
return err
},
)
// Тыкаем muc-и палочкой, проверяем, что они живы и вываливаемся из mainLoop, если пинги пропали.
// Если пинги до комнаты пропали, то это фактически значит, что либо сервер потерял связь с MUC-компонентом,
// либо у нас какой-то wire error.
// j.GTomb.Go() тут зовётся внутри на каждую комнату, если у нас ошибка, эта горутинка рано или поздно выйдет.
go j.ProbeMUCLiveness()
// Гребём ивенты, пока стриггерилось завершение работы приложения, или соединение не порвалось.
for !j.Shutdown {
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 recieve data from socket: %s", err)
return err
}
j.ParseEvent(chat)
}
return nil
}
}
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */