50 lines
1.2 KiB
TypeScript
50 lines
1.2 KiB
TypeScript
import { count, desc, eq } from "drizzle-orm";
|
|
import type { OnlineUser } from "@/components/admin/dashboard";
|
|
import { db, User } from "@/lib/db";
|
|
|
|
/** Shared online roster used by CommandoCentrum (and linked from other ops hubs). */
|
|
export async function fetchOpsOnlineUsers(
|
|
limit = 40,
|
|
): Promise<{ count: number; users: OnlineUser[] }> {
|
|
const [countRow, onlineUsersRaw] = await Promise.all([
|
|
db
|
|
.select({ total: count() })
|
|
.from(User)
|
|
.where(eq(User.online, "1"))
|
|
.then((rows) => rows[0]?.total ?? 0)
|
|
.catch(() => 0),
|
|
db
|
|
.select({
|
|
id: User.id,
|
|
username: User.username,
|
|
look: User.look,
|
|
lastOnline: User.lastOnline,
|
|
})
|
|
.from(User)
|
|
.where(eq(User.online, "1"))
|
|
.orderBy(desc(User.lastOnline))
|
|
.limit(limit)
|
|
.then((rows) => rows)
|
|
.catch(
|
|
() =>
|
|
[] as Array<{
|
|
id: number;
|
|
username: string;
|
|
look: string;
|
|
lastOnline: number;
|
|
}>,
|
|
),
|
|
]);
|
|
|
|
const users: OnlineUser[] = onlineUsersRaw.map((u) => ({
|
|
id: u.id,
|
|
username: u.username,
|
|
look: u.look,
|
|
roomId: null,
|
|
roomName: null,
|
|
lastActivity: u.lastOnline > 0 ? new Date(u.lastOnline * 1000) : new Date(),
|
|
}));
|
|
|
|
return { count: countRow, users };
|
|
}
|