Jump to content

User:Martijn Hoekstra/checkrange.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Martijn Hoekstra (talk | contribs) at 22:10, 15 February 2012 (create script). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//stuff for sanity-checking rangeblocks

var check_months = 1
var check_days = 0
var check_years = 0
var min_edits = 1
var testrange = "92.41.0.0/21"

if (!getElementById("Check range")) addPortletLink("p-cactions", "javascript:rangechecker_init()", "Check range", "ca-rangeChecker", "Check range");

function rangechecker_init(){
  var range=prompt("Please enter your name","Harry Potter");
  if (range!=null) {
    if (found = range.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}/)){
      get_recently_active_ips(found[0])
    } else {
      alert("misformatted range")
    }
  }
}

function showbox(){
  var message = "<h1>getting active IP's</h1>"
  message += "prefixes:<ul id='prefixlist'></ul>"
  message += "unique IP's <span id='IPs'>0</span>"
  jsMsg(message)
}

function add_prefix(prefix, list){
  console.log(prefix)
  list.push(prefix)
  var msg_prefixes = document.getElementById('prefixlist')
  var listitem = document.createElement('li')
  listitem.appendChild(document.createTextNode(prefix + ' ' ))
  var s = document.createElement("span")
  s.id = prefix
  s.innerText = 'fetching'
  listitem.appendChild(s)
  //listitem.innterHTML = 'blabla' //+ prefix + '<span id="'+prefix+'">fetching</span>'
  msg_prefixes.appendChild(listitem)
}

function get_recently_active_ips(range){
  var used_ips = {}
  var startdate = new Date()
  startdate.setFullYear(startdate.getFullYear()-check_years)
  startdate.setMonth(startdate.getMonth() - check_months)
  startdate.setDate(startdate.getDate() - check_days)
  showbox()
  get_active_ips(range, startdate, min_edits, used_ips)
  
}

function get_active_ips(range, start_date, min_edits, ips){
  var calls = construct_api_calls(range, start_date)
  for (var next_call in calls){
    var call_ips = get_ips(calls[next_call], calls[next_call], ips)
    for (var ip in call_ips){
      ips[ip] = call_ips[ip]
    }
  }
}

function get_ips(base_url, call_url, ips){
  var prefix = call_url.match(/ucuserprefix=([^&]*)/)[1]
  console.log(prefix)
  console.log(call_url)
  $.getJSON(call_url, function(data) {
    var usercontribs = data.query["usercontribs"]
    for(var item in usercontribs){
       realitem=usercontribs[item]
       if (ips.hasOwnProperty(realitem["user"])){
         ips[realitem["user"]] ++
       } else {
         ips[realitem["user"]] = 1
         var numIPs = parseInt(document.getElementById("IPs").innerText)
         numIPs++
         document.getElementById("IPs").innerText=numIPs
       }
    }
    if (data.hasOwnProperty("query-continue")){
      var next_call_postfix = data["query-continue"].usercontribs["uccontinue"]
      if (next_call_postfix){
        get_ips(base_url, base_url + "&uccontinue="+next_call_postfix, ips, prefix)
      }
      document.getElementById(prefix).innerText='fetching more'
    } else {
      document.getElementById(prefix).innerHTML='<b>done</b>'
    }
  });
}

function construct_api_calls(range, start_date){
  var formatted_startdate = start_date.getFullYear() + '-0' + (start_date.getMonth() + 1) + '-' + start_date.getDate()
  formatted_startdate += "T" + start_date.getHours() + ':' + start_date.getMinutes() + ':' + start_date.getSeconds() + "Z"
  var api_call_base_url = "https://en.wikipedia.org/w/api.php?action=query&list=usercontribs&format=json&ucstart=" + formatted_startdate + "&ucuserprefix="
  var api_calls = new Array()
  var prefixes = get_prefixes(range)
  for (var prefix in prefixes){
    api_calls.push(api_call_base_url + prefixes[prefix])
  }
  return api_calls
}

function get_prefixes(range){
  var prefixes = new Array()
  var parts = range.split('/')
  var start = parts[0]
  var size = parseInt(parts[1])
  var octet1 = parseInt(range.split('.')[0])
  var octet2 = parseInt(range.split('.')[1])
  var octet3 = parseInt(range.split('.')[2])
  var octet4 = parseInt(range.split('.')[3])

  //now the annoying part
  if (size <= 8) {
    var factor = 8 - size
    var num_blocks = 1 << factor
    max_octet1 = octet1 + num_blocks - 1
    var current_octet1 = octect1
    while(current_octet1 <= max_octet1){
      add_prefix(current_octet1.toString() + '.', prefixes)
      current_octet1++
    }
  } else if (size > 8 && size <= 16){
    var factor = 16 - size
    var num_blocks = 1 << factor
    max_octet2 = octet2 + num_blocks - 1
    var current_octet2 = octet2
    while(current_octet2 <= max_octet2){
      add_prefix(octet1.toString() + '.' + current_octet2.toString() + '.', prefixes)
      current_octet2++
    }
  } else if (size > 16 && size <= 24){
    var factor = 24 - size
    var num_blocks = 1 << factor
    max_octet3 = octet3 + num_blocks - 1
    var current_octet3 = octet3
    while(current_octet3 <= max_octet3){
      add_prefix(octet1.toString() + '.' + octet2.toString() + '.' + current_octet3.toString() + '.', prefixes)
      current_octet3++
    }
  } else {
    var factor = 32 - size
    var num_d = 1 << factor
    max_octet4 = octet4 + num_d - 1
    alert(max_octet4)
    while(current_octet4 <= max_octet4){
      add_prefix(octet1.toString() + '.' + octet2.toString() + '.' + octet3.toString() + '.' + current_octet4.toString(), prefixes)
      current_octet4++
    }
  }
  return prefixes
}