User:WikiMacaroons/utvt.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | Documentation for this user script can be added at User:WikiMacaroons/utvt. |
/*
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/[email protected]/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";
}