משתמש:מיכי י-ם/סטטיסטיקות שינויים אחרונים.js
מראה
הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
async function getNam() {
const api = new mw.Api();
const data = [];
const deys = Number(prompt("מספר ימים לבדיקה!")) || 30;
const rcend = new Date(
new Date().getTime() - deys * 24 * 60 * 60 * 1000
).toISOString();
const params = {
list: "recentchanges",
utf8: 1,
formatversion: "2",
rcend,
rcprop: "title|timestamp|user|patrolled|tags",
rcshow: "!bot",
rclimit: "max",
};
let rccontinue;
do {
if (rccontinue) {
params.rccontinue = rccontinue;
}
const res = await api.get(params);
data.push(...Object.values(res.query.recentchanges));
if (res.continue) {
rccontinue = res.continue.rccontinue;
} else {
rccontinue = null;
}
} while (rccontinue);
console.log(data.length, data);
createAllTables(data);
}
function createAllTables(data) {
const generalStats = calculateGeneralStats(data);
const userStats = calculateUserStats(data);
console.log("General Statistics:");
Object.keys(generalStats).forEach((key) => {
console.log(`${key.charAt(0).toUpperCase() + key.slice(1)}:`);
console.table(generalStats[key]);
});
console.log("User Statistics:");
Object.keys(userStats).forEach((key) => {
console.log(`${key.charAt(0).toUpperCase() + key.slice(1)}:`);
console.table(userStats[key]);
});
}
function calculateGeneralStats(data) {
const nsMap = new Map();
nsMap.set("total", data.length);
nsMap.set("main", 0);
const patrolMap = new Map();
patrolMap.set("patrolled", 0);
patrolMap.set("unpatrolled", 0);
patrolMap.set("autopatrolled", 0);
for (const rc of data) {
if (rc.ns === 0) {
nsMap.set("main", nsMap.get("main") + 1);
} else {
nsMap.set(rc.ns, (nsMap.get(rc.ns) || 0) + 1);
}
if (rc.unpatrolled)
patrolMap.set("unpatrolled", patrolMap.get("unpatrolled") + 1);
else if (rc.autopatrolled)
patrolMap.set("autopatrolled", patrolMap.get("autopatrolled") + 1);
else patrolMap.set("patrolled", patrolMap.get("patrolled") + 1);
}
const nsStats = Object.fromEntries(nsMap);
const importsStats = Object.fromEntries(importesMap);
const patrolStats = Object.fromEntries(patrolMap);
const nsPercentages = {};
for (const [key, value] of Object.entries(nsStats)) {
nsPercentages[key] = (value / nsStats.total) * 100;
}
const patrolPercentages = {};
const totalPatrol = Object.values(patrolStats).reduce((a, b) => a + b, 0);
for (const [key, value] of Object.entries(patrolStats)) {
patrolPercentages[key] = (value / totalPatrol) * 100;
}
return {
nsStats,
nsPercentages,
patrolStats,
patrolPercentages,
};
}
function calculateUserStats(data) {
const nsStats = {};
const patrolUserStats = {};
for (const rc of data) {
if (!nsStats[rc.user]) {
nsStats[rc.user] = {
total: 0,
main: 0,
};
}
nsStats[rc.user].total++;
if (rc.ns === 0) {
nsStats[rc.user].main++;
} else {
nsStats[rc.user][rc.ns] = (nsStats[rc.user][rc.ns] || 0) + 1;
}
if (!rc.autopatrolled) {
if (!patrolUserStats[rc.user]) {
patrolUserStats[rc.user] = { unpatrolled: 0, patrolled: 0 };
}
if (rc.unpatrolled) patrolUserStats[rc.user].unpatrolled++;
else patrolUserStats[rc.user].patrolled++;
}
}
const totalPatrolUsers = calculateTotal(patrolUserStats, "patrolled");
const totalUnpatrolledUsers = calculateTotal(patrolUserStats, "unpatrolled");
const mainUsersPercent = {};
const importsUsersPercent = {};
const patrolUsersPercent = {};
for (const user in nsStats) {
mainUsersPercent[user] = calculatePercent(nsStats[user].main, "", calculateTotal(nsStats, "main"), nsStats[user].total);
}
for (const user in patrolUserStats) {
const userTotal = nsStats[user].total;
patrolUsersPercent[user] = {
...calculatePercent(patrolUserStats[user].unpatrolled, "unpatrolled", totalUnpatrolledUsers, userTotal),
...calculatePercent(patrolUserStats[user].patrolled, "patrolled", totalPatrolUsers, userTotal),
};
}
return { usersStats: nsStats, mainUsersPercent, patrolUserStats, patrolUsersPercent };
}
function calculateTotal(data, key) {
return Object.values(data).reduce((a, b) => a + b[key], 0);
}
function calculatePercent(data, title, total, totalOfUser) {
const percent = {
[title + "OfTotal"]: Number((data / total * 100).toFixed(2))
}
if (totalOfUser) {
percent[title + "OfUser"] = Number((data / totalOfUser * 100).toFixed(2))
}
return percent;
}
getNam();