diff --git a/src/api/routes/users/@me/settings.ts b/src/api/routes/users/@me/settings.ts index 2013611b7..5136c4abc 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 adbf9be7d..322a9c4ed 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 ce0bd8ef0..fd0b91fec 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 54ce3a894..ca52af2a2 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`); }