Files
lbf-bot/apps/discord-bot/src/services/tracking.ts

75 lines
1.8 KiB
TypeScript

import { getPlayer } from "~/services/wov";
import { db, tables, eq } from "@lbf-bot/database";
export async function listTrackedPlayers(): Promise<string[]> {
const players = await db.query.trackedPlayers.findMany({
columns: {
playerId: true,
},
});
return players.map((p) => p.playerId);
}
export async function isWovPlayerTracked(playerId: string): Promise<boolean> {
const player = await db.query.trackedPlayers.findFirst({
where: eq(tables.trackedPlayers.playerId, playerId),
});
return player !== undefined;
}
export async function untrackWovPlayer(playerId: string): Promise<void> {
await db
.delete(tables.trackedPlayers)
.where(eq(tables.trackedPlayers.playerId, playerId));
}
export async function trackWovPlayer(playerId: string): Promise<void> {
const alreadyTracked = await isWovPlayerTracked(playerId);
if (alreadyTracked) return;
const player = await getPlayer(playerId);
if (!player) return;
await db.insert(tables.trackedPlayers).values({
playerId,
});
await db.insert(tables.usernameHistory).values({
playerId,
username: player.username,
});
}
export async function getTrackedPlayerUsernames(
playerId: string,
): Promise<string[]> {
const tracked = await db.query.trackedPlayers.findFirst({
where: eq(tables.trackedPlayers.playerId, playerId),
with: {
usernameHistory: {
orderBy: (history, { asc }) => [asc(history.firstSeenAt)],
},
},
});
if (!tracked) return [];
return tracked.usernameHistory.map((h) => h.username);
}
export async function addUsernameToHistory(
playerId: string,
username: string,
): Promise<void> {
await db.insert(tables.usernameHistory).values({
playerId,
username,
});
await db
.update(tables.trackedPlayers)
.set({ updatedAt: new Date() })
.where(eq(tables.trackedPlayers.playerId, playerId));
}