Trigger everytime a new item text on HackerNews match at least one mention  (hackernews) - trigger module
One script reply has been approved by the moderators

1 points by admin 60 days ago | 44 uses

For every new item since last trigger (as identified by being above the last max ID), collect the ones that match at least of the mention

One script reply has been approved by the moderators
This version of script #88 was approved by the moderators as the one that fits the best the script ask: 'Trigger everytime a new item text on HackerNews match at least one mention'. It is safe to use in your flows in production.
0 points
by admin 60 days ago
edit by admin 60 days ago
import * as wmill from "https://deno.land/x/[email protected]/mod.ts";

const MAX_LOOKBACK = 100

export async function main(mentions: string[]) {
  console.log(wmill.getInternalStatePath());
  let lastState = await wmill.getInternalState();
  console.log(`lastState: ${lastState}`);

  let maxItem = await getMaxItem();
  console.log(`maxItem: ${maxItem}`);

  if (!lastState) {
    console.log(`First run of trigger, looking back to MAX_LOOKBACK (100) elements`);
    lastState = maxItem - MAX_LOOKBACK;
  }

  maxItem = Math.min(maxItem, lastState + MAX_LOOKBACK)

  const items = [];
  for (let i = lastState; i < maxItem; i++) {
    console.log(`fetching id: ${i}`);
    const item = await getItem(i)
    if (mentions.find((mention) => item.text?.includes(mention))) {
      items.push(item);
    }
  }
  await wmill.setInternalState(maxItem);

  return items;
}

export async function getMaxItem() {
  const res = await fetch("https://hacker-news.firebaseio.com/v0/maxitem.json");
  return Number(await res.text());
}

export async function getItem(id: number) {
  const res = await fetch(
    `https://hacker-news.firebaseio.com/v0/item/${id}.json`,
  );
  return res.json();
}
edit/run in windmill raw embed