mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-16 18:43:10 -06:00
Also set the prev_content, if present
This commit is contained in:
parent
75ffbc6aa7
commit
45003cc564
|
|
@ -16,6 +16,7 @@ import (
|
||||||
"github.com/matrix-org/dendrite/syncapi/types"
|
"github.com/matrix-org/dendrite/syncapi/types"
|
||||||
userapi "github.com/matrix-org/dendrite/userapi/api"
|
userapi "github.com/matrix-org/dendrite/userapi/api"
|
||||||
"github.com/matrix-org/gomatrixserverlib/spec"
|
"github.com/matrix-org/gomatrixserverlib/spec"
|
||||||
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
|
|
||||||
"github.com/matrix-org/dendrite/syncapi/notifier"
|
"github.com/matrix-org/dendrite/syncapi/notifier"
|
||||||
|
|
@ -356,36 +357,12 @@ func (p *PDUStreamProvider) addRoomDeltaToResponse(
|
||||||
if ev.Type() != spec.MRoomPowerLevels || !ev.StateKeyEquals("") {
|
if ev.Type() != spec.MRoomPowerLevels || !ev.StateKeyEquals("") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
var pls gomatrixserverlib.PowerLevelContent
|
var newEvent gomatrixserverlib.PDU
|
||||||
pls, err = gomatrixserverlib.NewPowerLevelContentFromEvent(ev)
|
newEvent, err = p.updatePowerLevelEvent(ctx, ev)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return r.From, err
|
return r.From, err
|
||||||
}
|
}
|
||||||
newPls := make(map[string]int64)
|
events[i] = &rstypes.HeaderedEvent{PDU: newEvent}
|
||||||
var userID *spec.UserID
|
|
||||||
for user, level := range pls.Users {
|
|
||||||
validRoomID, _ := spec.NewRoomID(ev.RoomID())
|
|
||||||
userID, err = p.rsAPI.QueryUserIDForSender(ctx, *validRoomID, spec.SenderID(user))
|
|
||||||
if err != nil {
|
|
||||||
return r.From, err
|
|
||||||
}
|
|
||||||
newPls[userID.String()] = level
|
|
||||||
}
|
|
||||||
var newPlBytes, newEv []byte
|
|
||||||
newPlBytes, err = json.Marshal(newPls)
|
|
||||||
if err != nil {
|
|
||||||
return r.From, err
|
|
||||||
}
|
|
||||||
newEv, err = sjson.SetRawBytes(ev.JSON(), "content.users", newPlBytes)
|
|
||||||
if err != nil {
|
|
||||||
return r.From, err
|
|
||||||
}
|
|
||||||
var evNew gomatrixserverlib.PDU
|
|
||||||
evNew, err = gomatrixserverlib.MustGetRoomVersion(gomatrixserverlib.RoomVersionPseudoIDs).NewEventFromTrustedJSON(newEv, false)
|
|
||||||
if err != nil {
|
|
||||||
return r.From, err
|
|
||||||
}
|
|
||||||
events[i] = &rstypes.HeaderedEvent{PDU: evNew}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sEvents := gomatrixserverlib.HeaderedReverseTopologicalOrdering(
|
sEvents := gomatrixserverlib.HeaderedReverseTopologicalOrdering(
|
||||||
|
|
@ -463,6 +440,75 @@ func (p *PDUStreamProvider) addRoomDeltaToResponse(
|
||||||
return latestPosition, nil
|
return latestPosition, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *PDUStreamProvider) updatePowerLevelEvent(ctx context.Context, ev *rstypes.HeaderedEvent) (gomatrixserverlib.PDU, error) {
|
||||||
|
pls, err := gomatrixserverlib.NewPowerLevelContentFromEvent(ev)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
newPls := make(map[string]int64)
|
||||||
|
var userID *spec.UserID
|
||||||
|
for user, level := range pls.Users {
|
||||||
|
validRoomID, _ := spec.NewRoomID(ev.RoomID())
|
||||||
|
userID, err = p.rsAPI.QueryUserIDForSender(ctx, *validRoomID, spec.SenderID(user))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
newPls[userID.String()] = level
|
||||||
|
}
|
||||||
|
var newPlBytes, newEv []byte
|
||||||
|
newPlBytes, err = json.Marshal(newPls)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
newEv, err = sjson.SetRawBytes(ev.JSON(), "content.users", newPlBytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// do the same for prev content
|
||||||
|
prevContent := gjson.GetBytes(ev.JSON(), "unsigned.prev_content")
|
||||||
|
if !prevContent.Exists() {
|
||||||
|
var evNew gomatrixserverlib.PDU
|
||||||
|
evNew, err = gomatrixserverlib.MustGetRoomVersion(gomatrixserverlib.RoomVersionPseudoIDs).NewEventFromTrustedJSON(newEv, false)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return evNew, err
|
||||||
|
}
|
||||||
|
pls = gomatrixserverlib.PowerLevelContent{}
|
||||||
|
err = json.Unmarshal([]byte(prevContent.Raw), &pls)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
newPls = make(map[string]int64)
|
||||||
|
for user, level := range pls.Users {
|
||||||
|
validRoomID, _ := spec.NewRoomID(ev.RoomID())
|
||||||
|
userID, err = p.rsAPI.QueryUserIDForSender(ctx, *validRoomID, spec.SenderID(user))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
newPls[userID.String()] = level
|
||||||
|
}
|
||||||
|
newPlBytes, err = json.Marshal(newPls)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
newEv, err = sjson.SetRawBytes(newEv, "unsigned.prev_content.users", newPlBytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var evNew gomatrixserverlib.PDU
|
||||||
|
evNew, err = gomatrixserverlib.MustGetRoomVersion(gomatrixserverlib.RoomVersionPseudoIDs).NewEventFromTrustedJSON(newEv, false)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return evNew, err
|
||||||
|
}
|
||||||
|
|
||||||
// applyHistoryVisibilityFilter gets the current room state and supplies it to ApplyHistoryVisibilityFilter, to make
|
// applyHistoryVisibilityFilter gets the current room state and supplies it to ApplyHistoryVisibilityFilter, to make
|
||||||
// sure we always return the required events in the timeline.
|
// sure we always return the required events in the timeline.
|
||||||
func applyHistoryVisibilityFilter(
|
func applyHistoryVisibilityFilter(
|
||||||
|
|
@ -613,33 +659,11 @@ func (p *PDUStreamProvider) getJoinResponseForCompleteSync(
|
||||||
if ev.Type() != spec.MRoomPowerLevels || !ev.StateKeyEquals("") {
|
if ev.Type() != spec.MRoomPowerLevels || !ev.StateKeyEquals("") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
pls, err := gomatrixserverlib.NewPowerLevelContentFromEvent(ev)
|
newEvent, err := p.updatePowerLevelEvent(ctx, ev)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
newPls := make(map[string]int64)
|
events[i] = &rstypes.HeaderedEvent{PDU: newEvent}
|
||||||
var userID *spec.UserID
|
|
||||||
for user, level := range pls.Users {
|
|
||||||
validRoomID, _ := spec.NewRoomID(ev.RoomID())
|
|
||||||
userID, err = p.rsAPI.QueryUserIDForSender(ctx, *validRoomID, spec.SenderID(user))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
newPls[userID.String()] = level
|
|
||||||
}
|
|
||||||
newPlBytes, err := json.Marshal(newPls)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
newEv, err := sjson.SetRawBytes(ev.JSON(), "content.users", newPlBytes)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
evNew, err := gomatrixserverlib.MustGetRoomVersion(gomatrixserverlib.RoomVersionPseudoIDs).NewEventFromTrustedJSON(newEv, false)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
events[i] = &rstypes.HeaderedEvent{PDU: evNew}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jr.Timeline.PrevBatch = prevBatch
|
jr.Timeline.PrevBatch = prevBatch
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue