From 7e9d57cfee6590f5fdd94721ed1682d28633ce99 Mon Sep 17 00:00:00 2001 From: Grant Date: Mon, 6 Jul 2026 02:02:07 -0600 Subject: [PATCH] fix: heatmap generation fixes #187 --- packages/server/src/api/admin/canvas.ts | 2 +- .../src/controllers/CanvasController.ts | 8 ++-- packages/server/src/jobs/canvas.ts | 37 ++++++++++++------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/packages/server/src/api/admin/canvas.ts b/packages/server/src/api/admin/canvas.ts index 482e646..9ecd863 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 2b480da..debbc8f 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 3da2009..be2163f 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", - ); -}; -- GitLab