Commit e92f3be9 authored by Grant's avatar Grant
Browse files

fix: heatmap generation

parent 4aebeaa0
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+5 −3
Original line number Diff line number Diff line
@@ -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) {
+23 −14
Original line number Diff line number Diff line
@@ -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",
  );
};