Skip to content

Commit 2e12f12

Browse files
authored
fix(plugin/achievements): use graphql first for initial setup and fix regex (#1532)
1 parent d4d0137 commit 2e12f12

File tree

3 files changed

+60
-21
lines changed

3 files changed

+60
-21
lines changed

source/plugins/achievements/index.mjs

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export default async function({login, q, imports, data, computed, graphql, queri
1414

1515
//Initialization
1616
const list = []
17-
await total({imports})
17+
await total({imports, graphql, queries})
1818
await compute[account]({list, login, data, computed, imports, graphql, queries, rest, rank, leaderboard})
1919

2020
//Results
@@ -72,31 +72,50 @@ function leaderboard({user, type, requirement}) {
7272
}
7373

7474
/**Total extracter */
75-
async function total({imports}) {
75+
async function total({imports, graphql, queries}) {
7676
if (!total.promise) {
7777
total.promise = new Promise(async (solve, reject) => {
78-
//Setup browser
79-
console.debug("metrics/compute/plugins > achievements > filling total from github.com/search")
80-
const browser = await imports.puppeteer.launch()
81-
console.debug(`metrics/compute/plugins > achievements > started ${await browser.version()}`)
82-
//Extracting total from github.com/search
83-
for (let i = 0; (i < 100) && ((!total.users) || (!total.repositories)); i++) {
84-
const page = await browser.newPage()
85-
await page.goto("https://github.com/search?q=created%3A%3E%3D1970")
86-
const results = await page.evaluate(() => [...[...document.querySelectorAll("h2")].filter(node => /Filter by/.test(node.innerText)).shift()?.nextSibling?.innerText.trim().matchAll(/(?<type>Repositories|Users|Issues)\n(?<count>.*?)M/g) ?? []]) ?? null
87-
for (const result of results) {
88-
const type = result[1]?.toLowerCase()
89-
console.debug(`metrics/compute/plugins > achievements > setup found ${type ?? "(?)"}`)
90-
const count = result[2] ?? ""
91-
if ((count !== "") && (!total[type])) {
92-
total[type] = Number(count) * 10e5
93-
console.debug(`metrics/compute/plugins > achievements > set total.${type} to ${total[type]}`)
78+
for (const method of ["graphql", "browser"]) {
79+
console.debug(`metrics/compute/plugins > achievements > setup using ${method}`)
80+
try {
81+
//Setup using GraphQL
82+
if (method === "graphql") {
83+
const queried = await graphql(queries.achievements.total())
84+
Object.assign(total, Object.fromEntries(Object.entries(queried).map(([key, {count:value}]) => [key, value])))
9485
}
86+
//Setup using browser
87+
if (method === "browser") {
88+
//Setup browser
89+
console.debug("metrics/compute/plugins > achievements > filling total from github.com/search")
90+
const browser = await imports.puppeteer.launch()
91+
console.debug(`metrics/compute/plugins > achievements > started ${await browser.version()}`)
92+
//Extracting total from github.com/search
93+
for (let i = 0; (i < 4) && ((!total.users) || (!total.repositories)); i++) {
94+
const page = await browser.newPage()
95+
await page.goto("https://github.com/search?q=created%3A%3E%3D1970")
96+
const results = await page.evaluate(() => [...[...document.querySelectorAll("h2")].filter(node => /Filter by/.test(node.innerText)).shift()?.nextSibling?.innerText.trim().matchAll(/(?<type>Repositories|Users|Issues)\n.*?(?<count>\d+)M/g) ?? []]) ?? null
97+
for (const result of results) {
98+
const type = result[1]?.toLowerCase()
99+
console.debug(`metrics/compute/plugins > achievements > setup found ${type ?? "(?)"}`)
100+
const count = result[2] ?? ""
101+
if ((count !== "") && (!total[type])) {
102+
total[type] = Number(count) * 10e5
103+
console.debug(`metrics/compute/plugins > achievements > set total.${type} to ${total[type]}`)
104+
}
105+
}
106+
await page.close()
107+
await imports.wait(10 * Math.random())
108+
}
109+
}
110+
//Check setup state
111+
if ((!total.users) || (!total.repositories))
112+
throw new Error("Uncomplete setup")
113+
}
114+
catch (error) {
115+
console.debug(`metrics/compute/plugins > achievements > setup error > ${error}`)
116+
continue
95117
}
96-
await page.close()
97-
await imports.wait(10 * Math.random())
98118
}
99-
//Check setup state
100119
if ((!total.users) || (!total.repositories))
101120
return reject("Failed to initiate total for achievement plugin")
102121
console.debug("metrics/compute/plugins > achievements > total setup complete")
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
query AchievementsTotal {
2+
issues:search(query: "created:>1970", type: ISSUE) {
3+
count:issueCount
4+
}
5+
repositories:search(query: "created:>1970", type: REPOSITORY) {
6+
count:repositoryCount
7+
}
8+
users:search(query: "created:>1970", type: USER) {
9+
count:userCount
10+
}
11+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/**Mocked data */
2+
export default function({faker, query, login = faker.internet.userName()}) {
3+
console.debug("metrics/compute/mocks > mocking graphql api result > achievements/total")
4+
return ({
5+
repositories: {count: faker.number.int(100000)},
6+
issues: {count: faker.number.int(100000)},
7+
users: {count: faker.number.int(100000)},
8+
})
9+
}

0 commit comments

Comments
 (0)