Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Follow Matrix spec for MatrixClient.getRoomMembers arguments #254

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 39 additions & 3 deletions src/MatrixClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1073,6 +1073,23 @@ export class MatrixClient extends EventEmitter {
return (await this.doRequest("GET", "/_matrix/client/v3/rooms/" + encodeURIComponent(roomId) + "/joined_members")).joined;
}

/**
* Gets the membership events of users in the room. Defaults to all membership
* types, though this can be controlled with the membership and notMembership
* arguments. To change the point in time, use the batchToken.
* @param {string} roomId The room ID to get members in.
* @param {string} batchToken The point in time to get members at (or null for 'now')
* @param {Membership} membership The membership kind to search for.
* @param {Membership} notMembership The membership kind to not search for.
* @returns {Promise<MembershipEvent[]>} Resolves to the membership events of the users in the room.
*/
public getRoomMembers(
roomId: string,
batchToken?: string,
membership?: Membership,
notMembership?: Membership,
): Promise<MembershipEvent[]>;

/**
* Gets the membership events of users in the room. Defaults to all membership
* types, though this can be controlled with the membership and notMembership
Expand All @@ -1081,9 +1098,28 @@ export class MatrixClient extends EventEmitter {
* @param {string} batchToken The point in time to get members at (or null for 'now')
* @param {string[]} membership The membership kinds to search for.
* @param {string[]} notMembership The membership kinds to not search for.
* @returns {Promise<any[]>} Resolves to the membership events of the users in the room.
*/
public getRoomMembers(roomId: string, batchToken: string = null, membership: Membership[] = null, notMembership: Membership[] = null): Promise<MembershipEvent[]> {
* @returns {Promise<MembershipEvent[]>} Resolves to the membership events of the users in the room.
* @deprecated The method should not be used, because the Matrix API doesn't allow to filter for multiple membership kinds.
*/
public getRoomMembers(
roomId: string,
batchToken?: string,
membership?: Membership[],
notMembership?: Membership[],
): Promise<MembershipEvent[]>;

public getRoomMembers(
roomId: string,
batchToken?: string,
membership?: Membership | Membership[],
notMembership?: Membership | Membership[],
): Promise<MembershipEvent[]> {
if (membership?.length > 1) {
LogService.warn("MatrixClientLite", "getRoomMembers called with multiple membership kinds.");
}
if (notMembership?.length > 1) {
LogService.warn("MatrixClientLite", "getRoomMembers called with multiple notMembership kinds.");
}
const qs = {};
if (batchToken) qs["at"] = batchToken;
if (membership) qs["membership"] = membership;
Expand Down
2 changes: 1 addition & 1 deletion src/e2ee/CryptoClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ export class CryptoClient {
if (membership.effectiveMembership !== 'join' && membership.effectiveMembership !== 'invite') return;
await this.engine.addTrackedUsers([membership.membershipFor]);
} else if (event['type'] === 'm.room.encryption') {
const members = await this.client.getRoomMembers(roomId, null, ['join', 'invite']);
const members = await this.client.getRoomMembers(roomId, null, null, 'leave');
await this.engine.addTrackedUsers(members.map(e => e.membershipFor));
}
}
Expand Down
10 changes: 5 additions & 5 deletions test/MatrixClientTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3080,18 +3080,18 @@ describe('MatrixClient', () => {
},
},
];
const forMemberships: Membership[] = ['join', 'leave'];
const forNotMemberships: Membership[] = ['ban'];
const forMembership: Membership = 'join';
const forNotMembership: Membership = 'ban';

// noinspection TypeScriptValidateJSTypes
http.when("GET", "/_matrix/client/v3/rooms").respond(200, (path, content, req) => {
expect(path).toEqual(`${hsUrl}/_matrix/client/v3/rooms/${encodeURIComponent(roomId)}/members`);
expectArrayEquals(forMemberships, (req.queryParams as any).membership);
expectArrayEquals(forNotMemberships, (req.queryParams as any).not_membership);
expect(forMembership).toEqual((req.queryParams as any).membership);
expect(forNotMembership).toEqual((req.queryParams as any).not_membership);
return { chunk: memberEvents };
});

const [result] = await Promise.all([client.getRoomMembers(roomId, null, forMemberships, forNotMemberships), http.flushAllExpected()]);
const [result] = await Promise.all([client.getRoomMembers(roomId, null, forMembership, forNotMembership), http.flushAllExpected()]);
expect(result).toBeDefined();
expect(result.length).toBe(2);
expect(result[0].membership).toBe(memberEvents[0]['content']['membership']);
Expand Down
4 changes: 2 additions & 2 deletions test/encryption/CryptoClientTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -529,10 +529,10 @@ describe('CryptoClient', () => {

const roomId = "!room:example.org";
const prom2 = new Promise<void>(extResolve => {
client.getRoomMembers = simple.mock().callFn((rid, token, memberships) => {
client.getRoomMembers = simple.mock().callFn((rid, token, _membership, notMembership) => {
expect(rid).toEqual(roomId);
expect(token).toBeFalsy();
expect(memberships).toEqual(["join", "invite"]);
expect(notMembership).toEqual("leave");
extResolve();
return Promise.resolve(targetUserIds.map(u => new MembershipEvent({
type: "m.room.member",
Expand Down