User:Theleekycauldron/DYK modification detector.js

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.
mw.loader.load('User:Theleekycauldron/Query pages.js');
importScript('User:Theleekycauldron/User contributions.js');
mw.loader.load('http://localhost:8000/Desktop/Programming/Toolforge/DYK credit finder.js');


function log(input){
	document.getElementById("log").innerHTML += "\n"+String(input);
}
function arrays_equal(a, b) {
  if (a === b) return true;
  if ((a == null) != (b == null)) return false;
  if (a.length !== b.length) return false;

  // If you don't care about the order of the elements inside
  // the array, you should sort both arrays here.
  // Please note that calling sort on an array will modify that array.
  // you might want to clone your array first.

  for (var i = 0; i < a.length; ++i) {
    if (a[i] !== b[i]) return false;
  }
  return true;
}

function capitalize_first_letter(string) { //capitalizes first letter of a string
  return string.charAt(0).toUpperCase() + string.slice(1);
}

function detect_changes(obj){
	obj.instances.sort((a, b) => (a.revid > b.revid) ? 1 : -1);
	changes = []
	for (var i=0; i < obj.instances.length-1; i++){
		if (obj.instances[i].hook != obj.instances[i+1].hook){
			changes.push([obj.instances[i],obj.instances[i+1]]);
		}
	}
	return changes;
}

function bolded_articles(hook){
	let articles = []; //if it's a multihook, we'll have to save the articlenames to this so we can push it to multis later
	try {
		let re = /('{3}[^']*?\[\[.*?]].*?'{3})|(\[\[.*'{3}.*?'{3}]])/g; //... idk what it does honestly, i just fell asleep on my keyboard and now this mash looks for bolded articles in hooks (it looks for the '''[[Article]]''' wrapper)
		let matches = hook.match(re); //save all bolded articles into an array
		for (var j=0; j<matches.length; j++) { //search each match for pageviews
			//parsing the match to make sure we get the correct article title, to feed into the query
			matches[j] = matches[j].match(/\[\[.*?(\||]])/mg)[0]; //if the page is piped, e.g. '''[[Article|something else]]''', we're gonna want to separate out the "Article"
			if (matches[j].includes("|")){
				matches[j] = matches[j].substring(2,matches[j].indexOf("|"));
			} else {
				matches[j] = matches[j].substring(2,matches[j].lastIndexOf("]")-1);
			}
			if (matches[j].includes("#")){
				matches[j] = matches[j].substring(0,matches[j].indexOf("#")); // same thing if for some goddamn reason the bolded article is to a section
			}
			matches[j] = capitalize_first_letter(matches[j]); //capitalize the first letter of the matches, in case we got '''[[article]]'''
			articles.push(matches[j]);
		}
	} catch(err){
		return [];
	}
	return articles;
}
async function main(){
	pages = await get_pages("Template:Did you know","content|user|ids|comment","1069569365","newer");
	hooks = [];
	console.log(await pages);
	for (var page of pages){
		let title = page.title;
		console.log(page);
		for (var revision of page.revisions){
			let revid       = revision.revid;
			let user        = revision.user;
			let wikitext    = revision.slots.main.content;
			let hooklist    = wikitext.substring(wikitext.indexOf("<!--Hooks-->"),wikitext.indexOf("<!--HooksEnd-->")).split("\n");
			for (var hook of hooklist){
				if (hook.substring(0,6) == "* ... ") { //make sure it's really a hook
					let obj      = {}
					obj.articles = bolded_articles(hook);
					if (obj.articles == []){
						continue;
					}
					obj.instances           = [{}]
					obj.instances[0].hook   = hook;
					obj.instances[0].revid  = revid;
					obj.instances[0].page   = title;
					obj.instances[0].editor = user;
					let s = hooks.find((o, i) => {
						if (arrays_equal(o.articles,obj.articles)) {
							hooks[i].instances.push(obj.instances[0]);
							return true; // stop searching
						}
					});
					if (typeof(s) === 'undefined'){
						hooks.push(obj);
					}	
				}
			}
		}
	}
	for (hook of hooks){
		let changes = detect_changes(hook);
		if (changes.length > 0){
			hook.instances.sort((a, b) => (a.revid < b.revid) ? 1 : -1);
			let use = -1;
			for (instance of hook.instances){
				if (instance.page == "Template:Did you know"){ //most reliable, albeit slowest
					use = 0;
					break;
				} else if (instance.page.includes("Template:Did you know/Queue")) { //faster, but possibility of change
					use = 1;
					p = instance.page;
					break;
				} else if (instance.page.includes("Template:Did you know/Preparation area")) { //same speed as queue, less reliable
					use = 2;
					p = instance.page;
					break;
				}
			}
			let contrib_data = main_page_hunt(obj.articles);
			console.log(await contrib_data);
		}
	}
}
main()