Rework status enum schema

This commit is contained in:
Rory&
2026-05-19 16:26:24 +02:00
parent d96c47cd33
commit 9e7f3bdfde
7 changed files with 27 additions and 6 deletions
Binary file not shown.
Binary file not shown.
+7 -2
View File
@@ -17,7 +17,7 @@
*/
import { WebSocket, Payload } from "@spacebar/gateway";
import { emitEvent, PresenceUpdateEvent, Session, User } from "@spacebar/util";
import { emitEvent, PresenceUpdateEvent, PrivateStatus, PublicStatus, PublicStatusOrder, Session, User } from "@spacebar/util";
import { check } from "./instanceOf";
import { ActivitySchema } from "@spacebar/schemas";
@@ -26,7 +26,12 @@ export async function onPresenceUpdate(this: WebSocket, { d }: Payload) {
check.call(this, ActivitySchema, d);
const presence = d as ActivitySchema;
await Session.update({ session_id: this.session_id }, { status: presence.status, activities: presence.activities });
if (d.status === "unknown") {
const sessions = await Session.find({ where: { user_id: this.user_id } });
d.status = sessions.sort((a, b) => PublicStatusOrder[a.getPublicStatus()] - PublicStatusOrder[b.getPublicStatus()])[0].getPublicStatus();
}
await Session.update({ session_id: this.session_id }, { status: presence.status as PrivateStatus, activities: presence.activities });
const session = await Session.findOneOrFail({
select: { client_status: true },
+2 -1
View File
@@ -17,7 +17,7 @@
*/
// TODO: remove entity imports
import { Activity, Status } from "@spacebar/util";
import { Activity, ClientStatus, Status } from "@spacebar/util";
export const ActivitySchema = {
$afk: Boolean,
@@ -78,4 +78,5 @@ export interface ActivitySchema {
status: Status;
activities?: Activity[];
since?: number; // unix time (in milliseconds) of when the client went idle, or null if the client is not idle
client_status?: ClientStatus;
}
+2 -2
View File
@@ -20,7 +20,7 @@ import crypto from "node:crypto";
import { User } from "./User";
import { BaseClassWithoutId } from "./BaseClass";
import { Column, CreateDateColumn, Entity, Index, JoinColumn, ManyToOne, PrimaryColumn, RelationId } from "typeorm";
import { Activity, ClientStatus, GatewaySession, GatewaySessionClientInfo, Status } from "../interfaces";
import { Activity, ClientStatus, GatewaySession, GatewaySessionClientInfo, PrivateStatus } from "../interfaces";
import { randomUpperString } from "@spacebar/api";
import { DateBuilder, IpDataClient, TimeSpan } from "../util";
@@ -57,7 +57,7 @@ export class Session extends BaseClassWithoutId {
client_status: ClientStatus;
@Column({ nullable: false, type: String })
status: Status;
status: PrivateStatus;
@Column({ default: false })
is_admin_session: boolean;
+2 -1
View File
@@ -35,6 +35,7 @@ import {
GuildOrUnavailable,
Snowflake,
ThreadMember,
PrivateStatus,
} from "@spacebar/util";
import { JsonValue } from "@protobuf-ts/runtime";
import {
@@ -603,7 +604,7 @@ export interface GatewaySession {
activities: Activity[];
hidden_activities: Activity[];
client_info: GatewaySessionClientInfo;
status: Status;
status: PrivateStatus;
active?: boolean; // How is this even defined?
}
+14
View File
@@ -16,6 +16,20 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export enum PublicStatusOrder {
online = 0,
idle = 1,
dnd = 2,
offline = 3,
}
console.log(PublicStatusOrder);
export type PublicStatus = keyof typeof PublicStatusOrder;
export type PrivateStatus = PublicStatus | "invisible";
export type SetPrivateStatus = PrivateStatus | "unknown";
// @deprecated Use PublicStatus, PrivateStatus or SetPrivateStatus instead
export type Status =
| "idle"
| "dnd"