Try QueryMembershipForUser instead

This commit is contained in:
Neil Alexander 2021-03-03 12:21:47 +00:00
parent 1c5de02615
commit 74cfc37116
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944
2 changed files with 7 additions and 34 deletions

View file

@ -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(),

View file

@ -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