mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-10 16:33:11 -06:00
More stuff
This commit is contained in:
parent
91ecad8f51
commit
9acabe93d2
|
|
@ -19,6 +19,96 @@ import (
|
|||
"github.com/matrix-org/gomatrixserverlib"
|
||||
)
|
||||
|
||||
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
|
||||
var targetNID types.EventStateKeyNID
|
||||
if change.removed.EventNID != 0 {
|
||||
ev, _ := eventMap(events).lookup(change.removed.EventNID)
|
||||
if ev != nil {
|
||||
re = &ev.Event
|
||||
}
|
||||
targetNID = change.removed.EventStateKeyNID
|
||||
}
|
||||
if change.added.EventNID != 0 {
|
||||
ev, _ := eventMap(events).lookup(change.added.EventNID)
|
||||
if ae != nil {
|
||||
ae = &ev.Event
|
||||
}
|
||||
targetNID = change.added.EventStateKeyNID
|
||||
}
|
||||
if err := updateMembership(updater, targetNID, re, ae); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func updateMembership(
|
||||
updater types.RoomRecentEventsUpdater, targetNID types.EventStateKeyNID, remove *gomatrixserverlib.Event, add *gomatrixserverlib.Event,
|
||||
) error {
|
||||
old := "leave"
|
||||
new := "leave"
|
||||
|
||||
if remove != nil {
|
||||
membership, err := remove.Membership()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
old = *membership
|
||||
}
|
||||
if add != nil {
|
||||
membership, err := add.Membership()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
new = *membership
|
||||
}
|
||||
if old == new {
|
||||
return nil
|
||||
}
|
||||
|
||||
mu, err := updater.MembershipUpdater(targetNID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch new {
|
||||
case "invite":
|
||||
_, err := mu.SetToInvite(*add)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
case "join":
|
||||
if !mu.IsJoin() {
|
||||
mu.SetToJoin(add.Sender())
|
||||
}
|
||||
case "leave":
|
||||
if !mu.IsLeave() {
|
||||
mu.SetToLeave(add.Sender())
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type stateChange struct {
|
||||
removed types.StateEntry
|
||||
added types.StateEntry
|
||||
|
|
@ -64,45 +154,3 @@ func membershipChanges(removed, added []types.StateEntry) []stateChange {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -407,6 +407,11 @@ func (u *membershipUpdater) IsJoin() bool {
|
|||
return u.membership == membershipStateJoin
|
||||
}
|
||||
|
||||
// IsLeave implements types.MembershipUpdater
|
||||
func (u *membershipUpdater) IsLeave() bool {
|
||||
return u.membership == membershipStateLeaveOrBan
|
||||
}
|
||||
|
||||
// SetToInvite implements types.MembershipUpdater
|
||||
func (u *membershipUpdater) SetToInvite(event gomatrixserverlib.Event) (bool, error) {
|
||||
// TODO: assign the state key inside the transaction.
|
||||
|
|
|
|||
|
|
@ -186,6 +186,8 @@ type MembershipUpdater interface {
|
|||
IsInvite() bool
|
||||
// True if the target user is joined to the room.
|
||||
IsJoin() bool
|
||||
// True if the target user is not invited or joined to the room.
|
||||
IsLeave() bool
|
||||
// Set the state to invite.
|
||||
// Returns whether this invite needs to be sent
|
||||
SetToInvite(event gomatrixserverlib.Event) (needsSending bool, err error)
|
||||
|
|
|
|||
Loading…
Reference in a new issue