fix(plugin/achievements): use graphql first for initial setup and fix regex (#1532)

This commit is contained in:
Simon Lecoq
2023-09-12 04:23:48 +02:00
committed by GitHub
parent d4d0137ac0
commit 2e12f12147
3 changed files with 60 additions and 21 deletions

View File

@@ -14,7 +14,7 @@ export default async function({login, q, imports, data, computed, graphql, queri
//Initialization //Initialization
const list = [] const list = []
await total({imports}) await total({imports, graphql, queries})
await compute[account]({list, login, data, computed, imports, graphql, queries, rest, rank, leaderboard}) await compute[account]({list, login, data, computed, imports, graphql, queries, rest, rank, leaderboard})
//Results //Results
@@ -72,18 +72,28 @@ function leaderboard({user, type, requirement}) {
} }
/**Total extracter */ /**Total extracter */
async function total({imports}) { async function total({imports, graphql, queries}) {
if (!total.promise) { if (!total.promise) {
total.promise = new Promise(async (solve, reject) => { total.promise = new Promise(async (solve, reject) => {
for (const method of ["graphql", "browser"]) {
console.debug(`metrics/compute/plugins > achievements > setup using ${method}`)
try {
//Setup using GraphQL
if (method === "graphql") {
const queried = await graphql(queries.achievements.total())
Object.assign(total, Object.fromEntries(Object.entries(queried).map(([key, {count:value}]) => [key, value])))
}
//Setup using browser
if (method === "browser") {
//Setup browser //Setup browser
console.debug("metrics/compute/plugins > achievements > filling total from github.com/search") console.debug("metrics/compute/plugins > achievements > filling total from github.com/search")
const browser = await imports.puppeteer.launch() const browser = await imports.puppeteer.launch()
console.debug(`metrics/compute/plugins > achievements > started ${await browser.version()}`) console.debug(`metrics/compute/plugins > achievements > started ${await browser.version()}`)
//Extracting total from github.com/search //Extracting total from github.com/search
for (let i = 0; (i < 100) && ((!total.users) || (!total.repositories)); i++) { for (let i = 0; (i < 4) && ((!total.users) || (!total.repositories)); i++) {
const page = await browser.newPage() const page = await browser.newPage()
await page.goto("https://github.com/search?q=created%3A%3E%3D1970") await page.goto("https://github.com/search?q=created%3A%3E%3D1970")
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 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
for (const result of results) { for (const result of results) {
const type = result[1]?.toLowerCase() const type = result[1]?.toLowerCase()
console.debug(`metrics/compute/plugins > achievements > setup found ${type ?? "(?)"}`) console.debug(`metrics/compute/plugins > achievements > setup found ${type ?? "(?)"}`)
@@ -96,7 +106,16 @@ async function total({imports}) {
await page.close() await page.close()
await imports.wait(10 * Math.random()) await imports.wait(10 * Math.random())
} }
}
//Check setup state //Check setup state
if ((!total.users) || (!total.repositories))
throw new Error("Uncomplete setup")
}
catch (error) {
console.debug(`metrics/compute/plugins > achievements > setup error > ${error}`)
continue
}
}
if ((!total.users) || (!total.repositories)) if ((!total.users) || (!total.repositories))
return reject("Failed to initiate total for achievement plugin") return reject("Failed to initiate total for achievement plugin")
console.debug("metrics/compute/plugins > achievements > total setup complete") console.debug("metrics/compute/plugins > achievements > total setup complete")

View File

@@ -0,0 +1,11 @@
query AchievementsTotal {
issues:search(query: "created:>1970", type: ISSUE) {
count:issueCount
}
repositories:search(query: "created:>1970", type: REPOSITORY) {
count:repositoryCount
}
users:search(query: "created:>1970", type: USER) {
count:userCount
}
}

View File

@@ -0,0 +1,9 @@
/**Mocked data */
export default function({faker, query, login = faker.internet.userName()}) {
console.debug("metrics/compute/mocks > mocking graphql api result > achievements/total")
return ({
repositories: {count: faker.number.int(100000)},
issues: {count: faker.number.int(100000)},
users: {count: faker.number.int(100000)},
})
}