feat: $exists helper method on classes

refactor: split ServerDelete into ServerDelete / ServerLeave
This commit is contained in:
Paul Makles
2023-11-29 10:31:59 +00:00
parent 53dbec7a40
commit a1324462c5
12 changed files with 127 additions and 18 deletions
+1
View File
@@ -68,6 +68,7 @@ type Events = {
serverCreate(server: Server): void;
serverUpdate(server: Server, previousServer: HydratedServer): void;
serverDelete(server: HydratedServer): void;
serverLeave(server: HydratedServer): void;
serverRoleUpdate(server: Server, roleId: string, previousRole: Role): void;
serverRoleDelete(server: Server, roleId: string, role: Role): void;
+7
View File
@@ -28,6 +28,13 @@ export class Bot {
return `<@${this.id}>`;
}
/**
* Whether this object exists
*/
get $exists() {
return !!this.#collection.getUnderlyingObject(this.id).id;
}
/**
* Time when this user created their account
*/
+7
View File
@@ -42,6 +42,13 @@ export class Channel {
return `<#${this.id}>`;
}
/**
* Whether this object exists
*/
get $exists() {
return !!this.#collection.getUnderlyingObject(this.id).id;
}
/**
* Time when this server was created
*/
+7
View File
@@ -17,6 +17,13 @@ export class ChannelUnread {
this.id = id;
}
/**
* Whether this object exists
*/
get $exists() {
return !!this.#collection.getUnderlyingObject(this.id).id;
}
/**
* Last read message id
*/
+7
View File
@@ -20,6 +20,13 @@ export class ChannelWebhook {
this.id = id;
}
/**
* Whether this object exists
*/
get $exists() {
return !!this.#collection.getUnderlyingObject(this.id).id;
}
/**
* Webhook name
*/
+7
View File
@@ -27,6 +27,13 @@ export class Emoji {
return `:${this.id}:`;
}
/**
* Whether this object exists
*/
get $exists() {
return !!this.#collection.getUnderlyingObject(this.id).id;
}
/**
* Time when this emoji was created
*/
+7
View File
@@ -25,6 +25,13 @@ export class Message {
this.id = id;
}
/**
* Whether this object exists
*/
get $exists() {
return !!this.#collection.getUnderlyingObject(this.id).id;
}
/**
* Time when this message was posted
*/
+35 -8
View File
@@ -47,6 +47,13 @@ export class Server {
return `<%${this.id}>`;
}
/**
* Whether this object exists
*/
get $exists() {
return !!this.#collection.getUnderlyingObject(this.id).id;
}
/**
* Time when this server was created
*/
@@ -378,6 +385,33 @@ export class Server {
);
}
/**
* Delete the underlying server
* @param leaveEvent Whether we are leaving
*/
$delete(leaveEvent?: boolean) {
batch(() => {
const server = this.#collection.client.servers.getUnderlyingObject(
this.id
);
// Avoid race conditions
if (server.id) {
this.#collection.client.emit(
leaveEvent ? "serverLeave" : "serverDelete",
server
);
for (const channel of this.channelIds) {
this.#collection.client.channels.delete(channel);
}
this.#collection.delete(this.id);
}
// TODO: delete members, emoji, etc
});
}
/**
* Delete or leave a server
* @param leaveSilently Whether to not send a message on leave
@@ -387,7 +421,7 @@ export class Server {
leave_silently: leaveSilently,
});
this.#collection.delete(this.id);
this.$delete();
}
/**
@@ -432,13 +466,6 @@ export class 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}`
);
+7
View File
@@ -45,6 +45,13 @@ export class ServerMember {
return `<@${this.id.user}>`;
}
/**
* Whether this object exists
*/
get $exists() {
return !this.#collection.getUnderlyingObject(key(this.id)).id;
}
/**
* Server this member belongs to
*/
+7
View File
@@ -27,6 +27,13 @@ export class Session {
return this.name;
}
/**
* Whether this object exists
*/
get $exists() {
return !!this.#collection.getUnderlyingObject(this.id).id;
}
/**
* Time when this session was created
*/
+7
View File
@@ -29,6 +29,13 @@ export class User {
return `<@${this.id}>`;
}
/**
* Whether this object exists
*/
get $exists() {
return !!this.#collection.getUnderlyingObject(this.id).id;
}
/**
* Time when this user created their account
*/
+28 -10
View File
@@ -202,6 +202,10 @@ export async function handleEvent(
event: ServerMessage,
setReady: Setter<boolean>
) {
if (client.options.debug) {
console.debug("[S->C]", event);
}
switch (event.type) {
case "Bulk": {
for (const item of event.v) {
@@ -554,16 +558,10 @@ export async function handleEvent(
break;
}
case "ServerDelete": {
if (client.servers.getOrPartial(event.id)) {
batch(() => {
const server = client.servers.getUnderlyingObject(event.id);
client.emit("serverDelete", server);
client.servers.delete(event.id);
for (const channel of server.channelIds) {
client.channels.delete(channel);
}
});
const server = client.servers.getOrPartial(event.id);
if (server) {
// TODO: server should tell us if it's a leave or delete on our end
server.$delete();
}
break;
}
@@ -603,6 +601,12 @@ export async function handleEvent(
};
if (!client.serverMembers.hasByKey(id)) {
if (!client.users.has(id.user)) {
if (client.options.eagerFetching) {
await client.users.fetch(id.user);
}
}
client.emit(
"serverMemberJoin",
client.serverMembers.getOrCreate(id, {
@@ -653,6 +657,19 @@ export async function handleEvent(
break;
}
case "ServerMemberLeave": {
if (event.user) {
handleEvent(
client,
{
type: "ServerDelete",
id: event.id,
},
setReady
);
return;
}
const id = {
server: event.id,
user: event.user,
@@ -662,6 +679,7 @@ export async function handleEvent(
const member = client.serverMembers.getUnderlyingObject(
id.server + id.user
);
client.emit("serverMemberLeave", member);
client.serverMembers.delete(id.server + id.user);
}