Use event type to detect duplicate joins

This commit is contained in:
Brendan Abolivier 2017-08-17 15:19:08 +01:00
parent ab2aae2862
commit fe47ed6051
No known key found for this signature in database
GPG key ID: 8EF1500759F70623
2 changed files with 28 additions and 16 deletions

View file

@ -83,12 +83,19 @@ func (s *OutputRoomEvent) onMessage(msg *sarama.ConsumerMessage) error {
"type": ev.Type(), "type": ev.Type(),
}).Info("received event from roomserver") }).Info("received event from roomserver")
queryReq := api.QueryEventsByIDRequest{output.NewRoomEvent.AddsStateEventIDs} addQueryReq := api.QueryEventsByIDRequest{output.NewRoomEvent.AddsStateEventIDs}
var queryRes api.QueryEventsByIDResponse var addQueryRes api.QueryEventsByIDResponse
if err := s.query.QueryEventsByID(&queryReq, &queryRes); err != nil { if err := s.query.QueryEventsByID(&addQueryReq, &addQueryRes); err != nil {
log.Warn(err) log.Warn(err)
return err return err
} }
return s.db.UpdateRoomFromEvents(queryRes.Events, output.NewRoomEvent.RemovesStateEventIDs) remQueryReq := api.QueryEventsByIDRequest{output.NewRoomEvent.RemovesStateEventIDs}
var remQueryRes api.QueryEventsByIDResponse
if err := s.query.QueryEventsByID(&remQueryReq, &remQueryRes); err != nil {
log.Warn(err)
return err
}
return s.db.UpdateRoomFromEvents(addQueryRes.Events, remQueryRes.Events)
} }

View file

@ -93,13 +93,14 @@ func (d *PublicRoomsServerDatabase) GetPublicRooms(offset int64, limit int16, fi
// UpdateRoomFromEvents iterate over a slice of state events and call // UpdateRoomFromEvents iterate over a slice of state events and call
// UpdateRoomFromEvent on each of them to update the database representation of // UpdateRoomFromEvent on each of them to update the database representation of
// the rooms updated by each event. // the rooms updated by each event.
// The slice of events to remove is used to process membership events.
// If the update triggered by one of the events failed, aborts the process and // If the update triggered by one of the events failed, aborts the process and
// returns an error. // returns an error.
func (d *PublicRoomsServerDatabase) UpdateRoomFromEvents( func (d *PublicRoomsServerDatabase) UpdateRoomFromEvents(
eventsToAdd []gomatrixserverlib.Event, iDsToRemove []string, eventsToAdd []gomatrixserverlib.Event, eventsToRemove []gomatrixserverlib.Event,
) error { ) error {
for _, event := range eventsToAdd { for _, event := range eventsToAdd {
if err := d.UpdateRoomFromEvent(event, iDsToRemove); err != nil { if err := d.UpdateRoomFromEvent(event, eventsToRemove); err != nil {
return err return err
} }
} }
@ -110,11 +111,12 @@ func (d *PublicRoomsServerDatabase) UpdateRoomFromEvents(
// UpdateRoomFromEvent updates the database representation of a room from a Matrix event, by // UpdateRoomFromEvent updates the database representation of a room from a Matrix event, by
// checking the event's type to know which attribute to change and using the event's content // checking the event's type to know which attribute to change and using the event's content
// to define the new value of the attribute. // to define the new value of the attribute.
// The slice of events to remove is used to process membership events.
// If the event doesn't match with any property used to compute the public room directory, // If the event doesn't match with any property used to compute the public room directory,
// does nothing. // does nothing.
// If something went wrong during the process, returns an error. // If something went wrong during the process, returns an error.
func (d *PublicRoomsServerDatabase) UpdateRoomFromEvent( func (d *PublicRoomsServerDatabase) UpdateRoomFromEvent(
event gomatrixserverlib.Event, iDsToRemove []string, event gomatrixserverlib.Event, eventsToRemove []gomatrixserverlib.Event,
) error { ) error {
roomID := event.RoomID() roomID := event.RoomID()
@ -123,7 +125,7 @@ func (d *PublicRoomsServerDatabase) UpdateRoomFromEvent(
case "m.room.create": case "m.room.create":
return d.statements.insertNewRoom(roomID) return d.statements.insertNewRoom(roomID)
case "m.room.member": case "m.room.member":
return d.updateNumJoinedUsers(event, iDsToRemove, roomID) return d.updateNumJoinedUsers(event, eventsToRemove, roomID)
case "m.room.aliases": case "m.room.aliases":
return d.updateRoomAliases(event, roomID) return d.updateRoomAliases(event, roomID)
case "m.room.canonical_alias": case "m.room.canonical_alias":
@ -166,10 +168,11 @@ func (d *PublicRoomsServerDatabase) UpdateRoomFromEvent(
// updateNumJoinedUsers updates the number of joined user in the database representation // updateNumJoinedUsers updates the number of joined user in the database representation
// of the room identified by a given room ID, using a given Matrix event. // of the room identified by a given room ID, using a given Matrix event.
// If the event's membership is "join", increments the value, if not, decrements it. // If the event's membership is "join", increments the value if the event isn't an update,
// if not, decrements it.
// Returns an error if the update failed. // Returns an error if the update failed.
func (d *PublicRoomsServerDatabase) updateNumJoinedUsers( func (d *PublicRoomsServerDatabase) updateNumJoinedUsers(
membershipEvent gomatrixserverlib.Event, iDsToRemove []string, roomID string, membershipEvent gomatrixserverlib.Event, eventsToRemove []gomatrixserverlib.Event, roomID string,
) error { ) error {
membership, err := membershipEvent.Membership() membership, err := membershipEvent.Membership()
if err != nil { if err != nil {
@ -177,12 +180,14 @@ func (d *PublicRoomsServerDatabase) updateNumJoinedUsers(
} }
if membership == "join" { if membership == "join" {
if len(iDsToRemove) > 0 { for _, event := range eventsToRemove {
// This is an update for an user who already joined the room, most if event.Type() == "m.room.member" {
// likely triggered by a profile update. We don't increment the // This is an update for an user who already joined the room, most
// number of joined member in this case because we already counted // likely triggered by a profile update. We don't increment the
// this user. // number of joined member in this case because we already counted
return nil // this user.
return nil
}
} }
return d.statements.incrementJoinedMembersInRoom(roomID) return d.statements.incrementJoinedMembersInRoom(roomID)
} else if membership == "leave" || membership == "ban" { } else if membership == "leave" || membership == "ban" {