Set user to unavailable after x minutes

This commit is contained in:
S7evinK 2022-03-31 10:37:37 +02:00
parent f4817d6a4c
commit 2826758c8a
2 changed files with 15 additions and 15 deletions

View file

@ -97,6 +97,7 @@ func (rp *RequestPool) cleanPresence(cleanupTime time.Duration) {
rp.presence.Range(func(key interface{}, v interface{}) bool { rp.presence.Range(func(key interface{}, v interface{}) bool {
p := v.(types.Presence) p := v.(types.Presence)
if time.Since(p.LastActiveTS.Time()) > cleanupTime { if time.Since(p.LastActiveTS.Time()) > cleanupTime {
rp.updatePresence("unavailable", p.UserID)
rp.presence.Delete(key) rp.presence.Delete(key)
} }
return true return true
@ -106,7 +107,7 @@ func (rp *RequestPool) cleanPresence(cleanupTime time.Duration) {
} }
// updatePresence sends presence updates to the SyncAPI and FederationAPI // 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 { if rp.cfg.Matrix.DisablePresence {
return return
} }
@ -118,11 +119,11 @@ func (rp *RequestPool) updatePresence(presence string, device *userapi.Device) {
ClientFields: types.PresenceClientResponse{ ClientFields: types.PresenceClientResponse{
Presence: presence, Presence: presence,
}, },
UserID: device.UserID, UserID: userID,
LastActiveTS: gomatrixserverlib.AsTimestamp(time.Now()), LastActiveTS: gomatrixserverlib.AsTimestamp(time.Now()),
} }
// avoid spamming presence updates when syncing // avoid spamming presence updates when syncing
existingPresence, ok := rp.presence.LoadOrStore(device.UserID, newPresence) existingPresence, ok := rp.presence.LoadOrStore(userID, newPresence)
if ok { if ok {
p := existingPresence.(types.Presence) p := existingPresence.(types.Presence)
if p.ClientFields.Presence == newPresence.ClientFields.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") logrus.WithError(err).Error("Unable to publish presence message from sync")
return return
} }
rp.presence.Store(device.UserID, newPresence) rp.presence.Store(userID, newPresence)
} }
func (rp *RequestPool) updateLastSeen(req *http.Request, device *userapi.Device) { 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() defer activeSyncRequests.Dec()
rp.updateLastSeen(req, device) rp.updateLastSeen(req, device)
rp.updatePresence(req.FormValue("set_presence"), device) rp.updatePresence(req.FormValue("set_presence"), device.UserID)
waitingSyncRequests.Inc() waitingSyncRequests.Inc()
defer waitingSyncRequests.Dec() defer waitingSyncRequests.Dec()

View file

@ -6,7 +6,6 @@ import (
"time" "time"
"github.com/matrix-org/dendrite/setup/config" "github.com/matrix-org/dendrite/setup/config"
"github.com/matrix-org/dendrite/userapi/api"
) )
type dummyPublisher struct { type dummyPublisher struct {
@ -21,7 +20,7 @@ func (d *dummyPublisher) SendPresence(userID, presence string) error {
func TestRequestPool_updatePresence(t *testing.T) { func TestRequestPool_updatePresence(t *testing.T) {
type args struct { type args struct {
presence string presence string
device *api.Device userID string
sleep time.Duration sleep time.Duration
} }
publisher := &dummyPublisher{} publisher := &dummyPublisher{}
@ -36,20 +35,20 @@ func TestRequestPool_updatePresence(t *testing.T) {
name: "new presence is published", name: "new presence is published",
wantIncrease: true, wantIncrease: true,
args: args{ args: args{
device: &api.Device{UserID: "dummy"}, userID: "dummy",
}, },
}, },
{ {
name: "presence not published, no change", name: "presence not published, no change",
args: args{ args: args{
device: &api.Device{UserID: "dummy"}, userID: "dummy",
}, },
}, },
{ {
name: "new presence is published dummy2", name: "new presence is published dummy2",
wantIncrease: true, wantIncrease: true,
args: args{ args: args{
device: &api.Device{UserID: "dummy2"}, userID: "dummy2",
presence: "online", presence: "online",
}, },
}, },
@ -57,14 +56,14 @@ func TestRequestPool_updatePresence(t *testing.T) {
name: "different presence is published dummy2", name: "different presence is published dummy2",
wantIncrease: true, wantIncrease: true,
args: args{ args: args{
device: &api.Device{UserID: "dummy2"}, userID: "dummy2",
presence: "unavailable", presence: "unavailable",
}, },
}, },
{ {
name: "same presence is not published dummy2", name: "same presence is not published dummy2",
args: args{ args: args{
device: &api.Device{UserID: "dummy2"}, userID: "dummy2",
presence: "unavailable", presence: "unavailable",
sleep: time.Millisecond * 150, sleep: time.Millisecond * 150,
}, },
@ -73,7 +72,7 @@ func TestRequestPool_updatePresence(t *testing.T) {
name: "same presence is published after being deleted", name: "same presence is published after being deleted",
wantIncrease: true, wantIncrease: true,
args: args{ args: args{
device: &api.Device{UserID: "dummy2"}, userID: "dummy2",
presence: "unavailable", presence: "unavailable",
}, },
}, },
@ -94,7 +93,7 @@ func TestRequestPool_updatePresence(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
beforeCount := publisher.count 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 { if tt.wantIncrease && publisher.count <= beforeCount {
t.Fatalf("expected count to increase: %d <= %d", publisher.count, beforeCount) t.Fatalf("expected count to increase: %d <= %d", publisher.count, beforeCount)
} }