mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-11 08:53:11 -06:00
More stuff
This commit is contained in:
parent
91ecad8f51
commit
9acabe93d2
|
|
@ -19,6 +19,96 @@ import (
|
||||||
"github.com/matrix-org/gomatrixserverlib"
|
"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 {
|
type stateChange struct {
|
||||||
removed types.StateEntry
|
removed types.StateEntry
|
||||||
added 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
|
return u.membership == membershipStateJoin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsLeave implements types.MembershipUpdater
|
||||||
|
func (u *membershipUpdater) IsLeave() bool {
|
||||||
|
return u.membership == membershipStateLeaveOrBan
|
||||||
|
}
|
||||||
|
|
||||||
// SetToInvite implements types.MembershipUpdater
|
// SetToInvite implements types.MembershipUpdater
|
||||||
func (u *membershipUpdater) SetToInvite(event gomatrixserverlib.Event) (bool, error) {
|
func (u *membershipUpdater) SetToInvite(event gomatrixserverlib.Event) (bool, error) {
|
||||||
// TODO: assign the state key inside the transaction.
|
// TODO: assign the state key inside the transaction.
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,8 @@ type MembershipUpdater interface {
|
||||||
IsInvite() bool
|
IsInvite() bool
|
||||||
// True if the target user is joined to the room.
|
// True if the target user is joined to the room.
|
||||||
IsJoin() bool
|
IsJoin() bool
|
||||||
|
// True if the target user is not invited or joined to the room.
|
||||||
|
IsLeave() bool
|
||||||
// Set the state to invite.
|
// Set the state to invite.
|
||||||
// Returns whether this invite needs to be sent
|
// Returns whether this invite needs to be sent
|
||||||
SetToInvite(event gomatrixserverlib.Event) (needsSending bool, err error)
|
SetToInvite(event gomatrixserverlib.Event) (needsSending bool, err error)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue