Implement live analysis achievements and admin console

这个提交包含在:
cryptocommuniums-afk
2026-03-15 01:39:34 +08:00
父节点 d1b6603061
当前提交 edc66ea5bc
修改 23 个文件,包含 4033 行新增1022 行删除

查看文件

@@ -9,7 +9,39 @@ import { appRouter } from "../routers";
import { createContext } from "./context";
import { registerMediaProxy } from "./mediaProxy";
import { serveStatic } from "./static";
import { seedTutorials, seedVisionReferenceImages } from "../db";
import { createBackgroundTask, getAdminUserId, hasRecentBackgroundTaskOfType, seedAchievementDefinitions, seedAppSettings, seedTutorials, seedVisionReferenceImages } from "../db";
import { nanoid } from "nanoid";
async function scheduleDailyNtrpRefresh() {
const now = new Date();
if (now.getHours() !== 0 || now.getMinutes() > 5) {
return;
}
const midnight = new Date();
midnight.setHours(0, 0, 0, 0);
const exists = await hasRecentBackgroundTaskOfType("ntrp_refresh_all", midnight);
if (exists) {
return;
}
const adminUserId = await getAdminUserId();
if (!adminUserId) {
return;
}
const taskId = nanoid();
await createBackgroundTask({
id: taskId,
userId: adminUserId,
type: "ntrp_refresh_all",
title: "每日 NTRP 刷新",
message: "系统已自动创建每日 NTRP 刷新任务",
payload: { source: "scheduler", scheduledAt: now.toISOString() },
progress: 0,
maxAttempts: 3,
});
}
function isPortAvailable(port: number): Promise<boolean> {
return new Promise(resolve => {
@@ -33,6 +65,8 @@ async function findAvailablePort(startPort: number = 3000): Promise<number> {
async function startServer() {
await seedTutorials();
await seedVisionReferenceImages();
await seedAchievementDefinitions();
await seedAppSettings();
const app = express();
const server = createServer(app);
@@ -73,6 +107,12 @@ async function startServer() {
server.listen(port, () => {
console.log(`Server running on http://localhost:${port}/`);
});
setInterval(() => {
void scheduleDailyNtrpRefresh().catch((error) => {
console.error("[scheduler] failed to schedule NTRP refresh", error);
});
}, 60_000);
}
startServer().catch(console.error);