Index: modules/statsmaster/files/usercounts.html |
diff --git a/modules/statsmaster/files/usercounts.html b/modules/statsmaster/files/usercounts.html |
deleted file mode 100644 |
index 6705c7751009c6e79e8834e4be2f411885a7c4fd..0000000000000000000000000000000000000000 |
--- a/modules/statsmaster/files/usercounts.html |
+++ /dev/null |
@@ -1,278 +0,0 @@ |
-<!DOCTYPE html> |
-<html> |
-<head> |
- <meta charset="utf-8"> |
- <title>User counter</title> |
- <style type="text/css"> |
- form |
- { |
- display: inline; |
- } |
- |
- .spacer |
- { |
- margin: 0 10px; |
- } |
- |
- table |
- { |
- border-collapse: collapse; |
- } |
- |
- td, th |
- { |
- padding: 5px; |
- border: 1px solid black; |
- } |
- |
- td |
- { |
- text-align: right; |
- } |
- </style> |
- <script type="text/javascript"> |
- const MILLIS_IN_DAY = 24 * 60 * 60 * 1000; |
- |
- function zeroPad(number, digits) |
- { |
- var result = number.toString(10); |
- while (result.length < digits) |
- result = "0" + result; |
- return result; |
- } |
- |
- function formatDate(date) |
- { |
- return zeroPad(date.getFullYear(), 4) + "-" + zeroPad(date.getMonth() + 1, 2) + "-" + zeroPad(date.getDate(), 2); |
- } |
- |
- var curMonth = null; |
- var curMonthFilters = null; |
- var curMonthAntiadblock = null; |
- var curMonthNotifications = null; |
- |
- function checkStats(data, fromDate, offset, callback) |
- { |
- var date = new Date(fromDate.getTime() + offset * MILLIS_IN_DAY); |
- |
- function doDownload(url, descr, callback) |
- { |
- var request = new XMLHttpRequest(); |
- request.open("GET", url); |
- request.addEventListener("load", function() |
- { |
- if (request.status != 200) |
- alert("Failed to download " + descr + ", got response " + request.status); |
- else |
- callback(JSON.parse(request.responseText)); |
- }, false); |
- request.addEventListener("error", function() |
- { |
- alert("Failed to download " + descr); |
- }, false); |
- request.send(null); |
- } |
- |
- function doCheckStats(source, type) |
- { |
- if (!(date.getDate() in source.day)) |
- return; |
- |
- var intervals = source.day[date.getDate()].previousDownload; |
- for (var interval in intervals) |
- { |
- if (!intervals.hasOwnProperty(interval)) |
- continue; |
- |
- var days; |
- if (/^\d+ day/.test(interval)) |
- days = parseInt(interval, 10); |
- else if (/^\d+ month/.test(interval)) |
- days = 31; |
- else |
- continue; |
- |
- // Most requests claiming that last download was long ago are bots or broken installations |
- if (days > 30) |
- continue; |
- |
- var hits = intervals[interval].hits; |
- for (var i = Math.max(offset, 0); i < data.length; i++) |
- { |
- if (i - offset < 30 && i - offset + days >= 30) |
- data[i]["30day " + type] += hits; |
- if (i - offset < 7 && i - offset + days >= 7) |
- data[i]["7day " + type] += hits; |
- if (i - offset < 1 && i - offset + days >= 1) |
- data[i]["1day " + type] += hits; |
- } |
- } |
- } |
- |
- var month = zeroPad(date.getFullYear(), 4) + zeroPad(date.getMonth() + 1, 2); |
- if (month != curMonth) |
- { |
- doDownload("/raw/subscription/" + month + "/exceptionrules.txt.json", "acceptable ads data for month " + month, function(json) |
- { |
- curMonthFilters = json; |
- doDownload("/raw/subscription/" + month + "/antiadblockfilters.txt.json", "anti-adblock data for month " + month, function(json) |
- { |
- curMonthAntiadblock = json; |
- doDownload("/raw/notification/" + month + "/notification.json.json", "notification data for month " + month, function(json) |
- { |
- curMonthNotifications = json; |
- curMonth = month; |
- doCheckStats(curMonthFilters, "acceptable"); |
- doCheckStats(curMonthAntiadblock, "antiadblock"); |
- doCheckStats(curMonthNotifications, "total"); |
- callback(); |
- }); |
- }); |
- }); |
- } |
- else |
- { |
- doCheckStats(curMonthFilters, "acceptable"); |
- doCheckStats(curMonthAntiadblock, "antiadblock"); |
- doCheckStats(curMonthNotifications, "total"); |
- callback(); |
- } |
- } |
- |
- function showResults(fromDate, data) |
- { |
- function createCell(row, text) |
- { |
- var cell = document.createElement("td"); |
- cell.appendChild(document.createTextNode(text)); |
- row.appendChild(cell); |
- } |
- |
- var resultBody = document.getElementById("resultBody"); |
- while (resultBody.lastChild) |
- resultBody.removeChild(resultBody.lastChild); |
- |
- for (var i = 0; i < data.length; i++) |
- { |
- var date = new Date(fromDate.getTime() + i * MILLIS_IN_DAY); |
- |
- var row = document.createElement("tr"); |
- createCell(row, date.toLocaleDateString()); |
- createCell(row, data[i]["1day total"].toLocaleString()); |
- createCell(row, data[i]["1day antiadblock"].toLocaleString()); |
- createCell(row, data[i]["1day acceptable"].toLocaleString()); |
- createCell(row, (100 - data[i]["1day acceptable"] / data[i]["1day total"] * 100).toFixed(2) + "%"); |
- createCell(row, data[i]["7day total"].toLocaleString()); |
- createCell(row, data[i]["7day antiadblock"].toLocaleString()); |
- createCell(row, data[i]["7day acceptable"].toLocaleString()); |
- createCell(row, (100 - data[i]["7day acceptable"] / data[i]["7day total"] * 100).toFixed(2) + "%"); |
- createCell(row, data[i]["30day total"].toLocaleString()); |
- createCell(row, data[i]["30day antiadblock"].toLocaleString()); |
- createCell(row, data[i]["30day acceptable"].toLocaleString()); |
- createCell(row, (100 - data[i]["30day acceptable"] / data[i]["30day total"] * 100).toFixed(2) + "%"); |
- resultBody.appendChild(row); |
- } |
- |
- document.getElementById("result").removeAttribute("hidden"); |
- document.getElementById("wait").setAttribute("hidden", "hidden"); |
- } |
- |
- function calculate() |
- { |
- document.getElementById("result").setAttribute("hidden", "hidden"); |
- document.getElementById("wait").removeAttribute("hidden"); |
- |
- var fromDate = document.getElementById("from").value.replace(/^\s+/, "").replace(/\s+$/, ""); |
- var match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(fromDate); |
- if (!match) |
- { |
- alert("Wrong start date format."); |
- document.getElementById("from").focus(); |
- return; |
- } |
- fromDate = new Date(parseInt(match[1], 10), parseInt(match[2], 10) - 1, parseInt(match[3], 10), 12); |
- |
- var toDate = document.getElementById("to").value.replace(/^\s+/, "").replace(/\s+$/, ""); |
- var match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(toDate); |
- if (!match) |
- { |
- alert("Wrong end date format."); |
- document.getElementById("to").focus(); |
- return; |
- } |
- toDate = new Date(parseInt(match[1], 10), parseInt(match[2], 10) - 1, parseInt(match[3], 10), 12); |
- |
- if (fromDate > toDate) |
- { |
- var tmp = fromDate; |
- fromDate = toDate; |
- toDate = tmp; |
- } |
- |
- var data = []; |
- for (var d = fromDate; formatDate(d) <= formatDate(toDate); d = new Date(d.getTime() + MILLIS_IN_DAY)) |
- data.push({"1day total": 0, "1day antiadblock": 0, "1day acceptable": 0, "7day total": 0, "7day antiadblock": 0, "7day acceptable": 0, "30day total": 0, "30day antiadblock": 0, "30day acceptable": 0}); |
- |
- var offset = -30; |
- var callback = function() |
- { |
- offset++; |
- if (offset >= data.length) |
- { |
- showResults(fromDate, data); |
- return; |
- } |
- checkStats(data, fromDate, offset, callback); |
- }; |
- callback(); |
- } |
- |
- window.onload = function() |
- { |
- document.getElementById("from").value = formatDate(new Date(Date.now() - 7 * MILLIS_IN_DAY)); |
- document.getElementById("to").value = formatDate(new Date(Date.now() - MILLIS_IN_DAY)); |
- } |
- </script> |
-</head> |
-<body> |
- <p> |
- Please enter the date range that you need user statistics for: |
- </p> |
- <p> |
- <form action="javascript://" onsubmit="calculate();"> |
- Start date (yyyy-mm-dd format): <input id="from" type="text"> |
- <span class="spacer"></span> |
- End date (yyyy-mm-dd format): <input id="to" type="text"> |
- <span class="spacer"></span> |
- <button type="submit">Calculate</button> |
- </form> |
- </p> |
- <p id="wait" hidden> |
- Please wait, data is being fetched... |
- </p> |
- <table id="result" hidden> |
- <tr> |
- <th rowspan="2">Date</th> |
- <th colspan="4">1-day active users</th> |
- <th colspan="4">7-day active users</th> |
- <th colspan="4">30-day active users</th> |
- </tr> |
- <tr> |
- <th>Total</th> |
- <th>Anti-adblock filters</th> |
- <th>Acceptable ads</th> |
- <th>Opt-out rate</th> |
- <th>Total</th> |
- <th>Anti-adblock filters</th> |
- <th>Acceptable ads</th> |
- <th>Opt-out rate</th> |
- <th>Total</th> |
- <th>Anti-adblock filters</th> |
- <th>Acceptable ads</th> |
- <th>Opt-out rate</th> |
- </tr> |
- <tbody id="resultBody"> |
- </tbody> |
- </table> |
-</body> |
-</html> |