Don't repeat join events into the roomserver

This commit is contained in:
Neil Alexander 2020-05-04 10:44:04 +01:00
parent a281bb4538
commit 07a89c4e6b

View file

@ -139,20 +139,38 @@ func (r *RoomserverInternalAPI) performJoinRoomByID(
switch err { switch err {
case nil: case nil:
// The room join is local. Send the new join event into the // The room join is local. Send the new join event into the
// roomserver. // roomserver. First of all check that the user isn't already
inputReq := api.InputRoomEventsRequest{ // a member of the room.
InputRoomEvents: []api.InputRoomEvent{ alreadyJoined := false
api.InputRoomEvent{ for _, se := range buildRes.StateEvents {
Kind: api.KindNew, if se.Type() == gomatrixserverlib.MRoomMember {
Event: event.Headered(buildRes.RoomVersion), if se.StateKey() != nil && *se.StateKey() == userID {
AuthEventIDs: event.AuthEventIDs(), var content map[string]interface{}
SendAsServer: string(r.Cfg.Matrix.ServerName), if membership, ok := content["membership"]; ok {
}, alreadyJoined = (membership == "join")
}, break
}
}
}
} }
inputRes := api.InputRoomEventsResponse{}
if err = r.InputRoomEvents(ctx, &inputReq, &inputRes); err != nil { // If we haven't already joined the room then send an event
return fmt.Errorf("r.InputRoomEvents: %w", err) // into the room changing our membership status.
if !alreadyJoined {
inputReq := api.InputRoomEventsRequest{
InputRoomEvents: []api.InputRoomEvent{
api.InputRoomEvent{
Kind: api.KindNew,
Event: event.Headered(buildRes.RoomVersion),
AuthEventIDs: event.AuthEventIDs(),
SendAsServer: string(r.Cfg.Matrix.ServerName),
},
},
}
inputRes := api.InputRoomEventsResponse{}
if err = r.InputRoomEvents(ctx, &inputReq, &inputRes); err != nil {
return fmt.Errorf("r.InputRoomEvents: %w", err)
}
} }
case common.ErrRoomNoExists: case common.ErrRoomNoExists: