master
 1import { define, Issue, plural } from '#src'
 2
 3export default define({
 4  url: import.meta.url,
 5  tiers: true,
 6  badges: [
 7    'old-issue-1',
 8    'old-issue-2',
 9    'old-issue-3',
10    'old-issue-4',
11    'old-issue-5',
12    'old-issue-6',
13    'old-issue-7',
14    'old-issue-8',
15    'old-issue-9',
16    'old-issue-10',
17  ] as const,
18  present(data, grant) {
19    const buckets: { [years: number]: Issue[] } = {}
20
21    for (const issue of data.issues.sort(age)) {
22      if (!issue.closed) continue
23      if (issue.closedBy != data.user.login) continue
24      const createdAt = new Date(issue.createdAt)
25      const closedAt = new Date(issue.closedAt!)
26      let years = Math.floor(
27        (closedAt.getTime() - createdAt.getTime()) / 1000 / 60 / 60 / 24 / 365,
28      )
29      if (years > 10) years = 10
30      buckets[years] = buckets[years] || []
31      buckets[years].push(issue)
32    }
33
34    for (let years = 1; years <= 10; years++) {
35      if (!buckets[years]) continue
36      grant(
37        `old-issue-${years}` as (typeof this.badges)[number],
38        `I closed an issue that was open for ${plural(
39          years,
40          'a year',
41          '%d years',
42        )}`,
43      )
44        .evidenceIssuesWithTitles(...buckets[years])
45        .tier(years)
46    }
47  },
48})
49
50function age(a: Issue, b: Issue) {
51  return new Date(a.closedAt!).getTime() - new Date(b.closedAt!).getTime()
52}