diff --git a/packages/server/src/api/admin/canvas.ts b/packages/server/src/api/admin/canvas.ts index 482e6464f24278e928875c9f8bf64a758dba16d7..9ecd8639a66fe52a246f6a3b8e7de5eb5faf40c1 100644 --- a/packages/server/src/api/admin/canvas.ts +++ b/packages/server/src/api/admin/canvas.ts @@ -117,7 +117,7 @@ export class CanvasAdminEndpoints extends Router { @Router.handler("put", "/heatmap") async forceGenerateHeatmap(req: Router.Request, res: Router.Response) { try { - await CanvasController.get().generateHeatmap(); + await CanvasController.generateHeatmap(); res.send({ success: true }); } catch (e) { diff --git a/packages/server/src/controllers/CanvasController.ts b/packages/server/src/controllers/CanvasController.ts index 2b480da4ba0c771dff50acb63db40a0e73b713f6..debbc8f43d13d4c22d361283fc1f6b7d93831e2a 100644 --- a/packages/server/src/controllers/CanvasController.ts +++ b/packages/server/src/controllers/CanvasController.ts @@ -539,7 +539,7 @@ export class CanvasController { * @note expensive operation, takes a bit to execute * @returns 2 character strings with 0-100 in radix 36 (depends on canvas size) */ - async generateHeatmap() { + static async generateHeatmap() { const redis_set = await Redis.getClient("MAIN"); const now = Date.now(); @@ -554,10 +554,12 @@ export class CanvasController { where: { isTop: true, createdAt: { gte: minimumDate } }, }); - for (let y = 0; y < this.canvasSize[1]; y++) { + const { width, height } = Settings.get("canvas.size"); + + for (let y = 0; y < height; y++) { const arr: number[] = []; - for (let x = 0; x < this.canvasSize[0]; x++) { + for (let x = 0; x < width; x++) { const pixel = topPixels.find((px) => px.x === x && px.y === y); if (pixel) { diff --git a/packages/server/src/jobs/canvas.ts b/packages/server/src/jobs/canvas.ts index 3da2009da900c0661c08627a7912810a647e826f..be2163fff4118411cb71daead77396bc59cec712 100644 --- a/packages/server/src/jobs/canvas.ts +++ b/packages/server/src/jobs/canvas.ts @@ -5,6 +5,19 @@ import { getLogger } from "../lib/Logger"; const Logger = getLogger(); +const generateHeatmap = async () => { + Logger.info("Generating heatmap..."); + const now = Date.now(); + + await CanvasController.generateHeatmap(); + + Logger.info( + "Generated heatmap in " + + ((Date.now() - now) / 1000).toFixed(1) + + " seconds", + ); +}; + /** * all jobs that are for the canvas (like heatmaps) */ @@ -19,6 +32,11 @@ export const Job_Canvas = new (class Job_Canvas { }); this.setupScheduler(); + + generateHeatmap().catch((e) => { + console.error(e); + Logger.warn("Failed to generate heatmap"); + }); } private setupScheduler() { @@ -27,6 +45,7 @@ export const Job_Canvas = new (class Job_Canvas { "heatmap", { every: 1000 * 60 * 5, // 5 minutes + immediately: true, }, { name: "heatmap", @@ -54,7 +73,10 @@ export const Job_Canvas = new (class Job_Canvas { async processJob(job: Job) { switch (job.name) { case "heatmap": - await generateHeatmap(); + await generateHeatmap().catch((e) => { + console.error(e); + Logger.warn("Failed to generate heatmap"); + }); break; } } @@ -63,16 +85,3 @@ export const Job_Canvas = new (class Job_Canvas { return this.#queue.drain(); } })(); - -const generateHeatmap = async () => { - Logger.info("Generating heatmap..."); - const now = Date.now(); - - await CanvasController.get().generateHeatmap(); - - Logger.info( - "Generated heatmap in " + - ((Date.now() - now) / 1000).toFixed(1) + - " seconds", - ); -};