From a5ba01eb76b02af6633598a4c2458b44ba6220b9 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Tue, 5 Jan 2021 10:52:12 +0000 Subject: [PATCH] Fix complexity --- appservice/consumers/roomserver.go | 53 +++++++++++++++++------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/appservice/consumers/roomserver.go b/appservice/consumers/roomserver.go index f7d337457..5476d6ecc 100644 --- a/appservice/consumers/roomserver.go +++ b/appservice/consumers/roomserver.go @@ -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) }