@rocket.chat/forked-matrix-bot-sdk
Version:
TypeScript/JavaScript SDK for Matrix bots and appservices
296 lines (268 loc) • 12.8 kB
text/typescript
import { MatrixClient } from "./MatrixClient";
import { MSC2380MediaInfo } from "./models/unstable/MediaInfo";
/**
* Represents a profile for a group
* @category Unstable APIs
*/
export interface GroupProfile {
/**
* The name of the group
*/
name: string;
/**
* The avatar for the group. Must be a MSC URI.
*/
avatar_url: string;
/**
* The short description for the group. Equivalent to a room's topic.
*/
short_description: string;
/**
* The long description for the group. Most clients will support HTML
* in this.
*/
long_description: string;
}
/**
* Unstable APIs that shouldn't be used in most circumstances.
* @category Unstable APIs
*/
export class UnstableApis {
constructor(private client: MatrixClient) {
}
/**
* Gets the local room aliases that are published for a given room.
* @param {string} roomId The room ID to get local aliases for.
* @returns {Promise<string[]>} Resolves to the aliases on the room, or an empty array.
* @deprecated Relies on MSC2432 endpoint.
*/
public async getRoomAliases(roomId: string): Promise<string[]> {
const r = await this.client.doRequest("GET", "/_matrix/client/unstable/org.matrix.msc2432/rooms/" + encodeURIComponent(roomId) + "/aliases");
return r['aliases'] || [];
}
/**
* Creates a group.
* @param {string} localpart The localpart for the group
* @return {Promise<string>} Resolves to the created group ID.
*/
public async createGroup(localpart: string): Promise<string> {
const response = await this.client.doRequest("POST", "/_matrix/client/unstable/create_group", null, {"localpart": localpart});
return response["group_id"];
}
/**
* Invites a user to the group.
* @param {string} groupId The group ID to invite the user to.
* @param {string} userId The user ID to invite to the group.
* @return {Promise<"join" | "invite" | "reject">} Resolves to the invite state for
* the user. This is normally "invite", but may be "join" or "reject" if the user's
* homeserver accepted/rejected the invite right away.
*/
public async inviteUserToGroup(groupId: string, userId: string): Promise<"join" | "invite" | "reject"> {
const response = await this.client.doRequest("PUT", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/admin/users/invite/${encodeURIComponent(userId)}`, null, {});
return response["state"];
}
/**
* Kicks a user from a group.
* @param {string} groupId The group ID to kick the user from.
* @param {string} userId The user ID to kick from the group.
* @return {Promise<any>} Resolves when completed.
*/
public async kickUserFromGroup(groupId: string, userId: string): Promise<any> {
return this.client.doRequest("PUT", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/admin/users/remove/${encodeURIComponent(userId)}`, null, {});
}
/**
* Updates a group's profile
* @param {string} groupId The group ID to update.
* @param {GroupProfile} profile The profile to update the group with.
* @return {Promise<any>} Resolves when completed.
*/
public async setGroupProfile(groupId: string, profile: GroupProfile): Promise<any> {
return this.client.doRequest("POST", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/profile`, null, profile);
}
/**
* Sets a group's join policy to either be publicly joinable (open) or
* require an invite (invite).
* @param {string} groupId The group ID to set the policy for.
* @param {"open" | "invite"} policy The policy to set.
* @return {Promise<any>} Resolves when completed.
*/
public async setGroupJoinPolicy(groupId: string, policy: "open" | "invite"): Promise<any> {
return this.client.doRequest("PUT", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/settings/m.join_policy`, null, {
"m.join_policy": {
"type": policy,
},
});
}
/**
* Adds a room to a group.
* @param {string} groupId The group ID to add the room to.
* @param {string} roomId The room ID to add to the group.
* @param {boolean} isPublic Whether this group-room association is visible to non-members. Optional. Defaults to true.
* @return {Promise<any>} Resolves when completed.
*/
public async addRoomToGroup(groupId: string, roomId: string, isPublic = true): Promise<any> {
return this.client.doRequest("PUT", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/admin/rooms/${encodeURIComponent(roomId)}`, null, {
"m.visibility": {type: isPublic ? "public" : "private"},
});
}
/**
* Updates the visibility of a room in a group.
* @param {string} groupId The group ID of the room to update.
* @param {string} roomId The room ID of the room to update.
* @param {boolean} isPublic Whether this group-room association is visible to non-members.
* @return {Promise<any>} Resolves when completed.
*/
public async updateGroupRoomVisibility(groupId: string, roomId: string, isPublic: boolean): Promise<any> {
return this.client.doRequest("PUT", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/admin/rooms/${encodeURIComponent(roomId)}/config/m.visibility`, null, {
type: isPublic ? "public" : "private",
});
}
/**
* Removes a room from a group.
* @param {string} groupId The group ID to remove the room from.
* @param {string} roomId The room ID to remove from the group.
* @return {Promise<any>} Resolves when completed.
*/
public async removeRoomFromGroup(groupId: string, roomId: string): Promise<any> {
return this.client.doRequest("DELETE", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/admin/rooms/${encodeURIComponent(roomId)}`);
}
/**
* Gets a group's profile.
* @param {string} groupId The group ID to fetch the profile of.
* @return {Promise<GroupProfile>} Resolves to the profile of the group.
*/
public async getGroupProfile(groupId: string): Promise<GroupProfile> {
return this.client.doRequest("GET", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/profile`);
}
/**
* Gets the users in a group.
* @param {string} groupId The group ID of which to get the users.
* @return {Promise<any[]>} Resolves to an array of all the users in the group.
*/
public async getGroupUsers(groupId: string): Promise<any[]> {
const response = await this.client.doRequest("GET", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/users`);
return response["chunk"];
}
/**
* Gets the invited users of a group.
* @param {string} groupId The group ID of which to get the invited users.
* @return {Promise<any[]>} Resolves to an array of all the users invited to the group.
*/
public async getGroupInvitedUsers(groupId: string): Promise<any[]> {
const response = await this.client.doRequest("GET", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/invited_users`);
return response["chunk"];
}
/**
* Gets the rooms of a group.
* @param {string} groupId The group ID of which to get all the rooms.
* @return {Promise<any[]>} Resolves to an array of all the rooms of the group.
*/
public async getGroupRooms(groupId: string): Promise<any[]> {
const response = await this.client.doRequest("GET", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/rooms`);
return response["chunk"];
}
/**
* Accepts an invite to a group.
* @param {string} groupId The group ID of which to accept the invite of.
* @return {Promise<any>} Resolves when completed.
*/
public async acceptGroupInvite(groupId: string): Promise<any> {
return this.client.doRequest("PUT", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/self/accept_invite`, null, {});
}
/**
* Joins a group.
* @param {string} groupId The group ID to join.
* @return {Promise<any>} Resolves when completed.
*/
public async joinGroup(groupId: string): Promise<any> {
return this.client.doRequest("PUT", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/self/join`, null, {});
}
/**
* Leaves a group.
* @param {string} groupId The group ID of the group to leave.
* @return {Promise<any>} Resolves when completed.
*/
public async leaveGroup(groupId: string): Promise<any> {
return this.client.doRequest("PUT", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/self/leave`, null, {});
}
/**
* Sets the publicity of a group.
* @param {string} groupId The group ID to set the publicity of.
* @param {boolean} publicise If the group should be publicised.
* @return {Promise<any>} Resolves when completed.
*/
public async setGroupPublicity(groupId: string, publicise: boolean): Promise<any> {
return this.client.doRequest("PUT", `/_matrix/client/unstable/groups/${encodeURIComponent(groupId)}/self/update_publicity`, null, {
publicise,
});
}
/**
* Gets all group IDs joined.
* @return {Promise<string[]>} Resolves to the group IDs of the joined groups.
*/
public async getJoinedGroups(): Promise<string[]> {
const response = await this.client.doRequest("GET", "/_matrix/client/unstable/joined_groups");
return response["groups"];
}
/**
* Gets the group IDs that the specified user has publicised.
* @param {string} userId The user ID to fetch the publicised groups of.
* @return {Promise<string[]>} Resolves to the publicised group IDs of that user.
*/
public async getPublicisedGroups(userId: string): Promise<string[]> {
const response = await this.client.doRequest("GET", `/_matrix/client/unstable/publicised_groups/${encodeURIComponent(userId)}`);
return response["groups"];
}
/**
* Adds a reaction to an event. The contract for this function may change in the future.
* @param {string} roomId The room ID to react in
* @param {string} eventId The event ID to react against, in the given room
* @param {string} emoji The emoji to react with
* @returns {Promise<string>} Resolves to the event ID of the reaction
*/
public async addReactionToEvent(roomId: string, eventId: string, emoji: string): Promise<string> {
return this.client.sendEvent(roomId, "m.reaction", {
"m.relates_to": {
event_id: eventId,
key: emoji,
rel_type: "m.annotation",
},
});
}
/**
* Get relations for a given event.
* @param {string} roomId The room ID to for the given event.
* @param {string} eventId The event ID to list reacations for.
* @param {string?} relationType The type of reaction (e.g. `m.room.member`) to filter for. Optional.
* @param {string?} eventType The type of event to look for (e.g. `m.room.member`). Optional.
* @returns {Promise<{original_event: any, chunk: any[]}>} Resolves a object containing the original event, and a chunk of relations
*/
public async getRelationsForEvent(roomId: string, eventId: string, relationType?: string, eventType?: string): Promise<{original_event: any, chunk: any[]}> {
let url = `/_matrix/client/unstable/rooms/${roomId}/relations/${eventId}`;
if (relationType) {
url += `/${relationType}`;
}
if (eventType) {
url += `/${eventType}`;
}
return this.client.doRequest("GET", url);
}
/**
* Get information about a media item. Implements MSC2380
* @param {string} mxc The MXC to get information about.
* @returns {Promise<MSC2380MediaInfo>} Resolves a object containing the media information.
*/
public async getMediaInfo(mxcUrl: string): Promise<MSC2380MediaInfo> {
if (!mxcUrl.toLowerCase().startsWith("mxc://")) {
throw Error("'mxcUrl' does not begin with mxc://");
}
const [domain, mediaId] = mxcUrl.substr("mxc://".length).split("/");
if (!domain || !mediaId) {
throw Error('Missing domain');
}
if (!mediaId) {
throw Error('Missing mediaId');
}
return this.client.doRequest("GET", `/_matrix/media/unstable/info/${encodeURIComponent(domain)}/${encodeURIComponent(mediaId)}`);
}
}