diff --git a/appservice/consumers/roomserver.go b/appservice/consumers/roomserver.go index eb4b8aeb2..cc2714c16 100644 --- a/appservice/consumers/roomserver.go +++ b/appservice/consumers/roomserver.go @@ -17,7 +17,6 @@ package consumers import ( "context" "encoding/json" - "fmt" "github.com/matrix-org/dendrite/appservice/storage" "github.com/matrix-org/dendrite/appservice/types" @@ -134,16 +133,26 @@ 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.QueryMembershipForUserRequest{ - RoomID: event.RoomID(), - UserID: fmt.Sprintf("@%s:%s", appservice.SenderLocalpart, s.serverName), + membershipReq := &api.QueryMembershipsForRoomRequest{ + RoomID: event.RoomID(), + JoinedOnly: true, } - membershipRes := &api.QueryMembershipForUserResponse{} + membershipRes := &api.QueryMembershipsForRoomResponse{} // 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.QueryMembershipForUser(ctx, membershipReq, membershipRes); err == nil { - return membershipRes.IsInRoom + 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 + } + } + } } else { log.WithFields(log.Fields{ "room_id": event.RoomID(), diff --git a/roomserver/internal/query/query.go b/roomserver/internal/query/query.go index 3aa51726e..ec8f7e1b5 100644 --- a/roomserver/internal/query/query.go +++ b/roomserver/internal/query/query.go @@ -243,6 +243,24 @@ 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