mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-03 12:13:09 -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 {
|
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()
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue