User:Suffusion of Yellow/effp-helper-test.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:Suffusion of Yellow/effp-helper-test. |
/*
* WP:EF/FP helper
*
* Experimental script to copy text from Special:AbuseLog entries to the edit form, and merge
* with subsequent revisions if possible.
*/
// <nowiki>
$(function() {
var abuselog_id;
// First see if we are on a details/examine page, and add a handy link if so (under "More" menu in Vector)
if ((abuselog_id = mw.config.get('wgPageName').match(/^Special:Abuse(?:Filter\/examine\/log|Log)\/([0-9]+)$/)) !== null) {
mw.loader.using( 'mediawiki.util', function() {
var page_title = $('.mw-abuselog-details-page_prefixedtitle div.mw-abuselog-var-value').text();
// Private log entry and no permissions, no need to irritate with an error message every time, so fail silently
if (!page_title.length)
return;
// Use action=submit instead of action=edit to prevent 2017 editor from loading
var link = mw.config.get('wgScript') + "?title=" + mw.util.wikiUrlencode(page_title)
+ "&action=submit&effp_aflid=" + abuselog_id[1];
mw.util.addPortletLink('p-cactions', link , 'make edit', 'ca-makeedit', 'Perform edit on behalf of user');
});
} // Otherwise, did we follow the link added above?
else if (mw.config.get('wgAction') == "submit" && (abuselog_id = window.location.href.match(/&effp_aflid=([0-9]+)/)) !== null) {
mw.loader.using( [ 'mediawiki.api'], function() {
mw.notify("Fetching data from filter log...");
var api = new mw.Api();
api.get( {
action: 'query',
prop: 'revisions',
pageids: mw.config.get('wgArticleId'),
rvprop: "ids|timestamp|user",
rvlimit: 50,
list: 'abuselog',
afllogid: abuselog_id[1],
aflprop: 'ids|user|timestamp|details'
}).done(preload_edit) .fail(function() {
mw.notify("Failed to copy data from filter log" );
});
});
}
function preload_edit(api_response) {
var cur_wikitext = $('#wpTextbox1').val();
var page_id = mw.config.get('wgArticleId');
var page_name = mw.config.get('wgPageName').replace(/_/g, ' ');
if (!api_response.query || !api_response.query.abuselog[0] || !api_response.query.abuselog[0].details) {
mw.notify("Incomplete response from API");
return;
}
var le = api_response.query.abuselog[0];
var le_page_id = le.details.page_id;
var le_page_name = le.details.page_prefixedtitle;
// Text scraped from form (always?) has a trailing \n, text from API does not
cur_wikitext = cur_wikitext.replace(/\n$/, '');
// Sanity check
if (le_page_id !== '0' && le_page_id != page_id) {
mw.notify("Log entry is from page id " + le_page_id + " but this page has id " + page_id);
return;
}
// Sanity check for page creations
if (le_page_name != page_name) {
mw.notify("Log entry is from page name \"" + le_page_name + "\" but this page has name \"" + page_name + "\"");
return;
}
// The current state of the page is the same as what the editor was trying to do
if (le.details.new_wikitext === cur_wikitext) {
mw.notify("Edit already made. Nothing to do here.");
return;
}
// The current state of the page is different from what it was when the editor made the attempt
if (le.details.old_wikitext !== cur_wikitext) {
var i, rv = api_response.query.pages[page_id].revisions;
var only_me = true;
if (le_page_id === '0') {
mw.notify("Page already created and has different content. Not done");
return;
}
// Find the newest revision made before the attempt
for(i = 0; i < rv.length; i++) {
if (rv[i].timestamp < le.timestamp)
break;
if (rv[i].user != mw.config.get('wgUserName'))
only_me = false;
}
if (i == rv.length) {
// We could fetch more revisions, but the chance of not getting an edit conflict is slim at this point
mw.notify("Page has changed, and at least " + i + " edits have been made since the attempt. Not done.");
return;
}
if (!only_me)
mw.notify("Page has changed, and " + i + " edit(s) have made been since the attempt. Merge will be attempted on save.",
{ autoHide : false });
else
mw.notify("You have made " + i + " edit(s) to this page since the attempt. Your changes may be overwritten.",
{ autoHide : false });
// Apparently MW uses inconsistent date formats...
var starttime = le.timestamp.replace(/[^0-9]/g, '');
var edittime = rv[i].timestamp.replace(/[^0-9]/g, '');
// Now it should appear to the server that we clicked "edit" whenever the abuse log entry was made
$('input[name=wpStarttime]').val(starttime);
$('input[name=wpEdittime]').val(edittime);
$('input[name=editRevId]').val(rv[i].revid);
}
var sum_begin = "Edit made on behalf of [[Special:Contributions/" + le.user + "|" +
le.user + "]] ([[User talk:" + le.user + "|talk]]) because it was [[Special:AbuseLog/" + le.id +
"|disallowed]] by an edit filter";
var sum_end = " ([[User:Suffusion of Yellow/effp-helper|effp-helper]])";
if (le.details.summary.length) {
sum_begin += ". Original summary was \"";
sum_end = "\"" + sum_end;
var remaining = 500 - sum_begin.length - sum_end.length;
if (le.details.summary.length > remaining)
sum_begin += le.details.summary.substring(0, remaining - 3) + "...";
else
sum_begin += le.details.summary;
}
var text = le.details.new_wikitext;
// Sign with user's name, not our own!
if (text.indexOf("~~~") !== -1 && confirm("Substitue signature(s)?")) {
var user_prefix =
(mw.util.isIPv4Address(le.user) ||
mw.util.isIPv6Address(le.user)) ?
"Special:Contributions/" : "User:";
var sig = "[[" + user_prefix + le.user + "|" + le.user +
"]] ([[User talk:" + le.user + "|talk]])";
var ts = new Date(le.timestamp);
var ts_str = ("0" + ts.getUTCHours()).slice(-2)
+ ":" + ("0" + ts.getUTCMinutes()).slice(-2)
+ ", " + ts.getUTCDate()
+ " " + mw.config.get('wgMonthNames')[ts.getUTCMonth() + 1]
+ " " + ts.getUTCFullYear() + " (UTC)";
text = text.replace("~~~~~", ts_str);
text = text.replace("~~~~", sig + " " + ts_str);
text = text.replace("~~~", sig);
}
$('#wpTextbox1').val(text);
$('#wpSummary').val(sum_begin + sum_end);
mw.notify("Edit copied from filter log. Please verify before saving.");
}
});
// </nowiki>