From 2826758c8a19d1e2caef9f2869fdffb7839580f8 Mon Sep 17 00:00:00 2001 From: S7evinK Date: Thu, 31 Mar 2022 10:37:37 +0200 Subject: [PATCH] Set user to unavailable after x minutes --- syncapi/sync/requestpool.go | 13 +++++++------ syncapi/sync/requestpool_test.go | 17 ++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/syncapi/sync/requestpool.go b/syncapi/sync/requestpool.go index 29407efd8..b45498eab 100644 --- a/syncapi/sync/requestpool.go +++ b/syncapi/sync/requestpool.go @@ -97,6 +97,7 @@ func (rp *RequestPool) cleanPresence(cleanupTime time.Duration) { rp.presence.Range(func(key interface{}, v interface{}) bool { p := v.(types.Presence) if time.Since(p.LastActiveTS.Time()) > cleanupTime { + rp.updatePresence("unavailable", p.UserID) rp.presence.Delete(key) } return true @@ -106,7 +107,7 @@ func (rp *RequestPool) cleanPresence(cleanupTime time.Duration) { } // updatePresence sends presence updates to the SyncAPI and FederationAPI -func (rp *RequestPool) updatePresence(presence string, device *userapi.Device) { +func (rp *RequestPool) updatePresence(presence string, userID string) { if rp.cfg.Matrix.DisablePresence { return } @@ -118,11 +119,11 @@ func (rp *RequestPool) updatePresence(presence string, device *userapi.Device) { ClientFields: types.PresenceClientResponse{ Presence: presence, }, - UserID: device.UserID, + UserID: userID, LastActiveTS: gomatrixserverlib.AsTimestamp(time.Now()), } // avoid spamming presence updates when syncing - existingPresence, ok := rp.presence.LoadOrStore(device.UserID, newPresence) + existingPresence, ok := rp.presence.LoadOrStore(userID, newPresence) if ok { p := existingPresence.(types.Presence) if p.ClientFields.Presence == newPresence.ClientFields.Presence { @@ -130,12 +131,12 @@ func (rp *RequestPool) updatePresence(presence string, device *userapi.Device) { } } - if err := rp.producer.SendPresence(device.UserID, strings.ToLower(presence)); err != nil { + if err := rp.producer.SendPresence(userID, strings.ToLower(presence)); err != nil { logrus.WithError(err).Error("Unable to publish presence message from sync") return } - rp.presence.Store(device.UserID, newPresence) + rp.presence.Store(userID, newPresence) } func (rp *RequestPool) updateLastSeen(req *http.Request, device *userapi.Device) { @@ -214,7 +215,7 @@ func (rp *RequestPool) OnIncomingSyncRequest(req *http.Request, device *userapi. defer activeSyncRequests.Dec() rp.updateLastSeen(req, device) - rp.updatePresence(req.FormValue("set_presence"), device) + rp.updatePresence(req.FormValue("set_presence"), device.UserID) waitingSyncRequests.Inc() defer waitingSyncRequests.Dec() diff --git a/syncapi/sync/requestpool_test.go b/syncapi/sync/requestpool_test.go index a741dd0c6..256e31d4e 100644 --- a/syncapi/sync/requestpool_test.go +++ b/syncapi/sync/requestpool_test.go @@ -6,7 +6,6 @@ import ( "time" "github.com/matrix-org/dendrite/setup/config" - "github.com/matrix-org/dendrite/userapi/api" ) type dummyPublisher struct { @@ -21,7 +20,7 @@ func (d *dummyPublisher) SendPresence(userID, presence string) error { func TestRequestPool_updatePresence(t *testing.T) { type args struct { presence string - device *api.Device + userID string sleep time.Duration } publisher := &dummyPublisher{} @@ -36,20 +35,20 @@ func TestRequestPool_updatePresence(t *testing.T) { name: "new presence is published", wantIncrease: true, args: args{ - device: &api.Device{UserID: "dummy"}, + userID: "dummy", }, }, { name: "presence not published, no change", args: args{ - device: &api.Device{UserID: "dummy"}, + userID: "dummy", }, }, { name: "new presence is published dummy2", wantIncrease: true, args: args{ - device: &api.Device{UserID: "dummy2"}, + userID: "dummy2", presence: "online", }, }, @@ -57,14 +56,14 @@ func TestRequestPool_updatePresence(t *testing.T) { name: "different presence is published dummy2", wantIncrease: true, args: args{ - device: &api.Device{UserID: "dummy2"}, + userID: "dummy2", presence: "unavailable", }, }, { name: "same presence is not published dummy2", args: args{ - device: &api.Device{UserID: "dummy2"}, + userID: "dummy2", presence: "unavailable", sleep: time.Millisecond * 150, }, @@ -73,7 +72,7 @@ func TestRequestPool_updatePresence(t *testing.T) { name: "same presence is published after being deleted", wantIncrease: true, args: args{ - device: &api.Device{UserID: "dummy2"}, + userID: "dummy2", presence: "unavailable", }, }, @@ -94,7 +93,7 @@ func TestRequestPool_updatePresence(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { beforeCount := publisher.count - rp.updatePresence(tt.args.presence, tt.args.device) + rp.updatePresence(tt.args.presence, tt.args.userID) if tt.wantIncrease && publisher.count <= beforeCount { t.Fatalf("expected count to increase: %d <= %d", publisher.count, beforeCount) }