init
commit
a00d013597
|
@ -0,0 +1,16 @@
|
|||
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
._*
|
||||
.idea
|
||||
.vscode
|
||||
*.env
|
||||
|
||||
node_modules/
|
||||
data/logs/
|
||||
data/ssl/
|
||||
public/upload/
|
||||
package-lock.json
|
|
@ -0,0 +1,16 @@
|
|||
|
||||
script: node ./app.js
|
||||
cwd: ./
|
||||
watch: true
|
||||
name: stats:23333
|
||||
ignore_watch: [data, public, package.json, package-lock.json, node_modules, .git, .gitignore, app.dev.yaml, app.yaml]
|
||||
exec_mode: fork
|
||||
|
||||
error_file: ./data/logs/error.log
|
||||
out_file: ./data/logs/out.log
|
||||
merge_logs: true
|
||||
min_uptime: 60s
|
||||
max_restarts: 1
|
||||
max_memory_restart: 300M
|
||||
env:
|
||||
NODE_ENV: development
|
|
@ -0,0 +1,32 @@
|
|||
/**
|
||||
* {}
|
||||
* @author yutent<yutent.io@gmail.com>
|
||||
* @date 2023/06/07 18:01:50
|
||||
*/
|
||||
|
||||
import Five from '@gm5/core'
|
||||
import fs from 'iofs'
|
||||
|
||||
const app = new Five()
|
||||
|
||||
if (fs.isfile('./config.env')) {
|
||||
//
|
||||
fs.cat('./config.env')
|
||||
.toString()
|
||||
.split('\n')
|
||||
.forEach(it => {
|
||||
let tmp = it.trim()
|
||||
if (tmp) {
|
||||
tmp = tmp.split(': ')
|
||||
process.env[tmp[0]] = tmp[1]
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
app.set({
|
||||
token: process.env.GITHUB_TOKEN
|
||||
})
|
||||
|
||||
app.preload('./apps/')
|
||||
|
||||
app.listen(23333)
|
|
@ -0,0 +1,16 @@
|
|||
|
||||
script: node ./app.js
|
||||
cwd: ./
|
||||
watch: true
|
||||
name: stats:23333
|
||||
ignore_watch: [data, public, package.json, package-lock.json, node_modules, .git, .gitignore, app.dev.yaml, app.yaml]
|
||||
exec_mode: fork
|
||||
|
||||
error_file: ./data/logs/error.log
|
||||
out_file: ./data/logs/out.log
|
||||
merge_logs: true
|
||||
min_uptime: 60s
|
||||
max_restarts: 1
|
||||
max_memory_restart: 300M
|
||||
env:
|
||||
NODE_ENV: production
|
|
@ -0,0 +1,74 @@
|
|||
/**
|
||||
* {}
|
||||
* @author yutent<yutent.io@gmail.com>
|
||||
* @date 2023/06/07 18:06:57
|
||||
*/
|
||||
|
||||
import Controller from '@gm5/controller'
|
||||
import { render } from '../lib/svg.js'
|
||||
|
||||
export default class Github extends Controller {
|
||||
__main__() {
|
||||
//
|
||||
}
|
||||
|
||||
async toplangsAction() {
|
||||
let { username, count = 6 } = this.request.get()
|
||||
let token = this.context.get('token')
|
||||
|
||||
let { data } = await fetch('https://api.github.com/graphql', {
|
||||
headers: {
|
||||
Authorization: 'Bearer ' + token,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
method: 'post',
|
||||
body: JSON.stringify({
|
||||
query: `
|
||||
query {
|
||||
repositoryOwner(login: "${username}") {
|
||||
repositories(ownerAffiliations: [OWNER, ORGANIZATION_MEMBER], isFork: false, first: 100){
|
||||
nodes {
|
||||
name
|
||||
languages(first: 10) {
|
||||
edges {
|
||||
size
|
||||
node {
|
||||
color
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
})
|
||||
}).then(r => r.json())
|
||||
|
||||
let { nodes } = data.repositoryOwner.repositories
|
||||
let dict = {}
|
||||
let langs = []
|
||||
|
||||
nodes.forEach(it => {
|
||||
for (let lang of it.languages.edges) {
|
||||
if (dict[lang.node.name]) {
|
||||
dict[lang.node.name].size += lang.size
|
||||
} else {
|
||||
dict[lang.node.name] = { size: lang.size, color: lang.node.color }
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
for (let k in dict) {
|
||||
langs.push({ name: k, size: dict[k].size, color: dict[k].color })
|
||||
}
|
||||
|
||||
langs.sort((a, b) => b.size - a.size)
|
||||
|
||||
this.response.set('Content-Type', 'image/svg+xml')
|
||||
this.response.end(render({}))
|
||||
|
||||
// this.response.send(200, { langs: langs.slice(0, count) })
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
/**
|
||||
* {}
|
||||
* @author yutent<yutent.io@gmail.com>
|
||||
* @date 2023/06/07 18:41:20
|
||||
*/
|
||||
|
||||
function html(strs, ...vals) {
|
||||
let output = ''
|
||||
for (let it of strs) {
|
||||
output += it + (vals.shift() || '')
|
||||
}
|
||||
return output
|
||||
}
|
||||
|
||||
export function render({ title = 'Most Used Languages' }) {
|
||||
return html`
|
||||
<svg
|
||||
width="600"
|
||||
height="400"
|
||||
viewBox="0 0 600 400"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<style>
|
||||
.header {
|
||||
font: bold 20px 'Segoe UI', Ubuntu, Sans-Serif;
|
||||
fill: #64b5f6;
|
||||
}
|
||||
</style>
|
||||
<g transform="translate(24, 32)">
|
||||
<text class="header">${title}</text>
|
||||
</g>
|
||||
</svg>
|
||||
`
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"name": "github-stats",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@gm5/core": "^1.1.5"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue