לדלג לתוכן

משתמש:מיכי י-ם/סטטיסטיקות שינויים אחרונים.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();