/
index.mjs
54 lines (48 loc) 路 2.77 KB
/
index.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//Setup
export default async function({login, q, imports, data, queries, account}, {enabled = false, extras = false} = {}) {
//Plugin execution
try {
//Check if plugin is enabled and requirements are met
if ((!q.leetcode) || (!imports.metadata.plugins.leetcode.enabled(enabled, {extras})))
return null
//Load inputs
let {user, sections, "limit.skills": _limit_skills, "limit.recent": _limit_recent} = imports.metadata.plugins.leetcode.inputs({data, account, q})
const result = {user, sections, languages: [], skills: [], problems: {}, recent: []}
//Languages stats
{
console.debug(`metrics/compute/${login}/plugins > leetcode > querying api (languages statistics)`)
const {data: {data: {matchedUser: {languageProblemCount: languages}}}} = await imports.axios.post("https://leetcode.com/graphql", {variables: {username: user}, query: queries.leetcode.languages()})
result.languages = languages.map(({languageName: language, problemsSolved: solved}) => ({language, solved}))
}
//Skills stats
{
console.debug(`metrics/compute/${login}/plugins > leetcode > querying api (skills statistics)`)
const {data: {data: {matchedUser: {tagProblemCounts: skills}}}} = await imports.axios.post("https://leetcode.com/graphql", {variables: {username: user}, query: queries.leetcode.skills()})
for (const category in skills)
result.skills.push(...skills[category].map(({tagName: name, problemsSolved: solved}) => ({name, solved, category})))
result.skills.sort((a, b) => b.solved - a.solved)
result.skills = result.skills.slice(0, _limit_skills || Infinity)
}
//Problems
{
console.debug(`metrics/compute/${login}/plugins > leetcode > querying api (problems statistics)`)
const {data: {data: {allQuestionsCount: all, matchedUser: {submitStatsGlobal: {acSubmissionNum: submissions}}}}} = await imports.axios.post("https://leetcode.com/graphql", {variables: {username: user}, query: queries.leetcode.problems()})
for (const {difficulty, count} of all)
result.problems[difficulty] = {count, solved: 0}
for (const {difficulty, count: solved} of submissions)
result.problems[difficulty].solved = solved
}
//Recent submissions
{
console.debug(`metrics/compute/${login}/plugins > leetcode > querying api (recent submissions statistics)`)
const {data: {data: {recentAcSubmissionList: submissions}}} = await imports.axios.post("https://leetcode.com/graphql", {variables: {username: user, limit: _limit_recent}, query: queries.leetcode.recent()})
result.recent = submissions.map(({title, timestamp}) => ({title, date: new Date(timestamp * 1000)}))
}
//Results
return result
}
//Handle errors
catch (error) {
throw imports.format.error(error)
}
}