refactor: clean up jsdoc for methods

feat: add missing methods from API
Closes #69
This commit is contained in:
Paul Makles
2023-04-11 15:08:36 +01:00
parent 7e721b2751
commit 47ad4c3a47
7 changed files with 468 additions and 15 deletions
+31 -12
View File
@@ -349,22 +349,22 @@ export class Channel {
/**
* Edit a channel
* @param data Edit data
* @param data Changes
*/
async edit(data: DataEditChannel) {
await this.#collection.client.api.patch(`/channels/${this.id as ""}`, data);
}
/**
* Delete a channel
* @param leave_silently Whether to not send a message on leave
* Delete or leave a channel
* @param leaveSilently Whether to not send a message on leave
* @param noRequest Whether to not send a request
* @requires `DM`, `Group`, `TextChannel`, `VoiceChannel`
* @requires `DirectMessage`, `Group`, `TextChannel`, `VoiceChannel`
*/
async delete(leave_silently?: boolean, noRequest?: boolean) {
async delete(leaveSilently?: boolean, noRequest?: boolean) {
if (!noRequest)
await this.#collection.client.api.delete(`/channels/${this.id as ""}`, {
leave_silently,
leave_silently: leaveSilently,
});
if (this.type === "DirectMessage") {
@@ -378,6 +378,7 @@ export class Channel {
/**
* Add a user to a group
* @param user_id ID of the target user
* @requires `Group`
*/
async addMember(user_id: string) {
return await this.#collection.client.api.put(
@@ -388,16 +389,19 @@ export class Channel {
/**
* Remove a user from a group
* @param user_id ID of the target user
* @requires `Group`
*/
async removeMember(user_id: string) {
return await this.#collection.client.api.delete(
`/channels/${this.id as ""}/recipients/${user_id as ""}`
);
}
/**
* Send a message
* @param data Either the message as a string or message sending route data
* @returns The message
* @requires `SavedMessages`, `DirectMessage`, `Group`, `TextChannel`
* @returns Sent message
*/
async sendMessage(
data: string | DataMessageSend,
@@ -426,7 +430,8 @@ export class Channel {
/**
* Fetch a message by its ID
* @param messageId ID of the target message
* @returns The message
* @requires `SavedMessages`, `DirectMessage`, `Group`, `TextChannel`
* @returns Message
*/
async fetchMessage(messageId: string) {
const message = await this.#collection.client.api.get(
@@ -439,7 +444,8 @@ export class Channel {
/**
* Fetch multiple messages from a channel
* @param params Message fetching route data
* @returns The messages
* @requires `SavedMessages`, `DirectMessage`, `Group`, `TextChannel`
* @returns Messages
*/
async fetchMessages(
params?: Omit<
@@ -463,6 +469,7 @@ export class Channel {
/**
* Fetch multiple messages from a channel including the users that sent them
* @param params Message fetching route data
* @requires `SavedMessages`, `DirectMessage`, `Group`, `TextChannel`
* @returns Object including messages and users
*/
async fetchMessagesWithUsers(
@@ -495,7 +502,8 @@ export class Channel {
/**
* Search for messages
* @param params Message searching route data
* @returns The messages
* @requires `SavedMessages`, `DirectMessage`, `Group`, `TextChannel`
* @returns Messages
*/
async search(params: Omit<OptionsMessageSearch, "include_users">) {
const messages = (await this.#collection.client.api.post(
@@ -511,7 +519,8 @@ export class Channel {
/**
* Search for messages including the users that sent them
* @param params Message searching route data
* @returns The messages
* @requires `SavedMessages`, `DirectMessage`, `Group`, `TextChannel`
* @returns Object including messages and users
*/
async searchWithUsers(params: Omit<OptionsMessageSearch, "include_users">) {
const data = (await this.#collection.client.api.post(
@@ -535,17 +544,23 @@ export class Channel {
};
}
/**
* Delete many messages by their IDs
* @param ids List of message IDs
* @requires `SavedMessages`, `DirectMessage`, `Group`, `TextChannel`
*/
async deleteMessages(ids: string[]) {
await this.#collection.client.api.delete(
`/channels/${this.id as ""}/messages/bulk`,
{
data: { ids },
ids,
}
);
}
/**
* Create an invite to the channel
* @requires `TextChannel`, `VoiceChannel`
* @returns Newly created invite code
*/
async createInvite() {
@@ -561,6 +576,7 @@ export class Channel {
* Mark a channel as read
* @param message Last read message or its ID
* @param skipRateLimiter Whether to skip the internal rate limiter
* @requires `SavedMessages`, `DirectMessage`, `Group`, `TextChannel`
*/
async ack(message?: Message | string, skipRateLimiter?: boolean) {
const lastMessageId =
@@ -606,6 +622,7 @@ export class Channel {
* Set role permissions
* @param role_id Role Id, set to 'default' to affect all users
* @param permissions Permission value
* @requires `Group`, `TextChannel`, `VoiceChannel`
*/
async setPermissions(role_id = "default", permissions: Override) {
return await this.#collection.client.api.put(
@@ -616,6 +633,7 @@ export class Channel {
/**
* Start typing in this channel
* @requires `DirectMessage`, `Group`, `TextChannel`
*/
startTyping() {
this.#collection.client.events.send({
@@ -626,6 +644,7 @@ export class Channel {
/**
* Stop typing in this channel
* @requires `DirectMessage`, `Group`, `TextChannel`
*/
stopTyping() {
this.#collection.client.events.send({
+254 -1
View File
@@ -1,6 +1,14 @@
import type { Category } from "revolt-api";
import type {
Category,
DataBanCreate,
DataCreateChannel,
DataEditRole,
DataEditServer,
Override,
} from "revolt-api";
import { decodeTime } from "ulid";
import { ServerMember, User } from "..";
import { ServerCollection } from "../collections";
import { bitwiseAndEq, calculatePermission } from "../permissions/calculator";
import { Permission } from "../permissions/definitions";
@@ -304,4 +312,249 @@ export class Server {
...permission.map((x) => Permission[x])
);
}
/**
* Create a channel
* @param data Channel create route data
* @returns The newly-created channel
*/
async createChannel(data: DataCreateChannel) {
let channel = await this.#collection.client.api.post(
`/servers/${this.id as ""}/channels`,
data
);
return this.#collection.client.channels.getOrCreate(channel._id, channel);
}
/**
* Edit a server
* @param data Changes
*/
async edit(data: DataEditServer) {
await this.#collection.client.api.patch(`/servers/${this.id as ""}`, data);
}
/**
* Delete or leave a server
* @param leaveSilently Whether to not send a message on leave
* @param noRequest Whether to not send a request
*/
async delete(leaveSilently?: boolean, avoidReq?: boolean) {
if (!avoidReq)
await this.#collection.client.api.delete(`/servers/${this.id as ""}`, {
leave_silently: leaveSilently,
});
this.#collection.delete(this.id);
}
/**
* Mark a server as read
*/
async ack() {
await this.#collection.client.api.put(`/servers/${this.id}/ack`);
}
/**
* Ban user from this server
* @param user User
* @param options Ban options
*/
async banUser(user: string | User | ServerMember, options?: DataBanCreate) {
const userId =
user instanceof User
? user.id
: user instanceof ServerMember
? user.id.user
: user;
return await this.#collection.client.api.put(
`/servers/${this.id as ""}/bans/${userId}`,
options
);
}
/**
* Kick user from this server
* @param user User
*/
async kickUser(user: string | User | ServerMember) {
const userId =
user instanceof User
? user.id
: user instanceof ServerMember
? user.id.user
: user;
return await this.#collection.client.api.delete(
`/servers/${this.id as ""}/members/${userId}`
);
}
/**
* Pardon user's ban
* @param user User
*/
async unbanUser(user: string | User) {
const userId = user instanceof User ? user.id : user;
return await this.#collection.client.api.delete(
`/servers/${this.id as ""}/bans/${userId}`
);
}
/**
* Fetch a server's invites
* @returns An array of the server's invites
*/
async fetchInvites() {
return await this.#collection.client.api.get(
`/servers/${this.id as ""}/invites`
);
}
/**
* Fetch a server's bans
* @returns An array of the server's bans.
*/
async fetchBans() {
return await this.#collection.client.api.get(
`/servers/${this.id as ""}/bans`
);
}
/**
* Set role permissions
* @param roleId Role Id, set to 'default' to affect all users
* @param permissions Permission value
*/
async setPermissions(roleId = "default", permissions: Override | number) {
return await this.#collection.client.api.put(
`/servers/${this.id as ""}/permissions/${roleId as ""}`,
{ permissions: permissions as Override }
);
}
/**
* Create role
* @param name Role name
*/
async createRole(name: string) {
return await this.#collection.client.api.post(
`/servers/${this.id as ""}/roles`,
{
name,
}
);
}
/**
* Edit a role
* @param roleId Role ID
* @param data Role editing route data
*/
async editRole(roleId: string, data: DataEditRole) {
return await this.#collection.client.api.patch(
`/servers/${this.id as ""}/roles/${roleId as ""}`,
data
);
}
/**
* Delete role
* @param roleId Role ID
*/
async deleteRole(roleId: string) {
return await this.#collection.client.api.delete(
`/servers/${this.id as ""}/roles/${roleId as ""}`
);
}
/**
* Fetch a server member
* @param user User
* @returns Server member object
*/
async fetchMember(user: User | string) {
const userId = typeof user === "string" ? user : user.id;
const existing = this.#collection.client.serverMembers.getByKey({
server: this.id,
user: userId,
});
if (existing) return existing;
const member = await this.#collection.client.api.get(
`/servers/${this.id as ""}/members/${userId as ""}`
);
return this.#collection.client.serverMembers.getOrCreate(
member._id,
member
);
}
/**
* Optimised member fetch route
* @param excludeOffline
*/
async syncMembers(excludeOffline?: boolean) {
const data = await this.#collection.client.api.get(
`/servers/${this.id as ""}/members`,
{ exclude_offline: excludeOffline }
);
if (excludeOffline) {
for (let i = 0; i < data.users.length; i++) {
const user = data.users[i];
if (user.online) {
this.#collection.client.users.getOrCreate(user._id, user);
this.#collection.client.serverMembers.getOrCreate(
data.members[i]._id,
data.members[i]
);
}
}
} else {
for (let i = 0; i < data.users.length; i++) {
this.#collection.client.users.getOrCreate(
data.users[i]._id,
data.users[i]
);
this.#collection.client.serverMembers.getOrCreate(
data.members[i]._id,
data.members[i]
);
}
}
}
/**
* Fetch a server's members
* @returns List of the server's members and their user objects
*/
async fetchMembers() {
const data = await this.#collection.client.api.get(
`/servers/${this.id as ""}/members`
);
return {
members: data.members.map((member) =>
this.#collection.client.serverMembers.getOrCreate(member._id, member)
),
users: data.users.map((user) =>
this.#collection.client.users.getOrCreate(user._id, user)
),
};
}
/**
* Fetch a server's emoji
* @returns List of server emoji
*/
async fetchEmojis() {
return await this.#collection.client.api.get(
`/servers/${this.id as ""}/emojis`
);
}
}
+32 -1
View File
@@ -1,4 +1,9 @@
import type { MemberCompositeKey } from "revolt-api";
import type {
DataBanCreate,
DataEditMessage,
DataMemberEdit,
MemberCompositeKey,
} from "revolt-api";
import { ServerMemberCollection } from "../collections";
import { bitwiseAndEq, calculatePermission } from "../permissions/calculator";
@@ -200,4 +205,30 @@ export class ServerMember {
this.user?.animatedAvatarURL
);
}
/**
* Edit a member
* @param data Changes
*/
async edit(data: DataMemberEdit) {
await this.#collection.client.api.patch(
`/servers/${this.id.server as ""}/members/${this.id.user as ""}`,
data
);
}
/**
* Ban this member from the server
* @param options Ban options
*/
async ban(options: DataBanCreate) {
this.server?.banUser(this, options);
}
/**
* Kick this member from the server
*/
async kick() {
this.server?.kickUser(this);
}
}
+106
View File
@@ -1,3 +1,4 @@
import { DataEditUser } from "revolt-api";
import { decodeTime } from "ulid";
import { UserCollection } from "../collections";
@@ -164,4 +165,109 @@ export class User {
return permissions;
}
/**
* Edit the user
* @param data Changes
*/
async edit(data: DataEditUser) {
await this.#collection.client.api.patch(
`/users/${
this.id === this.#collection.client.user?.id ? "@me" : this.id
}`,
data
);
}
/**
* Change the username of the current user
* @param username New username
* @param password Current password
*/
async changeUsername(username: string, password: string) {
return await this.#collection.client.api.patch("/users/@me/username", {
username,
password,
});
}
/**
* Open a DM with a user
* @returns DM Channel
*/
async openDM() {
let dm = [...this.#collection.client.channels.values()].find(
(x) => x.type === "DirectMessage" && x.recipient == this
);
if (dm) {
if (!dm.active) {
this.#collection.client.channels.updateUnderlyingObject(
dm.id,
"active",
true
);
}
} else {
const data = await this.#collection.client.api.get(
`/users/${this.id as ""}/dm`
);
dm = this.#collection.client.channels.getOrCreate(data._id, data)!;
}
return dm;
}
/**
* Send a friend request to a user
*/
async addFriend() {
const user = await this.#collection.client.api.post(`/users/friend`, {
username: this.username,
});
return this.#collection.getOrCreate(user._id, user);
}
/**
* Remove a user from the friend list
*/
async removeFriend() {
await this.#collection.client.api.delete(`/users/${this.id as ""}/friend`);
}
/**
* Block a user
*/
async blockUser() {
await this.#collection.client.api.put(`/users/${this.id as ""}/block`);
}
/**
* Unblock a user
*/
async unblockUser() {
await this.#collection.client.api.delete(`/users/${this.id as ""}/block`);
}
/**
* Fetch the profile of a user
* @returns The profile of the user
*/
async fetchProfile() {
return await this.#collection.client.api.get(
`/users/${this.id as ""}/profile`
);
}
/**
* Fetch the mutual connections of the current user and a target user
* @returns The mutual connections of the current user and a target user
*/
async fetchMutual() {
return await this.#collection.client.api.get(
`/users/${this.id as ""}/mutual`
);
}
}
+16 -1
View File
@@ -1,4 +1,4 @@
import { API, Channel } from "..";
import { API, Channel, User } from "..";
import { HydratedChannel } from "../hydration";
import { ClassCollection } from ".";
@@ -62,4 +62,19 @@ export class ChannelCollection extends ClassCollection<
return instance;
}
}
/**
* Create a group
* @param name Group name
* @param users Users to add
* @returns The newly-created group
*/
async createGroup(name: string, users: (User | string)[]) {
const group = await this.client.api.post(`/channels/create`, {
name,
users: users.map((user) => (user instanceof User ? user.id : user)),
});
return this.getOrCreate(group._id, group, true);
}
}
+9
View File
@@ -57,4 +57,13 @@ export class MessageCollection extends ClassCollection<
return instance;
}
}
/**
* Globally fetch messages
* @requires Admin
* @param query Message query
*/
async queryMessages(query: API.MessageQuery) {
return this.client.api.post("/admin/messages", query);
}
}
+20
View File
@@ -1,3 +1,5 @@
import { DataCreateServer } from "revolt-api";
import { API, Server } from "..";
import { HydratedServer } from "../hydration";
@@ -49,4 +51,22 @@ export class ServerCollection extends ClassCollection<Server, HydratedServer> {
return instance;
}
}
/**
* Create a server
* @param data Server options
* @returns The newly-created server
*/
async createServer(data: DataCreateServer) {
const { server, channels } = await this.client.api.post(
`/servers/create`,
data
);
for (const channel of channels) {
this.client.channels.getOrCreate(channel._id, channel);
}
return this.getOrCreate(server._id, server, true);
}
}