User:Rutilant/ajax-watchlist.js: Difference between revisions

Content deleted Content added
m ffs
m 1997kB moved page User:RainFall/ajax-watchlist.js to User:Rutilant/ajax-watchlist.js: Automatically moved page while renaming the user "RainFall" to "Rutilant"
 
(11 intermediate revisions by one other user not shown)
Line 1:
/*
Last update: JanuaryFebruary 3013, 2019
Status: Experimental
*/
(function() {
var config = {
var watchlist_ajax={timer:null,status:false}, token=false, current_revs={}, last_message = {};
timer: null,
if(test_currentPage()){
status: false
var top_content="<input id='watchlist-ajax-timeOut' placeholder='Refresh rate in milliseconds'><button id='a-w-start'>Start</button><button id='a-w-stop'>Stop</button><br>Status: <span id='aj-w-status'>not running</span>";
};
var main_content="<div id='auto-updating-watchlist'></div>";
var token = false,
$("div#watchlist-ajax").html(top_content+main_content);
current_revisions = {},
$("#a-w-start").click(function(){start_update_w()});
last_state = {};
$("#a-w-stop").click(function(){stop_update_w()});
}
 
function start_update_wis_sandbox() {
if ($("div#watchlist-ajax")) {
if(test_currentPage() && !watchlist_ajax.status){
return true;
var timeout=$.isNumeric($("#watchlist-ajax-timeOut").val())?$("#watchlist-ajax-timeOut").val():5000;
} else {
watchlist_ajax.status=true;
return false;
$("#auto-updating-watchlist").html("");
}
update_watchlistAjax(timeout);
}
$("#aj-w-status").html(`running (${timeout} ms)`);
if (is_sandbox()) {
}
let top_content = "<input id='ajax_watchlist_timeout' placeholder='Refresh rate in milliseconds'><button id='ajax_watchlist_start'>Start</button><button id='ajax_watchlist_stop'>Stop</button><br>Status: <span id='ajax_watchlist_status'>not running</span>";
}
let main_content = "<div id='auto_updating_watchlist'></div>";
function stop_update_w(){
$("div#watchlist-ajax").html(top_content + main_content);
watchlist_ajax.status=false;
$("#ajax_watchlist_start").click(function() {
clearTimeout(watchlist_ajax.timer);
start_updating();
$("#aj-w-status").html('stopped');
});
}
$("#ajax_watchlist_stop").click(function() {
stop_updating();
});
}
 
function update_watchlistAjaxstart_updating(timeout) {
if (test_currentPageis_sandbox() && watchlist_ajax!config.status) {
var timeout = $.isNumeric($("#ajax_watchlist_timeout").val()) ? $("#ajax_watchlist_timeout").val() : 5000;
var start_from="";
config.status = true;
$.ajax({
$("#auto_updating_watchlist").html("");
type: 'GET',
update_watchlist(timeout);
url: '/w/api.php?action=query&list=watchlist&wllimit=30&wlprop=ids|title|sizes|flags|user|comment&format=json&curtimestamp=true&wlallrev=true'+start_from,
$("#ajax_watchlist_status").html(`running (${timeout} ms)`);
dataType: 'json',
}
loop_timeout:timeout,
}
success:function(returndata){
var sitelink=''; /* for local testing */
var watchlist_items="";
var fetched_revs=[];
returndata=returndata.query.watchlist;
if(returndata.length>0){
returndata.forEach(function(e){
fetched_revs.push(e.pageid);
let length=e.newlen-e.oldlen;
let edit_summary=e.comment.substring(0, 400)||"<span style='color:#cecccc'>No edit summary.</span>" /* trim extremely long edit summary*/ ;
edit_summary=edit_summary.replace(/\[\[(.*?)\|(.*?)\]\]/g, "<a href=\"/wiki/$1\">$2</a>"); /* parse wikilinks */
let difflink=sitelink+`/w/index.php?title=${e.title}&diff=${e.revid}`;
let histlink=sitelink+`/w/index.php?title=${e.title}&action=history`;
let rollback_msg = "ajax rollback";
if (e.revid in last_message){
rollback_msg = last_message[e.revid];
}
let rollback_btn = `[<a href='#' class='aj-rollback-btn' data-rollback-pageid="${e.pageid}" data-rollback-revid="${e.revid}" data-rollback-user="${e.user}">${rollback_msg}</a>]`;
if( e.pageid in current_revs ){
if(current_revs[e.pageid] != e.revid){
rollback_btn = "";
}
}
 
function stop_updating() {
let userlink=`
config.status = false;
clearTimeout(config.timer);
$("#ajax_watchlist_status").html('stopped');
}
 
function update_watchlist(timeout) {
if (is_sandbox() && config.status) {
$.ajax({
type: 'GET',
url: '/w/api.php?action=query&list=watchlist&wllimit=30&wlprop=ids|title|sizes|flags|user|comment&format=json&curtimestamp=true&wlallrev=true',
dataType: 'json',
loop_timeout: timeout,
success: function(returndata) {
let sitelink = ''; /* for local testing */
let watchlist_items = "";
let fetched_revs = [];
returndata = returndata.query.watchlist;
if (returndata.length > 0) {
returndata.forEach(function(e) {
fetched_revs.push(e.pageid);
let length = e.newlen - e.oldlen;
let edit_summary = e.comment.substring(0, 400) || "<span style='color:#cecccc'>No edit summary.</span>" /* trim extremely long edit summary*/ ;
edit_summary = edit_summary.replace(/\[\[(.*?)\|(.*?)\]\]/g, "<a href=\"/wiki/$1\">$2</a>"); /* parse wikilinks */
let difflink = sitelink + `/w/index.php?title=${e.title}&diff=${e.revid}`;
let histlink = sitelink + `/w/index.php?title=${e.title}&action=history`;
let rollback_msg = "ajax rollback";
if (e.revid in last_state) {
rollback_msg = last_state[e.revid];
}
let rollback_btn = `[<a href='#' class='ajax_rollback_button' data-rollback-pageid="${e.pageid}" data-rollback-revid="${e.revid}" data-rollback-user="${e.user}">${rollback_msg}</a>]`;
if (e.pageid in current_revisions) {
if (current_revisions[e.pageid] != e.revid) {
rollback_btn = "";
}
}
 
let userlink = `
<a href='${sitelink}/wiki/User:${e.user}'>${e.user}</a>
(<a href='${sitelink}/wiki/User talk:${e.user}'>talk</a> |
<a href='${sitelink}/wiki/Special:Contributions/${e.user}'>contrib</a>)
`;
length = (length < 0 ? '<span style=color:red>' + length + '</span>' : '<span style=color:green>+' + length + '</span>');
watchlist_items += `
<div style='margin-bottom:5px; padding:3px; font-family:Calibri; width: 100%; word-break:break-all'>
(<a href="${difflink}">diff</a> | <a href="${histlink}">hist</a>)
Line 72 ⟶ 90:
</div>
`;
});
});
$('.b-border-div').remove();
$("#auto-updating-watchlistauto_updating_watchlist").prependhtml(watchlist_items + "<div style='border-bottom:2px solid skyblue;' class='b-border-div'></div>");
$(".aj-rollback-btnajax_rollback_button").click(function(e) {custom_rollback(e, this)});
custom_rollback(e, this);
}
});
check_revisions(fetched_revs);
}
},
check_revisions(fetched_revs);
error:e=>console.log(e),
},
complete:function(){
error: e => console.log(e),
var timeout=this.loop_timeout;
complete: function() {
watchlist_ajax.timer=setTimeout(function(){update_watchlistAjax(timeout)}, timeout);
var timeout = this.loop_timeout;
}
config.timer = setTimeout(function() {
});
update_watchlist(timeout);
}
}, timeout);
}
}
});
}
}
 
 
function check_revisions(pageid_array) {
pageid_array = [...new Set(pageid_array)];
var pageids = pageid_array.join("|");
$.get("/w/api.php?action=query&format=json&prop=revisions&pageids=" + pageids).then(response => {
var pages = response.query.pages;
pageid_array.forEach(pageid => {
var revision = "";
if(pages[pageid].revisions === undefined){
revision = '123'; /* probably a block log */
}else{
revision = pages[pageid].revisions[0].revid;
}
current_revisions[pageid] = revision;
$(`.mw-rollback-link[data-rollback-pageid=${pageid}]`).each(function() {
if ($(this)[0].dataset.revid != revision) {
$(this).html("");
} else {
let pageid = $(this)[0].dataset.rollbackPageid;
let user = $(this)[0].dataset.rollbackUser;
let rollback_msg = "ajax rollback";
if (revision in last_state) {
rollback_msg = last_state[revision];
}
let rollback_btn = `[<a href='#' class='ajax_rollback_button' data-rollback-pageid="${pageid}" data-rollback-revid="${revision}" data-rollback-user="${user}">${rollback_msg}</a>]`;
$(this).html(rollback_btn);
}
});
});
$(".ajax_rollback_button").click(function(e) {
custom_rollback(e, this);
});
});
}
 
function check_revisionsgetToken(pageid_arrayfirst_par, second_par) {
if (!token) {
pageid_array = [...new Set(pageid_array)];
$.ajax("/w/api.php?action=query&meta=tokens&type=rollback&format=json").done(data => {
var pageids=pageid_array.join("|");
token = data.query.tokens.rollbacktoken;
$.get("/w/api.php?action=query&format=json&prop=revisions&pageids=" + pageids).then(response => {
custom_rollback(first_par, second_par, true);
var pages = response.query.pages;
});
pageid_array.forEach (pageid => {
} else {
let revision = pages[pageid].revisions[0].revid;
custom_rollback(first_par, second_par, true);
current_revs[pageid] = revision;
}
$(`.mw-rollback-link[data-rollback-pageid=${pageid}]`).each(function(){
}
if($(this)[0].dataset.revid != revision){
$(this).html("");
}else{
let pageid = $(this)[0].dataset.rollbackPageid;
let user = $(this)[0].dataset.rollbackUser;
let rollback_msg = "ajax rollback";
if (revision in last_message){
rollback_msg = last_message[revision];
}
let rollback_btn = `[<a href='#' class='aj-rollback-btn' data-rollback-pageid="${pageid}" data-rollback-revid="${revision}" data-rollback-user="${user}">${rollback_msg}</a>]`;
$(this).html(rollback_btn);
}
});
});
$(".aj-rollback-btn").click(function(e) {custom_rollback(e, this)});
});
}
 
function test_currentPagecustom_rollback(e, clicked, withToken) {
e.preventDefault();
if($("div#watchlist-ajax")){
if ($(clicked).attr('href') === null) {
return true;
return;
}else{
}
return false;
if (!withToken) {
}
$(clicked).text("getting token");
}
getToken(e, clicked);
return;
function getToken(first_par, second_par){
}
if(!token){
var ID = $(clicked).attr("data-rollback-pageid");
$.ajax( "/w/api.php?action=query&meta=tokens&type=rollback&format=json" ).done(data=> {
var user = $(clicked).attr("data-rollback-user");
token=data.query.tokens.rollbacktoken;
$(clicked).text('rollbacking...');
custom_rollback(first_par, second_par, true);
last_state[$(clicked)[0].dataset.rollbackRevid] = $(clicked).text();
});
$.ajax({
}else{
type: 'POST',
custom_rollback(first_par, second_par, true);
url: '/w/api.php',
}
c_b: clicked,
}
data: {
action: "rollback",
function custom_rollback(e, clicked, withToken){
pageid: ID,
e.preventDefault();
user: user,
if($(clicked).attr('href')===null){
token: token,
return;
format: 'json'
}
},
if(!withToken){
success: function(e) {
$(clicked).text("getting token");
if (!e.error) {
getToken(e, clicked);
$(this.c_b).text('reverted');
return;
} else {
}
$(this.c_b).text(e.error.code);
var ID=$(clicked).attr("data-rollback-pageid");
console.log(e);
var user=$(clicked).attr("data-rollback-user");
}
$(clicked).text('rollbacking...');
last_message last_state[$(clickedthis.c_b)[0].dataset.rollbackRevid] = $(clickedthis.c_b).text();
},
$.ajax({
error: function(e) {
type: 'POST',
$(this.c_b).text('rollback failed');
url: '/w/api.php',
last_state[$(this.c_b)[0].dataset.rollbackRevid] = $(this.c_b).text();
c_b: clicked,
console.log(e);
data: {action:"rollback", pageid:ID, user:user, token:token, format:'json'},
}
success:function(e){
});
if(!e.error){
}
$(this.c_b).text('reverted');
mw.util.addPortletLink('p-cactions', '/wiki/User:RainFall/sandbox', 'Ajax watchlist');
}else{
$(this.c_b).text(e.error.code);
console.log(e);
}
last_message[$(this.c_b)[0].dataset.rollbackRevid] = $(this.c_b).text();
},
error:function(e){
$(this.c_b).text('rollback failed');
last_message[$(this.c_b)[0].dataset.rollbackRevid] = $(this.c_b).text();
console.log(e);
}
});
}
mw.util.addPortletLink('p-cactions', '/wiki/User:RainFall/sandbox', 'Ajax watchlist');
})();