From d88f6d926925e30798e6d2039278b29a30f7874f Mon Sep 17 00:00:00 2001 From: biglyderv Date: Mon, 3 Feb 2025 07:09:53 -0500 Subject: [PATCH] finally, an API --- index.js | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- rank.js | 30 ++++++++++++++++++----------- site.js | 2 +- 3 files changed, 73 insertions(+), 16 deletions(-) diff --git a/index.js b/index.js index 7be65fc..db9fc99 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,5 @@ -import { main } from "./site.js"; +import { main, rankCalc } from "./site.js"; +import e from "express"; let { site = 'darflen', @@ -14,8 +15,56 @@ let { user = 'paradock', matrixIterations = 3, useArchive = true, - isGpu = false + isGpu = false, + mode = 'cli', + port = 6952 } = process.env; -let settings = { site, route, pageLimit, blackList, greyList, discardThreshold, delay, depth, isRelative, fetchRate, user, matrixIterations, useArchive, isGpu }; +let settings = { + site, route, pageLimit, blackList, greyList, discardThreshold, delay, + depth, isRelative, fetchRate, user, matrixIterations, useArchive, isGpu +}; -main(settings); \ No newline at end of file +if (mode == 'cli') { + main(settings); +} else if (mode == 'site') { + const app = e(); + app.get('/top', async (req, res) => { + let json = await fetch("https://nbg.dervland.net/api/followjson.php"); + json = await json.json(); + + let data = {}; + + for (let entryI in json) { + let entry = json[entryI]; + let user = data[entry.username] || {}; + let target = data[entry.target] || {}; + + let f1 = user.following = user.following || []; + let f2 = user.followers = user.followers || []; + let f3 = target.following = target.following || []; + let f4 = target.followers = target.followers || []; + + f3.push(entry.username); + f2.push(entry.target); + + data[entry.username] = user; + data[entry.target] = target; + } + + console.log(data) + + let calcedRank = rankCalc(data, matrixIterations, [], false, settings.isGpu); + let dat = Object.entries(calcedRank); + dat = dat.sort((a, b) => b[1] - a[1]); + console.log(`Graph is calculated with ${dat.length} entries`); + let dat2 = {}; + for (let d of dat) { + dat2[d[0]] = d[1] * 100 + "%"; + } + + res.send(JSON.stringify(dat2)) + }) + + app.listen(port); + console.log(`App listening on port ${port}`) +} \ No newline at end of file diff --git a/rank.js b/rank.js index 0130d78..c976c06 100644 --- a/rank.js +++ b/rank.js @@ -57,27 +57,30 @@ function rankCalc(result, iterations = 10, main = [], domainMode = false, isGpu pr[unn] = 0.1 / rl; } - - for (let unn in result) { let fnu = frs[unn]; if (!pr[unn]) pr[unn] = 0; for (let follow of fnu) { if (follow == unn) continue; let dst = fnc[fnu] || 0; - let n = (keys.indexOf(unn) || 0) * (rl) + (keys.indexOf(follow) || 0) * 1; + let na = keys.indexOf(follow); + let nb = keys.indexOf(unn); + if (na == -1 || nb == -1) continue; + let n = (na) * (rl) + (nb) * 1; matrixe[n] = 1.1 + 1 / (dst + 3); msum_old += matrixe[n]; } let fail = 1; - try { - let h = new URL(unn); - if (!(h.pathname == '/' || h.pathname == '')) fail *= 0.5; - if (!(h.search == '')) fail *= 0.4; - if (main.indexOf(unn) != -1) fail = 10; - } catch (err) { - + if (domainMode) { + try { + let h = new URL(unn); + if (!(h.pathname == '/' || h.pathname == '')) fail *= 0.5; + if (!(h.search == '')) fail *= 0.4; + if (main.indexOf(unn) != -1) fail = 10; + } catch (err) { + + } } if (fail != 1) { @@ -143,9 +146,14 @@ function rankCalc(result, iterations = 10, main = [], domainMode = false, isGpu } let ov = Object.keys(pr); - let new_sum = ov.filter(i => !isNaN(pr[i]) && main.indexOf(i) != -1).map(n => pr[n]).reduce((a, b) => a + b, 1e-9); + let an = ov.filter(i => !isNaN(pr[i]) && main.indexOf(i) != -1); + let new_sum = an.map(n => pr[n]).reduce((a, b) => a + b, 1e-9); let new_sum2 = ov.filter(i => !isNaN(pr[i]) && main.indexOf(i) == -1).map(n => pr[n]).reduce((a, b) => a + b, 1e-9); + if (an.length == 0) { + new_sum2 /= 2; + } + for (let unn of ov) { if (!result[unn]) { pr[unn] = 0; diff --git a/site.js b/site.js index 2b555ab..c4ca0c0 100644 --- a/site.js +++ b/site.js @@ -347,4 +347,4 @@ async function main(settings) { }; -export { main }; \ No newline at end of file +export { main, rankCalc }; \ No newline at end of file