mirror of
https://github.com/hoernschen/dendrite.git
synced 2025-02-28 13:53:00 +00:00
Add leave rooms to /sync response
This commit is contained in:
parent
4cf73a5dc2
commit
88374a5cc4
4 changed files with 51 additions and 7 deletions
|
@ -21,7 +21,6 @@ import (
|
||||||
|
|
||||||
"github.com/matrix-org/dendrite/clientapi/jsonerror"
|
"github.com/matrix-org/dendrite/clientapi/jsonerror"
|
||||||
"github.com/matrix-org/dendrite/syncapi/storage"
|
"github.com/matrix-org/dendrite/syncapi/storage"
|
||||||
"github.com/matrix-org/dendrite/syncapi/sync"
|
|
||||||
"github.com/matrix-org/dendrite/userapi/api"
|
"github.com/matrix-org/dendrite/userapi/api"
|
||||||
"github.com/matrix-org/gomatrixserverlib"
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
"github.com/matrix-org/util"
|
"github.com/matrix-org/util"
|
||||||
|
@ -105,7 +104,7 @@ func PutFilter(
|
||||||
limitRes := gjson.GetBytes(body, "room.timeline.limit")
|
limitRes := gjson.GetBytes(body, "room.timeline.limit")
|
||||||
if !limitRes.Exists() {
|
if !limitRes.Exists() {
|
||||||
util.GetLogger(req.Context()).Infof("missing timeline limit, using default")
|
util.GetLogger(req.Context()).Infof("missing timeline limit, using default")
|
||||||
filter.Room.Timeline.Limit = sync.DefaultTimelineLimit
|
filter.Room.Timeline.Limit = gomatrixserverlib.DefaultRoomEventFilter().Limit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate generates a user-friendly error
|
// Validate generates a user-friendly error
|
||||||
|
|
|
@ -698,7 +698,10 @@ func (d *Database) IncrementalSync(
|
||||||
To: toPos.PDUPosition,
|
To: toPos.PDUPosition,
|
||||||
}
|
}
|
||||||
|
|
||||||
numRecentEventsPerRoom := filter.Room.Timeline.Limit
|
numRecentEventsPerRoom := gomatrixserverlib.DefaultRoomEventFilter().Limit
|
||||||
|
if filter != nil {
|
||||||
|
numRecentEventsPerRoom = filter.Room.Timeline.Limit
|
||||||
|
}
|
||||||
|
|
||||||
joinedRoomIDs, err = d.addPDUDeltaToResponse(
|
joinedRoomIDs, err = d.addPDUDeltaToResponse(
|
||||||
ctx, device, r, numRecentEventsPerRoom, wantFullState, res,
|
ctx, device, r, numRecentEventsPerRoom, wantFullState, res,
|
||||||
|
@ -813,11 +816,27 @@ func (d *Database) getResponseWithPDUsForCompleteSync(
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Add "leave" rooms.
|
|
||||||
|
|
||||||
res.Rooms.Join[roomID] = *jr
|
res.Rooms.Join[roomID] = *jr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Extract room state and recent events for all rooms the user has left
|
||||||
|
leaveRoomIDs, err := d.CurrentRoomState.SelectRoomIDsWithMembership(ctx, txn, userID, gomatrixserverlib.Leave)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Build up a /sync response. Add leave rooms.
|
||||||
|
for _, roomID := range leaveRoomIDs {
|
||||||
|
var lr *types.LeaveResponse
|
||||||
|
lr, err = d.getLeaveResponseForCompleteSync(
|
||||||
|
ctx, txn, roomID, r, filter, device,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res.Rooms.Leave[roomID] = *lr
|
||||||
|
}
|
||||||
|
|
||||||
// Add peeked rooms.
|
// Add peeked rooms.
|
||||||
peeks, err := d.Peeks.SelectPeeksInRange(ctx, txn, userID, device.ID, r)
|
peeks, err := d.Peeks.SelectPeeksInRange(ctx, txn, userID, device.ID, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -926,6 +945,33 @@ func (d *Database) getJoinResponseForCompleteSync(
|
||||||
return jr, nil
|
return jr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Database) getLeaveResponseForCompleteSync(
|
||||||
|
ctx context.Context, txn *sql.Tx,
|
||||||
|
roomID string,
|
||||||
|
r types.Range,
|
||||||
|
filter *gomatrixserverlib.Filter,
|
||||||
|
device userapi.Device,
|
||||||
|
) (lr *types.LeaveResponse, err error) {
|
||||||
|
jr, err := d.getJoinResponseForCompleteSync(
|
||||||
|
ctx,
|
||||||
|
txn,
|
||||||
|
roomID,
|
||||||
|
r,
|
||||||
|
filter,
|
||||||
|
device,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
lr = types.NewLeaveResponse()
|
||||||
|
lr.Timeline.PrevBatch = jr.Timeline.PrevBatch
|
||||||
|
lr.Timeline.Events = jr.Timeline.Events
|
||||||
|
lr.Timeline.Limited = jr.Timeline.Limited
|
||||||
|
lr.State.Events = jr.State.Events
|
||||||
|
return lr, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Database) CompleteSync(
|
func (d *Database) CompleteSync(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
res *types.Response,
|
res *types.Response,
|
||||||
|
|
|
@ -367,7 +367,7 @@ func newTestSyncRequest(userID, deviceID string, since types.StreamingToken) syn
|
||||||
timeout: 1 * time.Minute,
|
timeout: 1 * time.Minute,
|
||||||
since: since,
|
since: since,
|
||||||
wantFullState: false,
|
wantFullState: false,
|
||||||
limit: DefaultTimelineLimit,
|
limit: gomatrixserverlib.DefaultRoomEventFilter().Limit,
|
||||||
log: util.GetLogger(context.TODO()),
|
log: util.GetLogger(context.TODO()),
|
||||||
ctx: context.TODO(),
|
ctx: context.TODO(),
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,6 @@ import (
|
||||||
|
|
||||||
const defaultSyncTimeout = time.Duration(0)
|
const defaultSyncTimeout = time.Duration(0)
|
||||||
const defaultIncludeLeave = false
|
const defaultIncludeLeave = false
|
||||||
const DefaultTimelineLimit = 20
|
|
||||||
|
|
||||||
// syncRequest represents a /sync request, with sensible defaults/sanity checks applied.
|
// syncRequest represents a /sync request, with sensible defaults/sanity checks applied.
|
||||||
type syncRequest struct {
|
type syncRequest struct {
|
||||||
|
|
Loading…
Reference in a new issue