More stuff

This commit is contained in:
Mark Haines 2017-07-06 16:18:11 +01:00
parent 0d42537b4e
commit f60c2d42c7
4 changed files with 111 additions and 1 deletions

View file

@ -20,7 +20,7 @@ fi
ineffassign ./src/
go tool vet --all --shadow ./src
gocyclo -over 12 src/
gocyclo -over 16 src/
gb test
# Check that all the packages can build.

View file

@ -16,6 +16,7 @@ package input
import (
"bytes"
"github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/roomserver/state"
"github.com/matrix-org/dendrite/roomserver/types"

View file

@ -0,0 +1,108 @@
// Copyright 2017 Vector Creations Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package input
import (
"github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/gomatrixserverlib"
)
type stateChange struct {
removed types.StateEntry
added types.StateEntry
}
func membershipChanges(removed, added []types.StateEntry) []stateChange {
var ai int
var ri int
var result []stateChange
for {
switch {
case ai == len(added):
for _, s := range removed[ri:] {
if s.EventTypeNID == types.MRoomMemberNID {
result = append(result, stateChange{removed: s})
}
}
return result
case ri == len(removed):
for _, s := range removed[ai:] {
if s.EventTypeNID == types.MRoomMemberNID {
result = append(result, stateChange{added: s})
}
}
return result
case added[ai].EventTypeNID != types.MRoomMemberNID:
ai++
case removed[ri].EventTypeNID != types.MRoomMemberNID:
ri++
case added[ai].StateKeyTuple == removed[ri].StateKeyTuple:
result = append(result, stateChange{
removed: removed[ri],
added: added[ai],
})
ai++
ri++
case added[ai].StateKeyTuple.LessThan(removed[ri].StateKeyTuple):
result = append(result, stateChange{added: added[ai]})
ai++
default:
result = append(result, stateChange{removed: removed[ri]})
ri++
}
}
}
func updateMemberships(
db RoomEventDatabase, updater types.RoomRecentEventsUpdater, removed, added []types.StateEntry,
) error {
changes := membershipChanges(removed, added)
var eventNIDs []types.EventNID
for _, change := range changes {
if change.added.EventNID != 0 {
eventNIDs = append(eventNIDs, change.added.EventNID)
}
if change.removed.EventNID != 0 {
eventNIDs = append(eventNIDs, change.removed.EventNID)
}
}
events, err := db.Events(eventNIDs)
if err != nil {
return err
}
for _, change := range changes {
var ae *gomatrixserverlib.Event
var re *gomatrixserverlib.Event
if change.removed.EventNID != 0 {
ev, _ := eventMap(events).lookup(change.removed.EventNID)
if ev != nil {
re = &ev.Event
}
}
if change.added.EventNID != 0 {
ev, _ := eventMap(events).lookup(change.added.EventNID)
if ae != nil {
ae = &ev.Event
}
}
updateMembership(re, ae)
}
return nil
}
func updateMembership(remove *gomatrixserverlib.Event, add *gomatrixserverlib.Event) {
}

View file

@ -454,6 +454,7 @@ func (u *membershipUpdater) SetToJoin(senderID string) ([]string, error) {
return inviteEventIDs, nil
}
// SetToLeave implements types.MembershipUpdater
func (u *membershipUpdater) SetToLeave(senderID string) ([]string, error) {
// TODO: assign the state key inside the transaction.
senderNID, err := u.d.assignStateKeyNID(senderID)