diff --git a/src/github.com/matrix-org/dendrite/syncapi/consumers/roomserver.go b/src/github.com/matrix-org/dendrite/syncapi/consumers/roomserver.go index c5101d71a..6d77f6ef2 100644 --- a/src/github.com/matrix-org/dendrite/syncapi/consumers/roomserver.go +++ b/src/github.com/matrix-org/dendrite/syncapi/consumers/roomserver.go @@ -19,7 +19,6 @@ import ( "fmt" log "github.com/Sirupsen/logrus" - "github.com/matrix-org/dendrite/clientapi/events" "github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/common/config" "github.com/matrix-org/dendrite/roomserver/api" @@ -42,9 +41,9 @@ type OutputRoomEvent struct { } type prevMembership struct { - PrevContent events.MemberContent `json:"prev_content"` - PrevID string `json:"replaces_state"` - UserID string `json:"prev_sender"` + PrevContent json.RawMessage `json:"prev_content"` + PrevID string `json:"replaces_state"` + UserID string `json:"prev_sender"` } // NewOutputRoomEvent creates a new OutputRoomEvent consumer. Call Start() to begin consuming from room servers. @@ -114,13 +113,13 @@ func (s *OutputRoomEvent) onMessage(msg *sarama.ConsumerMessage) error { }).Panicf("roomserver output log: state event lookup failure") } - ev, err = s.updateMemberEvent(ev, s.keyID, s.privateKey) + ev, err = s.updateStateEvent(ev, s.keyID, s.privateKey) if err != nil { return err } for i := range addsStateEvents { - addsStateEvents[i], err = s.updateMemberEvent(addsStateEvents[i], s.keyID, s.privateKey) + addsStateEvents[i], err = s.updateStateEvent(addsStateEvents[i], s.keyID, s.privateKey) if err != nil { return err } @@ -202,22 +201,11 @@ func (s *OutputRoomEvent) lookupStateEvents( return result, nil } -func (s *OutputRoomEvent) updateMemberEvent( +func (s *OutputRoomEvent) updateStateEvent( event gomatrixserverlib.Event, keyID gomatrixserverlib.KeyID, privateKey []byte, ) (gomatrixserverlib.Event, error) { - if event.Type() != "m.room.member" { - return event, nil - } - membership, err := event.Membership() - if err != nil { - return event, err - } - if membership != "join" { - return event, nil - } - - prevEvent, err := s.db.GetMembershipEvent(event.RoomID(), *event.StateKey()) + prevEvent, err := s.db.GetStateEvent(event.Type(), event.RoomID(), *event.StateKey()) if err != nil { return event, err } @@ -226,13 +214,8 @@ func (s *OutputRoomEvent) updateMemberEvent( return event, nil } - var content events.MemberContent - if err := json.Unmarshal(prevEvent.Content(), &content); err != nil { - return event, err - } - prev := prevMembership{ - PrevContent: content, + PrevContent: prevEvent.Content(), PrevID: prevEvent.EventID(), UserID: prevEvent.Sender(), } diff --git a/src/github.com/matrix-org/dendrite/syncapi/storage/current_room_state_table.go b/src/github.com/matrix-org/dendrite/syncapi/storage/current_room_state_table.go index 4ebaa5be3..64afaede8 100644 --- a/src/github.com/matrix-org/dendrite/syncapi/storage/current_room_state_table.go +++ b/src/github.com/matrix-org/dendrite/syncapi/storage/current_room_state_table.go @@ -66,8 +66,8 @@ const selectCurrentStateSQL = "" + const selectJoinedUsersSQL = "" + "SELECT room_id, state_key FROM current_room_state WHERE type = 'm.room.member' AND membership = 'join'" -const selectJoinEventForUserSQL = "" + - "SELECT event_json FROM current_room_state WHERE type = 'm.room.member' AND membership = 'join' AND room_id = $1 AND state_key = $2" +const selectStateEventSQL = "" + + "SELECT event_json FROM current_room_state WHERE type = $1 AND room_id = $2 AND state_key = $3" const selectEventsWithEventIDsSQL = "" + "SELECT added_at, event_json FROM current_room_state WHERE event_id = ANY($1)" @@ -79,7 +79,7 @@ type currentRoomStateStatements struct { selectCurrentStateStmt *sql.Stmt selectJoinedUsersStmt *sql.Stmt selectEventsWithEventIDsStmt *sql.Stmt - selectJoinEventForUserStmt *sql.Stmt + selectStateEventStmt *sql.Stmt } func (s *currentRoomStateStatements) prepare(db *sql.DB) (err error) { @@ -105,7 +105,7 @@ func (s *currentRoomStateStatements) prepare(db *sql.DB) (err error) { if s.selectEventsWithEventIDsStmt, err = db.Prepare(selectEventsWithEventIDsSQL); err != nil { return } - if s.selectJoinEventForUserStmt, err = db.Prepare(selectJoinEventForUserSQL); err != nil { + if s.selectStateEventStmt, err = db.Prepare(selectStateEventSQL); err != nil { return } return @@ -203,9 +203,9 @@ func rowsToEvents(rows *sql.Rows) ([]gomatrixserverlib.Event, error) { return result, nil } -func (s *currentRoomStateStatements) selectJoinEventForUser(roomID string, userID string) (*gomatrixserverlib.Event, error) { +func (s *currentRoomStateStatements) selectStateEvent(evType string, roomID string, stateKey string) (*gomatrixserverlib.Event, error) { var res []byte - if err := s.selectJoinEventForUserStmt.QueryRow(roomID, userID).Scan(&res); err == sql.ErrNoRows { + if err := s.selectStateEventStmt.QueryRow(evType, roomID, stateKey).Scan(&res); err == sql.ErrNoRows { return nil, nil } ev, err := gomatrixserverlib.NewEventFromTrustedJSON(res, false) diff --git a/src/github.com/matrix-org/dendrite/syncapi/storage/syncserver.go b/src/github.com/matrix-org/dendrite/syncapi/storage/syncserver.go index 2ab63f718..46231c776 100644 --- a/src/github.com/matrix-org/dendrite/syncapi/storage/syncserver.go +++ b/src/github.com/matrix-org/dendrite/syncapi/storage/syncserver.go @@ -141,9 +141,11 @@ func (d *SyncServerDatabase) updateRoomState( return nil } -// GetMembershipEvent returns the Matrix join event for a given user into a given room -func (d *SyncServerDatabase) GetMembershipEvent(roomID string, userID string) (*gomatrixserverlib.Event, error) { - return d.roomstate.selectJoinEventForUser(roomID, userID) +// GetStateEvent returns the Matrix state event of a given type for a given room with a given state key +// If no event could be found, returns nil +// If there was an issue during the retrieval, returns an error +func (d *SyncServerDatabase) GetStateEvent(evType string, roomID string, stateKey string) (*gomatrixserverlib.Event, error) { + return d.roomstate.selectStateEvent(evType, roomID, stateKey) } // PartitionOffsets implements common.PartitionStorer