mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-01 03:03:10 -06:00
Set user to unavailable after x minutes
This commit is contained in:
parent
f4817d6a4c
commit
2826758c8a
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue