From 74cfc371164b2424596b02a13a66d72d641f6c43 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Wed, 3 Mar 2021 12:21:47 +0000 Subject: [PATCH] Try QueryMembershipForUser instead --- appservice/consumers/roomserver.go | 23 +++++++---------------- roomserver/internal/query/query.go | 18 ------------------ 2 files changed, 7 insertions(+), 34 deletions(-) diff --git a/appservice/consumers/roomserver.go b/appservice/consumers/roomserver.go index 6a089b8ea..eb4b8aeb2 100644 --- a/appservice/consumers/roomserver.go +++ b/appservice/consumers/roomserver.go @@ -17,6 +17,7 @@ package consumers import ( "context" "encoding/json" + "fmt" "github.com/matrix-org/dendrite/appservice/storage" "github.com/matrix-org/dendrite/appservice/types" @@ -133,26 +134,16 @@ func (s *OutputRoomEventConsumer) appserviceJoinedAtEvent(ctx context.Context, e // the event in question. Pretty sure this is what Synapse does too, but // until we have a lighter way of checking the state before the event that // doesn't involve state res, then this is probably OK. - membershipReq := &api.QueryMembershipsForRoomRequest{ - JoinedOnly: true, - RoomID: event.RoomID(), + membershipReq := &api.QueryMembershipForUserRequest{ + RoomID: event.RoomID(), + UserID: fmt.Sprintf("@%s:%s", appservice.SenderLocalpart, s.serverName), } - membershipRes := &api.QueryMembershipsForRoomResponse{} + membershipRes := &api.QueryMembershipForUserResponse{} // 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.QueryMembershipsForRoom(ctx, membershipReq, membershipRes); err == nil { - for _, ev := range membershipRes.JoinEvents { - if ev.Type == gomatrixserverlib.MRoomMember { - var membership gomatrixserverlib.MemberContent - if err = json.Unmarshal(ev.Content, &membership); err != nil || ev.StateKey == nil { - continue - } - if membership.Membership == gomatrixserverlib.Join && appservice.IsInterestedInUserID(*ev.StateKey) { - return true - } - } - } + if err := s.rsAPI.QueryMembershipForUser(ctx, membershipReq, membershipRes); err == nil { + return membershipRes.IsInRoom } else { log.WithFields(log.Fields{ "room_id": event.RoomID(), diff --git a/roomserver/internal/query/query.go b/roomserver/internal/query/query.go index ec8f7e1b5..3aa51726e 100644 --- a/roomserver/internal/query/query.go +++ b/roomserver/internal/query/query.go @@ -243,24 +243,6 @@ func (r *Queryer) QueryMembershipsForRoom( return err } - if request.Sender == "" { - var events []types.Event - var eventNIDs []types.EventNID - eventNIDs, err = r.DB.GetMembershipEventNIDsForRoom(ctx, info.RoomNID, request.JoinedOnly, false) - if err != nil { - return fmt.Errorf("r.DB.GetMembershipEventNIDsForRoom: %w", err) - } - events, err = r.DB.Events(ctx, eventNIDs) - if err != nil { - return fmt.Errorf("r.DB.Events: %w", err) - } - for _, event := range events { - clientEvent := gomatrixserverlib.ToClientEvent(event.Event, gomatrixserverlib.FormatAll) - response.JoinEvents = append(response.JoinEvents, clientEvent) - } - return nil - } - membershipEventNID, stillInRoom, isRoomforgotten, err := r.DB.GetMembership(ctx, info.RoomNID, request.Sender) if err != nil { return err