76 lines
2.5 KiB
Go
76 lines
2.5 KiB
Go
package jabber
|
|
|
|
import (
|
|
"buny-jabber-bot/internal/log"
|
|
"time"
|
|
)
|
|
|
|
// 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.Error())
|
|
|
|
return err
|
|
}
|
|
|
|
j.ServerPingTimestampRx = time.Now().Unix() // Считаем, что если коннект запустился, то первый пинг успешен.
|
|
|
|
// Тыкаем сервер палочкой, проверяем, что коннект жив и вываливаемся из mainLoop, если он не жив.
|
|
j.GTomb.Go(
|
|
func() error {
|
|
err := j.ProbeServerLiveness()
|
|
log.Error(err.Error())
|
|
|
|
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: */
|