diff --git a/xmpp/handlers.go b/xmpp/handlers.go index 38266da..365ab20 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -7,6 +7,7 @@ import ( "sort" "strconv" "strings" + "sync" "time" "dev.narayana.im/narayana/telegabber/persistence" @@ -28,6 +29,10 @@ const ( const MUC_DEFAULT_HISTORY_LIMIT int32 = 20 +// kludge for client resuming after the transport restart (by full jids) +var probeFired = make(map[string]bool) +var probeFiredLock = sync.Mutex{} + func logPacketType(p stanza.Packet) { log.Warnf("Ignoring packet: %T\n", p) } @@ -549,23 +554,31 @@ func handlePresence(s xmpp.Sender, p stanza.Presence) { if err != nil { log.Error(errors.Wrap(err, "TDlib connection failure")) } else { - for status := range session.StatusesRange() { - show, description, typ := status.Destruct() - newArgs := []args.V{ - gateway.SPImmed(false), + var probeFiredForFrom bool + probeFiredLock.Lock() + _, probeFiredForFrom = probeFired[p.From] + probeFired[p.From] = true + probeFiredLock.Unlock() + + if p.Type != "probe" || !probeFiredForFrom { + for status := range session.StatusesRange() { + show, description, typ := status.Destruct() + newArgs := []args.V{ + gateway.SPImmed(false), + } + if typ != "" { + newArgs = append(newArgs, gateway.SPType(typ)) + } + go session.ProcessStatusUpdate( + status.ID, + description, + show, + newArgs..., + ) } - if typ != "" { - newArgs = append(newArgs, gateway.SPType(typ)) - } - go session.ProcessStatusUpdate( - status.ID, - description, - show, - newArgs..., - ) + probeClientFeatures(p.From, component) + session.UpdateChatNicknames() } - probeClientFeatures(p.From, component) - session.UpdateChatNicknames() } }() }