Fix complexity

This commit is contained in:
Will Hunt 2021-01-05 10:52:12 +00:00
parent 50ba0cce78
commit a5ba01eb76

View file

@ -123,6 +123,35 @@ func (s *OutputRoomEventConsumer) filterRoomserverEvents(
return nil
}
// appserviceHasMembershipInRoom returns a boolean depending on whether a given
// appservice has membership at the time a given event was created.
func (s *OutputRoomEventConsumer) appserviceHasMembershipForEvent(ctx context.Context, event *gomatrixserverlib.HeaderedEvent, appservice config.ApplicationService) bool {
// Check if any of the members in the room match the appservice
membershipReq := api.QueryStateAfterEventsRequest{
PrevEventIDs: []string{event.EventID()},
RoomID: event.RoomID(),
}
var membershipRes api.QueryStateAfterEventsResponse
// XXX: This could potentially race if the state for the event is not known yet
// e.g. the event came over federation but we do not have the full state persisted.
if err := s.rsAPI.QueryStateAfterEvents(ctx, &membershipReq, &membershipRes); err == nil {
for _, ev := range membershipRes.StateEvents {
if ev.Type() == gomatrixserverlib.MRoomMember {
var membership, _ = ev.Membership()
if membership == gomatrixserverlib.Join && appservice.IsInterestedInUserID(*ev.StateKey()) {
return true
}
}
}
} else {
log.WithFields(log.Fields{
"room_id": event.RoomID(),
}).WithError(err).Errorf("Unable to get membership for room")
}
return false
}
// appserviceIsInterestedInEvent returns a boolean depending on whether a given
// event falls within one of a given application service's namespaces.
//
@ -162,27 +191,5 @@ func (s *OutputRoomEventConsumer) appserviceIsInterestedInEvent(ctx context.Cont
}
// Check if any of the members in the room match the appservice
membershipReq := api.QueryStateAfterEventsRequest{
PrevEventIDs: []string{event.EventID()},
RoomID: event.RoomID(),
}
var membershipRes api.QueryStateAfterEventsResponse
// XXX: This could potentially race if the state for the event is not known yet
// e.g. the event came over federation but we do not have the full state persisted.
if err := s.rsAPI.QueryStateAfterEvents(ctx, &membershipReq, &membershipRes); err == nil {
for _, ev := range membershipRes.StateEvents {
if ev.Type() == gomatrixserverlib.MRoomMember {
var membership, _ = ev.Membership()
if membership == gomatrixserverlib.Join && appservice.IsInterestedInUserID(*ev.StateKey()) {
return true
}
}
}
} else {
log.WithFields(log.Fields{
"room_id": event.RoomID(),
}).WithError(err).Errorf("Unable to get membership for room")
}
return false
return s.appserviceHasMembershipForEvent(ctx, event, appservice)
}