3
Notify of new Github repo stars Trigger
One script reply has been approved by the moderators Verified
Created by rossmccrann 939 days ago Viewed 15026 times
In Windmill, a trigger script is designed to pull data from an external source and return all the new items since the last run. It operates without resorting to external webhooks and is typically used with schedules and states to compare the current execution to the previous one.
0
Submitted by adam186 Deno
Verified 782 days ago
1
import {
2
  setState,
3
  getState,
4
} from "https://deno.land/x/windmill@v1.85.0/mod.ts";
5
import { Octokit } from "npm:@octokit/rest@19.0.5";
6

7
const MAX_ITEMS = 500;
8

9
/**
10
 * @returns A list of starrers in descending order of when they starred.
11
 * The maximum number of returned items is 500.
12
 */
13
type Github = {
14
  token: string;
15
};
16
export async function main(auth: Github, owner: string, repo: string) {
17
  const octokit = new Octokit({
18
    auth: auth.token,
19
  });
20
  const lastUpdate = (await getState()) || 0;
21

22
  const starCount = (await octokit.repos.get({ owner, repo })).data
23
    .stargazers_count;
24
  let lastPage =
25
    +(starCount / 100).toFixed(0) + (starCount % 100 === 0 ? 0 : 1);
26
  const newStarrers: Starrer[] = [];
27

28
  await setState(Date.now());
29
  let runLoop = true;
30
  do {
31
    const response = await octokit.activity.listStargazersForRepo({
32
      owner,
33
      repo,
34
      per_page: 100,
35
      page: lastPage--,
36
      headers: {
37
        accept: "application/vnd.github.star+json",
38
      },
39
    });
40
    for (let i = response.data.length - 1; i >= 0; i--) {
41
      const entry = response.data[i];
42
      if (!entry || !entry.user) continue;
43
      const starredAt = new Date(entry.starred_at).getTime();
44
      if (starredAt < lastUpdate) {
45
        runLoop = false;
46
        break;
47
      }
48
      const { id, login, type, url, email, name } = entry.user;
49
      newStarrers.push({ id, starredAt, login, type, url, email, name });
50
      if (newStarrers.length >= MAX_ITEMS) {
51
        await setState(newStarrers.at(-1)?.starredAt);
52
        runLoop = false;
53
        break;
54
      }
55
    }
56
  } while (runLoop);
57
  console.log(newStarrers.length);
58
  return newStarrers;
59
}
60

61
interface Starrer {
62
  id: number;
63
  login: string;
64
  type: string;
65
  url: string;
66
  starredAt: number;
67
  email?: string | null;
68
  name?: string | null;
69
}
70

Other submissions