From f60c2d42c7abc26a4d09ce4264d63c30b755b0bc Mon Sep 17 00:00:00 2001 From: Mark Haines Date: Thu, 6 Jul 2017 16:18:11 +0100 Subject: [PATCH] More stuff --- hooks/pre-commit | 2 +- .../roomserver/input/latest_events.go | 1 + .../dendrite/roomserver/input/membership.go | 108 ++++++++++++++++++ .../dendrite/roomserver/storage/storage.go | 1 + 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 src/github.com/matrix-org/dendrite/roomserver/input/membership.go diff --git a/hooks/pre-commit b/hooks/pre-commit index abce0f598..0da39378e 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -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. diff --git a/src/github.com/matrix-org/dendrite/roomserver/input/latest_events.go b/src/github.com/matrix-org/dendrite/roomserver/input/latest_events.go index d8de51b8f..d6d6b320d 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/input/latest_events.go +++ b/src/github.com/matrix-org/dendrite/roomserver/input/latest_events.go @@ -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" diff --git a/src/github.com/matrix-org/dendrite/roomserver/input/membership.go b/src/github.com/matrix-org/dendrite/roomserver/input/membership.go new file mode 100644 index 000000000..bd4353554 --- /dev/null +++ b/src/github.com/matrix-org/dendrite/roomserver/input/membership.go @@ -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) { + +} diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go b/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go index 01ab12875..5070289a6 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go @@ -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)