diff --git a/src/api/routes/users/@me/settings.ts b/src/api/routes/users/@me/settings.ts
index 2013611b..5136c4ab 100644
--- a/src/api/routes/users/@me/settings.ts
+++ b/src/api/routes/users/@me/settings.ts
@@ -91,7 +91,7 @@ router.patch(
client_status: session?.client_status,
status: session.getPublicStatus(),
},
- } as PresenceUpdateEvent),
+ } satisfies PresenceUpdateEvent),
session.save(),
]);
}
diff --git a/src/gateway/events/Close.ts b/src/gateway/events/Close.ts
index adbf9be7..322a9c4e 100644
--- a/src/gateway/events/Close.ts
+++ b/src/gateway/events/Close.ts
@@ -77,23 +77,19 @@ export async function Close(this: WebSocket, code: number, reason: Buffer) {
status: "offline",
};
- // TODO
- // If a user was deleted, they may still be connected to gateway,
- // which will cause this to throw when they disconnect.
- // just send the ID of the user instead of the full correct payload for now
- const userOrId = await User.getPublicUser(this.user_id).catch(() => ({
- id: this.user_id,
- }));
+ const user = await User.getPublicUser(this.user_id).catch(() => undefined);
- await emitEvent({
- event: "PRESENCE_UPDATE",
- user_id: this.user_id,
- data: {
- user: userOrId,
- activities: session.activities,
- client_status: session?.client_status,
- status: session.getPublicStatus?.() ?? session.status,
- },
- } as PresenceUpdateEvent);
+ // Special case: dont emit a presence update for deleted users
+ if (user !== undefined)
+ await emitEvent({
+ event: "PRESENCE_UPDATE",
+ user_id: this.user_id,
+ data: {
+ user: user,
+ activities: session.activities,
+ client_status: session?.client_status,
+ status: session.getPublicStatus?.() ?? session.status,
+ },
+ } satisfies PresenceUpdateEvent);
}
}
diff --git a/src/gateway/opcodes/Identify.ts b/src/gateway/opcodes/Identify.ts
index ce0bd8ef..fd0b91fe 100644
--- a/src/gateway/opcodes/Identify.ts
+++ b/src/gateway/opcodes/Identify.ts
@@ -585,7 +585,7 @@ export async function onIdentify(this: WebSocket, data: Payload) {
client_status: this.session!.client_status,
status: this.session!.getPublicStatus(),
},
- } as PresenceUpdateEvent),
+ } satisfies PresenceUpdateEvent),
),
]);
diff --git a/src/gateway/opcodes/PresenceUpdate.ts b/src/gateway/opcodes/PresenceUpdate.ts
index 54ce3a89..ca52af2a 100644
--- a/src/gateway/opcodes/PresenceUpdate.ts
+++ b/src/gateway/opcodes/PresenceUpdate.ts
@@ -39,10 +39,10 @@ export async function onPresenceUpdate(this: WebSocket, { d }: Payload) {
data: {
user: await User.getPublicUser(this.user_id),
status: session.getPublicStatus(),
- activities: presence.activities,
+ activities: presence.activities ?? [],
client_status: session.client_status,
},
- } as PresenceUpdateEvent);
+ } satisfies PresenceUpdateEvent);
console.log(`Presence update for user ${this.user_id} processed in ${Date.now() - startTime}ms`);
}
|