/*
REMEMBER: When putting on enwiki, make it so:
-all test.wiki, etc is changed to en.wiki
-it checks if you have rollback right
-Change prefpage to "User:"+orun+"/UTVT Preferences.js";
*/
orun = mw.user.getName( );
//orun = orun.replace(/ /g, '_');
var slotstr = "";
prefpage = "User:"+orun+"/UTVT Preferences.js";
new mw.Api().get( {
action: "query",
titles: [ prefpage ],
} ).then( function( ret ) {
$.each( ret.query.pages, function() {
if ( this.missing !== "" ) {
} else {
doSettings(prefpage);
}
} );
}, function( error ) {
} );
var rightslist = [];
var params = {
action: 'query',
meta: 'userinfo',
uiprop: 'rights',
format: 'json'
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
window.rb = 0;
for(var elem in data.query.userinfo.rights){
console.log(data.query.userinfo.rights[elem]);
rightslist.push(data.query.userinfo.rights[elem]);
}
if(rightslist.includes("sysop")){
window.issysop = 1;
}
else if(rightslist.includes("")){
window.rb = 1;
}
else{
window.issysop = 0;
}
/*
if(rb == "no"){
alert("Sorry, this script relies on you having rollback rights.");
}
*/
} );
/*function httpGet(theUrl)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
xmlHttp.send( null );
return xmlHttp.responseText;
}
console.log(JSON.parse(httpGet("https://ores.wikimedia.org/v3/scores/enwiki/977407410/damaging")));
*/
if(window.location.href == "https://en.wikipedia.org/wiki/User:WikiMacaroons/Untitled_Vandalism_Tracker/Tracker"){
window.evenorodd = 1;
document.querySelector('html').innerHTML = `
<title>Untitled Vandalism Tracker</title>
<script src="https://unpkg.com/keyboard@0.0.1/Keyboard.js"></script>
<body>
<script src="../eventsource-polyfill.js"></script>
<style>
html *
{
font-family: Arial !important;
}
.div1 {
width: 780px;
height: 100px;
border: 2px solid gold;
background-color: gold;
}
.div2 {
width: 784px;
height: 100px;
border: 2px #ffdd80;
background-color: #ffdd80;
}
.div3 {
width: 350px;
height: 100px;
border: 2px #F0F0F0;
background-color: #FFFFFF;
}
.button {
border: none;
color: white;
text-align: center;
text-decoration: none;
display: inline;
font-size: 16px;
transition-duration: 0.4s;
cursor: pointer;
}
.revb {
border: none;
color: white;
text-align: center;
text-decoration: none;
display: inline;
font-size: 16px;
transition-duration: 0.4s;
cursor: pointer;
width: 100px;
height: 40px;
}
.adactions {
border: none;
color: white;
text-align: center;
text-decoration: none;
display: inline;
font-size: 16px;
transition-duration: 0.4s;
cursor: pointer;
width: 300px;
height: 40px;
}
.button3 {
background-color: #ebf0f5;
color: black;
border: 2px solid #ebf0f5;
}
.button3:hover {
background-color: #fa6e4b;
color: white;
border: 2px solid #fa6e4b;
}
.buttonvandalism {
background-color: #ffcbc7;
color: black;
border: 2px solid #ffcbc7;
}
.buttonvandalism:hover {
background-color: #d40f00;
color: black;
border: 2px solid #d40f00;
}
.buttontest {
background-color: #fccc9f;
color: black;
border: 2px solid #fccc9f;
}
.buttontest:hover {
background-color: #d16806;
color: black;
border: 2px solid #d16806;
}
.buttonunsource {
background-color: #ffe37d;
color: black;
border: 2px solid #ffe37d;
}
.buttonunsource:hover {
background-color: #e3b200;
color: black;
border: 2px solid #e3b200;
}
.buttonpromo {
background-color: #d5ff8c;
color: black;
border: 2px solid #d5ff8c;
}
.buttonpromo:hover {
background-color: #77a823;
color: black;
border: 2px solid #77a823;
}
.buttonremove {
background-color: #d2f1fa;
color: black;
border: 2px solid #d2f1fa;
}
.buttonremove:hover {
background-color: #4da5bd;
color: black;
border: 2px solid #4da5bd;
}
.buttonblp {
background-color: #e7baf5;
color: black;
border: 2px solid #e7baf5;
}
.buttonblp:hover {
background-color: #a054b8;
color: black;
border: 2px solid #a054b8;
}
.buttonnpov {
background-color: #fcacc9;
color: black;
border: 2px solid #fcacc9;
}
.buttonnpov:hover {
background-color: #eb3172;
color: black;
border: 2px solid #eb3172;
}
p.revidcss {
color: grey;
text-indent: 20px;
font-size: 13px;
}
p.pagetitlecss {
text-indent: 20px;
}
.right {
float: right;
margin-right: 5%;
}
p.add{
color: green;
font-size: 13px;
}
p.subtract{
color: red;
font-size: 13px;
}
p.reverthead{
float: right;
margin-right: 5%;
}
p.warnhead{
float: right;
margin-right: 5%;
}
.diff td div {
word-wrap: break-word;
}
.diff-editfont-monospace .diff-addedline, .diff-editfont-monospace .diff-deletedline, .diff-editfont-monospace .diff-context {
font-family: monospace,monospace;
}
.diff-contentalign-left td {
direction: ltr;
unicode-bidi: embed;
}
.diff-addedline, .diff-deletedline, .diff-context {
font-size: 13px;
line-height: 1.6;
vertical-align: top;
white-space: pre-wrap;
border-style: solid;
border-width: 1px 1px 1px 4px;
border-radius: 0.33em;
}
.diff-currentversion-title, .diff {
direction: ltr;
unicode-bidi: embed;
}
.diff {
border: 0;
border-spacing: 4px;
margin: 0;
width: 100%;
table-layout: fixed;
}
.inner {
margin-right: 900px
}
.table tbody tr.table-indent{
padding-left: 900px;
}
/* The Modal (background) */
.modal {
display: none; /* Hidden by default */
position: fixed; /* Stay in place */
z-index: 1; /* Sit on top */
left: 0;
top: 0;
width: 100%; /* Full width */
height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */
background-color: rgb(0,0,0); /* Fallback color */
background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
}
/* Modal Content/Box */
.modal-content {
background-color: #fefefe;
margin: 15% auto; /* 15% from the top and centered */
padding: 20px;
border: 1px solid #888;
width: 80%; /* Could be more or less, depending on screen size */
}
/* The Close Button */
.blockClose {
color: #aaa;
float: right;
font-size: 28px;
font-weight: bold;
}
.blockClose:hover,
.blockClose:focus {
color: black;
text-decoration: none;
cursor: pointer;
}
.protectClose {
color: #aaa;
float: right;
font-size: 28px;
font-weight: bold;
}
.protectClose:hover,
.protectClose:focus {
color: black;
text-decoration: none;
cursor: pointer;
}
.setClose {
color: #aaa;
float: right;
font-size: 28px;
font-weight: bold;
}
.setClose:hover,
.setClose:focus {
color: black;
text-decoration: none;
cursor: pointer;
}
.slidecontainer {
width: 100%; /* Width of the outside container */
}
/* The slider itself */
.slider {
-webkit-appearance: none; /* Override default CSS styles */
appearance: none;
width: 100%; /* Full-width */
height: 25px; /* Specified height */
background: #d3d3d3; /* Grey background */
outline: none; /* Remove outline */
opacity: 0.7; /* Set transparency (for mouse-over effects on hover) */
-webkit-transition: .2s; /* 0.2 seconds transition on hover */
transition: opacity .2s;
}
/* Mouse-over effects */
.slider:hover {
opacity: 1; /* Fully shown on mouse-over */
}
/* The slider handle (use -webkit- (Chrome, Opera, Safari, Edge) and -moz- (Firefox) to override default look) */
.slider::-webkit-slider-thumb {
-webkit-appearance: none; /* Override default look */
appearance: none;
width: 25px; /* Set a specific slider handle width */
height: 25px; /* Slider handle height */
background: #4CAF50; /* Green background */
cursor: pointer; /* Cursor on hover */
}
.slider::-moz-range-thumb {
width: 25px; /* Set a specific slider handle width */
height: 25px; /* Slider handle height */
background: #4CAF50; /* Green background */
cursor: pointer; /* Cursor on hover */
}
</style>
<script src="//cdnjs.cloudflare.com/ajax/libs/mousetrap/1.4.6/mousetrap.min.js"></script>
<div id="blockModal" class="modal">
<!-- Modal content -->
<div class="modal-content">
<span class="blockClose">×</span>
<h1 id="blockHeader">Blocking User: </h1>
<p id="blockSub">[ADMIN STATUS]</p>
<div id="nonAdBlock">
<label for="blockPrimary">Primary Linked Page:</label>
<input type="text" id="blockPrimary" name="blockPrimary"><br><br>
<label for="blockComment">Comment:</label><br><br>
<textarea id="blockComment" name="blockComment" rows="4" cols="50">
</textarea><br><br>
<button class="revb buttonremove" id="blockSubmit" onclick="submitBlock((document.getElementById('blockPrimary').value), (document.getElementById('blockComment').value))">Submit</button>
</div>
</div>
</div>
<div id="protectModal" class="modal">
<!-- Modal content -->
<div class="modal-content">
<span class="protectClose">×</span>
<h1 id="protHeader">Protecting Page: </h1>
<p id="protSub">[ADMIN STATUS]</p>
<label for="protDur">Duration:</label>
<select id="protDur" name="protDur">
<option value="Temporary">Temporary</option>
<option value="Indefinite">Indefinite</option>
</select>
<label for="protType">Type:</label>
<select id="protType" name="protType">
<option value="Semi-Protection">Semi-Protection</option>
<option value="Extended Confirmed Protection">Extended Confirmed Protection</option>
<option value="Pending Changes Protection">Pending Changes Protection</option>
<option value="Move Protection">Move Protection</option>
<option value="Full Protection">Full Protection</option>
</select><br>
<label for="protComment">Reason:</label><br><br>
<textarea id="protComment" name="protComment" rows="4" cols="50">Persistent [[WP:VAND|vandalism]].</textarea><br><br>
<button class="revb buttonunsource" id="protSubmit" onclick="submitProt(document.getElementById('protDur').value, document.getElementById('protType').value, document.getElementById('protComment').value)">Submit</button>
</div>
</div>
<div id="setModal" class="modal">
<!-- Modal content -->
<div class="modal-content">
<span class="setClose">×</span>
<h1 id="setHeader">Settings</h1>
<p>Probability of Vandalism</p> <a href="https://en.wikipedia.org/wiki/User:WikiMacaroons/Untitled_Vandalism_Tracker/Guide#Probability_of_Vandalism">(?)</a>
<div class="slidecontainer">
<input type="range" min="1" max="100" value="0" class="slider" id="myRange">
</div>
<p>Probability:</p> <p id="vandalprob"></p><br>
<p>Namespaces:</p>
<div id="namespaces">
</div>
<br>
<button class="revb buttonnpov" id="setSubmit" onclick="submitSettings()">Submit</button>
</div>
</div>
<div id='diff' style='float:right' class='div3'></div>
<p id='feed' style='font-size: 15px;'></p>
<p id="prefs" style="color: white;"></p>
</body>
`;
parseSlots(prefpage);
setTimeout(() => { var myobj = document.getElementById("prefs"); window.prefstr = myobj.textContent; myobj.remove(); }, 2000);
//var EventSource = require('eventsource');
var url = 'https://stream.wikimedia.org/v2/stream/recentchange';
console.log(`Connecting to EventStreams at ${url}`);
var eventSource = new EventSource(url);
eventSource.onopen = function(event) {
console.log('--- Opened connection.');
};
eventSource.onerror = function(event) {
console.error('--- Encountered error', event);
};
eventSource.onmessage = function(event) {
// event.data will be a JSON string containing the message event.
//console.log(JSON.parse(event.data));
var change = JSON.parse(event.data);
window.windowchange = JSON.parse(event.data);
/*changewiki = window.windowchange.wiki;
changeid = window.windowchange.revision;
changeid = changeid.new;
console.log(changewiki);
console.log(changeid);*/
try{
usenewrev = JSON.parse(event.data).id;
usewiki = JSON.parse(event.data).wiki;
} catch{
usewiki = "TEST";
}
//alert(usenewrev);
if(usewiki == "enwiki"){
if(checkOres(usenewrev, "70")== true){
console.log(JSON.parse(event.data));
window.revnew = JSON.parse(event.data).revision.new;
window.revold = JSON.parse(event.data).revision.old;
window.paget = JSON.parse(event.data).title;
window.user = JSON.parse(event.data).user;
window.comment = JSON.parse(event.data).parsedcomment;
window.schange = JSON.parse(event.data)["length"].new - JSON.parse(event.data)["length"].old;
compare(revold, revnew, paget, user, comment, schange);
/*catch(err){
if(err.toString().indexOf("read property 'new' of undefined") != -1){
console.log("new page");
}
}*/
}
}
};
}
function compare(oldr, newr, title, uname, summary, sizechange){
var today = new Date();
var time = "";
if(today.getMinutes().toString().length == 1){
time = today.getHours() + ":0" + today.getMinutes();
}
else{
time = today.getHours() + ":" + today.getMinutes();
}
time += " ";
var params = {
action: "compare",
format: "json",
fromrev: oldr,
torev: newr
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
if(schange.toString().indexOf("-") != -1){
schange = "<p class='subtract' style='margin:0;display:inline:float:right' id='viewc'><b> ("+schange+")</b></p>";
}
else{
if(schange.toString() == "0"){
schange = "<p class='revidcss' style='margin:0;display:inline:float:right' id='viewc'><b> (+"+schange+")</b></p>";
}
else{
schange = "<p class='add' style='margin:0;display:inline:float:right' id='viewc'><b> (+"+schange+")</b></p>";
}
}
docrev = `
<div class='div`+evenorodd+`'><p class='revidcss' style="margin:0;display:inline;float:left">Revision Id: `+newr+` `+time+`</p> `+schange+`<button class="right button button3" onclick='viewDiff(`+oldr+`, `+newr+`, "`+uname+`", "`+title+`")'>View change</button>
<p class='pagetitlecss'>`+title+`</p>
<p class='pagetitlecss'>Change made by User:<b>`+uname+`.</b> Summary: <b>"`+summary+`"</b>.</p>
</div>
`;
if(evenorodd == 1){
evenorodd = 2;
}
else{
evenorodd = 1;
}
//document.getElementById("feed").innerHTML = data.compare["*"]+document.getElementById("feed").innerHTML;
document.getElementById("feed").innerHTML = docrev+document.getElementById("feed").innerHTML;
console.log(data);
//document.getElementById("diff").innerHTML = (data.compare["*"]);
} );
}
function viewDiff(oldrev, newrev, author, pagename){
window.currpn = pagename;
var diffparams = {
action: "compare",
format: "json",
fromrev: oldrev,
torev: newrev
},
diffapi = new mw.Api();
diffapi.get( diffparams ).done( function ( diffdata ) {
document.getElementById("diff").innerHTML = `<p class='reverthead' style='padding-right: 440px; line-height: 30px'>Revert<br>
<button class='right revb buttonvandalism' onclick='revertChange("`+author+`", "Reverted edits by [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for [[WP:VANDALISM|Vandalism]]. ([[User:WikiMacaroons/UTVT|UTVT]])", "`+pagename+`")'>Vandalism</button><br>
<button class='right revb buttontest' onclick='revertChange("`+author+`", "Reverted edits by [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for Test Edits. ([[User:WikiMacaroons/UTVT|UTVT]])", "`+pagename+`")'>Tests</button><br>
<button class='right revb buttonunsource' onclick='revertChange("`+author+`", "Reverted edits by [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for [[WP:Verifiability|Unsourced content]]. ([[User:WikiMacaroons/UTVT|UTVT]])", "`+pagename+`")'>Unsourced</button><br>
<button class='right revb buttonpromo' onclick='revertChange("`+author+`", "Reverted edits by [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for [[WP:PROMO|Promotional Content]]. ([[User:WikiMacaroons/UTVT|UTVT]])", "`+pagename+`")'>Promotion</button><br>
<button class='right revb buttonremove' onclick='revertChange("`+author+`", "Reverted edits by [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for Unexplained content removal. ([[User:WikiMacaroons/UTVT|UTVT]])", "`+pagename+`")'>Content Removal</button><br>
<button class='right revb buttonblp' onclick='revertChange("`+author+`", "Reverted edits by [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for [[WP:BLP|BLP Violation]]. ([[User:WikiMacaroons/UTVT|UTVT]])", "`+pagename+`")'>BLP Violation</button><br>
<button class='right revb buttonnpov' onclick='revertChange("`+author+`", "Reverted edits by [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for [[WP:NPOV|Neutral POV issue]]. ([[User:WikiMacaroons/UTVT|UTVT]])", "`+pagename+`")'>NPOV Issue</button><br>
</p>
<p class='warnhead' style='position: absolute; top: 30px; right: -30px;'>Warn<br>
<button class='right revb buttonvandalism' onclick='warnUser("`+author+`", "Warned [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for [[WP:VANDALISM|Vandalism]]. ([[User:WikiMacaroons/UTVT|UTVT]])", "uw-vandalism", "`+pagename+`")'>Vandalism</button><br>
<button class='right revb buttontest' onclick='warnUser("`+author+`", "Warned [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for Test Edits. ([[User:WikiMacaroons/UTVT|UTVT]])", "uw-test", "`+pagename+`")'>Tests</button><br>
<button class='right revb buttonunsource' onclick='warnUser("`+author+`", "Warned [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for [[WP:Verifiability|Unsourced content]]. ([[User:WikiMacaroons/UTVT|UTVT]])", "uw-unsourced", "`+pagename+`")'>Unsourced</button><br>
<button class='right revb buttonpromo' onclick='warnUser("`+author+`", "Warned [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for [[WP:PROMO|Promotional Content]]. ([[User:WikiMacaroons/UTVT|UTVT]])", "uw-advert", "`+pagename+`")'>Promotion</button><br>
<button class='right revb buttonremove' onclick='warnUser("`+author+`", "Warned [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for Unexplained content removal. ([[User:WikiMacaroons/UTVT|UTVT]])", "uw-delete", "`+pagename+`")'>Content Removal</button><br>
<button class='right revb buttonblp' onclick='warnUser("`+author+`", "Warned [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for [[WP:BLP|BLP Violation]]. ([[User:WikiMacaroons/UTVT|UTVT]])", "uw-biog", "`+pagename+`")'>BLP Violation</button><br>
<button class='right revb buttonnpov' onclick='warnUser("`+author+`", "Warned [[Special:Contributions/`+author+`|`+author+`]] ([[User talk:`+author+`|talk]]) for [[WP:NPOV|Neutral POV issue]]. ([[User:WikiMacaroons/UTVT|UTVT]])", "uw-npov", "`+pagename+`")'>NPOV Issue</button><br>
</p>
<div style='overflow: scroll; width: 320px; height: 300px; position: absolute; left: 900px; top: 30px;'><table class='table tbody tr.table-indent'>`+diffdata.compare["*"]+`</table></div>
<div style='position: absolute; right: 150px; top: 350px;'><button class='adactions buttonremove' onclick='blockUser("`+author+`", "`+issysop+`", "`+pagename+`")'>Block/Request Block of User</button></div>
<div style='position: absolute; right: 150px; top: 390px;'><button class='adactions buttonunsource' onclick='protectPage("`+pagename+`", "`+issysop+`")'>Protect/Request protection of Page</button></div>
<div style='position: absolute; right: 150px; top: 430px;'><button class='adactions buttonnpov' onclick='settings();'>Settings</button></div>
`;
});
}
function warnUser(authname, reason, template, currentpn){
document.querySelector('html').style.cursor = "progress";
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var dnums = new Date();
var monthname = months[dnums.getMonth()];
var year = dnums.getFullYear();
var wheading = monthname+" "+year;
var pageexists = 0;
var warnparams = {
action: 'query',
prop: 'revisions',
titles: 'User talk:'+authname,
rvslots: '*',
rvprop: 'content',
formatversion: '2',
format: 'json',
},
warnapi = new mw.Api();
warnapi.postWithToken( 'csrf', warnparams ).done( function ( data ) {
window.fullpagetext = data.query.pages[0].revisions[0].slots.main.content;
if(data.query.pages[0].missing == true){
console.log("Page does not exist");
sendNewWarn(template, authname, reason, wheading, "1", data.query.pages[0].revisions[0].slots.main.content);
}
else if(data.query.pages[0].missing == undefined){
console.log("Page does exist");
findLastWarn(authname, data.query.pages[0].revisions[0].slots.main.content, wheading, template, reason, currentpn);
}
} );
}
function sendNewWarn(tname, authorn, summ, datehead, num, pagetext){
var months2 = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var dnums2 = new Date();
var monthname2 = months2[dnums2.getMonth()];
var year2 = dnums2.getFullYear();
var wheading2 = monthname2+" "+year2;
curlyb = "{";
curlybt = "}";
sigha = "~~";
if(datehead == ""){//BROOD OVER IT, BUT PUT THE SOLUTION HERE
ttoap = `
`+curlyb+curlyb+"subst:"+tname+num+curlybt+curlybt+sigha+sigha;
const regexp = /==.*?==/g;
const insts = [...fullpagetext.matchAll(regexp)];
sect = insts.indexOf("== "+wheading2+" ==");
for(var thisitem in insts){
if(insts[thisitem] == "== "+wheading2+" =="){
sect = thisitem;
break;
}
}
sect = (parseInt(sect))+1;
var params = {
action: 'edit',
title: 'User talk:'+authorn,
appendtext: ttoap,
format: 'json',
summary: summ,
section: sect
},
api = new mw.Api();
api.postWithToken( 'csrf', params ).done( function ( data ) {
console.log( data );
} );
}
else{
ttoap = `
== `+datehead+` ==
`+curlyb+curlyb+"subst:"+tname+num+curlybt+curlybt+sigha+sigha;
var newparams = {
action: 'edit',
title: 'User talk:'+authorn,
appendtext: ttoap,
format: 'json',
summary: summ,
},
newapi = new mw.Api();
newapi.postWithToken( 'csrf', newparams ).done( function ( newdata ) {
console.log( newdata );
} );
}
setTimeout(() => { document.querySelector('html').style.cursor = "auto"; }, 1500);
}
function findLastWarn(username, wikitext, sectionhead, wtplate, esumm, currentpagename){
if(wikitext.lastIndexOf("== "+sectionhead+" ==") == -1){
sendNewWarn(wtplate, username, esumm, sectionhead, "1", wikitext);
}
else{
wikitext = wikitext.substring(wikitext.lastIndexOf("== "+sectionhead+" =="), wikitext.length);
wikitext = wikitext.replace("== "+sectionhead+" ==", "");
const titleregex = /==.*?==/;
if(wikitext.search(titleregex) == -1){
wikitext = wikitext.substring(0, wikitext.length);
}
else{
wikitext = wikitext.substring(0, wikitext.search(titleregex));
}
if(wikitext.includes("[[File:Stop hand nuvola.svg")){
document.querySelector('html').style.cursor = "auto";
reportit = confirm("This user has reached Level 4 warning. Would you like to report them to AIV?");
if(reportit){
blockUser(username, issysop, currentpagename);
}
}
else if(wikitext.includes("[[File:Nuvola apps important.svg") && !wikitext.includes("[[File:Stop hand nuvola.svg")){
sendNewWarn(wtplate, username, esumm, "", "4", wikitext);
}
else if(wikitext.includes("[[File:Information orange.svg") && !wikitext.includes("[[File:Nuvola apps important.svg")){
sendNewWarn(wtplate, username, esumm, "", "3", wikitext);
}
else if(wikitext.includes("[[File:Information.svg") && !wikitext.includes("[[File:Information orange.svg")){
sendNewWarn(wtplate, username, esumm, "", "2", wikitext);
}
}
}
function revertChange(chuser, editsummary, pagetitle){
var revertparams = {
action: 'rollback',
title: pagetitle,
user: chuser,
summary: editsummary,
format: 'json'
},
revertapi = new mw.Api();
revertapi.postWithToken( 'rollback', revertparams ).done( function ( revertdata ) {
console.log( revertdata );
} );
}
function blockUser(usertoblock, isadmin, primarypage){
var aivparams = {
action: 'query',
prop: 'revisions',
titles: 'Wikipedia:Administrator intervention against vandalism',
rvslots: '*',
rvprop: 'content',
formatversion: '2',
format: 'json',
},
aivapi = new mw.Api();
aivapi.postWithToken( 'csrf', aivparams ).done( function ( aivdata ) {
var aivtext = aivdata.query.pages[0].revisions[0].slots.main.content;
if(aivtext.includes("Vandal|"+usertoblock+"}}") || aivtext.includes("vandal|"+usertoblock+"}}")){
alert("This user appears to have already been reported.")
}
else{
window.currentblockuser = usertoblock
document.querySelector('html').style.cursor = "auto";
window.modal = document.getElementById("blockModal");
var span = document.getElementsByClassName("blockClose")[0];
document.getElementById("blockHeader").textContent = "Blocking User: "+usertoblock;
if(isadmin == "0"){
document.getElementById("blockSub").textContent = "You are not an admin. This GUI will allow you to submit a block request.";
document.getElementById("blockPrimary").value = primarypage;
document.getElementById("blockComment").value = "Vandalism past level 4 warning.";
modal.style.display = "block";
// When the user clicks on <span> (x), close the modal
span.onclick = function() {
modal.style.display = "none";
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = "none";
}
}
}
else if(isadmin == "1"){
document.getElementById("blockSub").textContent = "You are an admin. This GUI will allow you to block this user. (Except it won't, because I haven't finished it yet.)"
notshowblock = document.getElementById("nonAdBlock")
notshowblock.style.display = "none";
modal.style.display = "block";
// When the user clicks on <span> (x), close the modal
span.onclick = function() {
modal.style.display = "none";
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = "none";
}
}
}
}
} );
}
function submitBlock(primarypage, blockmess){
document.querySelector('html').style.cursor = "progress";
if(primarypage.replace(/ /g, "") == ""){
reporttext = `
* {`+`{vandal|`+currentblockuser+`}`+`} – `+blockmess+` ~~`+`~~`;
}
else {
reporttext = `
* {`+`{vandal|`+currentblockuser+`}`+`} – On [[`+primarypage+`]]: `+blockmess+` ~~`+`~~`;
}
var reportparams = {
action: 'edit',
title: 'Wikipedia:Administrator intervention against vandalism',
appendtext: reporttext,
format: 'json',
summary: "Reporting User [[Special:Contributions/"+currentblockuser+"|"+currentblockuser+"]] ([[User talk:"+currentblockuser+"|talk]]) to AIV. ([[User:WikiMacaroons/UTVT|UTVT]])",
section: 1
},
reportapi = new mw.Api();
reportapi.postWithToken( 'csrf', reportparams ).done( function ( reportdata ) {
console.log( reportdata.toString() );
} );
modal.style.display = "none";
setTimeout(() => { document.querySelector('html').style.cursor = "auto"; }, 1500);
}
function protectPage(article, adminstat){
window.currentprotpage = article;
window.protmodal = document.getElementById("protectModal");
var protspan = document.getElementsByClassName("protectClose")[0];
document.getElementById("protHeader").textContent = "Protecting Page: "+article;
protmodal.style.display = "block";
protspan.onclick = function() {
protmodal.style.display = "none";
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target == protmodal) {
protmodal.style.display = "none";
}
}
if(adminstat == "0"){
document.getElementById("protSub").textContent = "You are not an admin. This GUI will allow you to submit a protection request."
}
}
function submitProt(duration, protection, protcomment){
document.querySelector('html').style.cursor = "progress";
cbrack = "{"
ocbrack = "}"
if(duration == "Indefinite"){
duration = "";
}
else{
duration = "Temporary ";
}
protsubmit = `
=== [[:`+currentprotpage+`]] ===
* `+cbrack+cbrack+`pagelinks|1=`+currentprotpage+ocbrack+ocbrack+`
'''`+duration+protection+`:''' `+protcomment+` ~~`+`~~`;
var protparams = {
action: 'edit',
title: 'Wikipedia:Requests for page protection',
appendtext: protsubmit,
format: 'json',
summary: "Requesting "+duration+protection+" of [["+currentprotpage+"]]. ([[User:WikiMacaroons/UTVT|UTVT]])",
section: 1
},
protapi = new mw.Api();
protapi.postWithToken( 'csrf', protparams ).done( function ( protdata ) {
console.log( protdata.toString() );
} );
modal.style.display = "none";
setTimeout(() => { document.querySelector('html').style.cursor = "auto"; }, 1500);
}
function settings(){
userprefstr = window.prefstr;
window.setmodal = document.getElementById("setModal");
var setspan = document.getElementsByClassName("setClose")[0];
setmodal.style.display = "block";
setspan.onclick = function() {
setmodal.style.display = "none";
}
var slider = document.getElementById("myRange");
document.getElementById("myRange").value = getSlot(1, userprefstr);
document.getElementById("vandalprob").textContent = slider.value.toString()+"%"; // Display the default slider value
// Update the current slider value (each time you drag the slider handle)
slider.oninput = function() {
//output.innerHTML = this.value;
document.getElementById("vandalprob").textContent = this.value.toString()+"%";
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target == setmodal) {
setmodal.style.display = "none";
}
}
loopnum = 2;
listchecked = [];
while(loopnum < 10){
currslot = getSlot(loopnum, userprefstr);
if(currslot.toString() == "1"){
listchecked.push(" checked")
}
else{
listchecked.push("")
}
loopnum += 1;
}
document.getElementById("namespaces").innerHTML += `<input type="checkbox" id="namespace1" name="namespace1" value="NS1"`+listchecked[0]+`>
<label for="namespace1">Main</label><br>
<input type="checkbox" id="namespace2" name="namespace2" value="NS2"`+listchecked[1]+`>
<label for="namespace2">Talk</label><br>
<input type="checkbox" id="namespace3" name="namespace3" value="NS3"`+listchecked[2]+`>
<label for="namespace3">User</label><br>
<input type="checkbox" id="namespace4" name="namespace4" value="NS4"`+listchecked[3]+`>
<label for="namespace4">User talk</label><br>
<input type="checkbox" id="namespace5" name="namespace5" value="NS5"`+listchecked[4]+`>
<label for="namespace5">Wikipedia</label><br>
<input type="checkbox" id="namespace6" name="namespace6" value="NS6"`+listchecked[5]+`>
<label for="namespace6">File</label><br>
<input type="checkbox" id="namespace7" name="namespace7" value="NS7"`+listchecked[6]+`>
<label for="namespace7">Template</label><br>
<input type="checkbox" id="namespace8" name="namespace8" value="NS8"`+listchecked[7]+`>
<label for="namespace8">Category</label><br>
`;
}
/// FIX THE CATEGORY LINKS LATER MAYBE ///
function doSettings(settingsp){
alert("Installing Untitled Vandalism Tracker...")
settingsdata = `/* This is your UTVT Preferences Page. Please do not edit it Manually. */
[65][1][0][0][0][0][0][0][0]
/*`+`[ [Category:UTVT Preferences Pages]]*/`;
var setparams = {
action: 'edit',
title: settingsp,
appendtext: settingsdata,
comment: "Installing Script. ([[User:WikiMacaroons/UTVT|UTVT]])",
format: 'json'
},
setapi = new mw.Api();
setapi.postWithToken( 'csrf', setparams ).done( function ( setdata ) {
console.log( setdata );
} );
alert("Done!")
location.reload();
}
function parseSlots(slotpage){
var slotparams = {
action: 'query',
prop: 'revisions',
titles: slotpage,
rvslots: '*',
rvprop: 'content',
summary: 'Installing [[User:WikiMacaroons/UTVT/Beta 1.0|UTVT Beta 1.0]].',
formatversion: '2',
format: 'json',
},
slotapi = new mw.Api();
slotapi.postWithToken( 'csrf', slotparams ).done( function ( slotdata ) {
usevar = slotdata.query.pages[0].revisions[0].slots.main.content;
document.getElementById("prefs").textContent = usevar;
});
}
function sleep(milliseconds) {
const date = Date.now();
let currentDate = null;
do {
currentDate = Date.now();
} while (currentDate - date < milliseconds);
}
function checkOres(oresid, userprefs){
//alert(oresid);
//oresid = JSON.parse(window.windowchange).revision.new;
//alert("https://ores.wikimedia.org/v3/scores/enwiki/"+oresid.toString()+"/damaging")
orespercentage = getSlot(1, userprefs);
theUrl = "https://ores.wikimedia.org/v3/scores/enwiki/"+oresid.toString()+"/damaging"
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
xmlHttp.send( null );
responsetext = xmlHttp.responseText.toString().substring(1, (xmlHttp.responseText.toString().lastIndexOf("}")))
responsetext = responsetext.substring(responsetext.indexOf("true"), responsetext.lastIndexOf("}"))
responsetext = responsetext.replace("true\":", "")
responsetext = responsetext.replace(/\}/g, "")
responsetext = responsetext.replace(/ /g, "")
responsetext = responsetext.replace(/\n/g, "")
truescore = parseFloat(responsetext);
if(truescore * 100 >= orespercentage){
return true;
}
else{
return false;
}
}
function getSlot(slotnum, prefstring){
prefstring = prefstring.replace(/\/\*.*?\*\//g, "");
prefstring = prefstring.replace(/\[/g, "");
prefstring = prefstring.replace(/\]/g, "|");
preflist = prefstring.split("|");
return (preflist[slotnum-1]).replace(/\s/g, "");
}
function submitSettings(){
updatestring = "/* This is your UTVT Preferences Page. Please do not edit it Manually. */";
usepercent = document.getElementById("myRange").value.toString()
updatestring += `
[`+usepercent+`]`;
namespacenum = 1;
while(namespacenum < 9){
if((document.getElementById("namespace"+(namespacenum.toString())).checked) == true){
updatestring += "[1]";
}
else{
updatestring += "[0]";
}
namespacenum += 1;
}
updatestring += `
/*[[`+`Category:UTVT Preferences Pages] ]*/`;
alert("Saving settings...")
var setparams2 = {
action: 'edit',
title: "User:"+(mw.user.getName( ))+"/UTVT Preferences.js",
text: updatestring,
comment: "Updating Preferences. ([[User:WikiMacaroons/UTVT|UTVT]])",
format: 'json'
},
setapi2 = new mw.Api();
setapi2.postWithToken( 'csrf', setparams2 ).done( function ( setdata2 ) {
console.log( setdata2 );
} );
alert("Done!")
location.reload();
document.getElementById("setModal").style.display = "none";
}