मीडियाविकि:Gadget-twinklearv.js: रिवीजन सभ के बीचा में अंतर

Content deleted Content added
Update to commit 5370fe
Update to commit 051eb9
लाइन 15:
 
Twinkle.arv = function twinklearv() {
 
var username = Morebits.getPageAssociatedUser();
if ( username === false ) {
Line 68 ⟶ 67:
} );
categories.append( {
type: 'option',
label: 'Edit warring (WP:AN3)',
value: 'an3'
} );
form.append( {
type: 'field',
label: 'Work area',
name: 'work_area'
} );
form.append( { type: 'submit' } );
form.append( {
type: 'hidden',
Line 104 ⟶ 103:
/* falls through */
default:
work_area = new Morebits.quickForm.element( {
type: 'field',
label: 'Report user for vandalism',
Line 151 ⟶ 150:
name: 'arvtype',
list: [
{
label: 'Vandalism after final (level 4 or 4im) warning given',
value: 'final'
},
{
label: 'Vandalism after recent (within 1 day) release of block',
value: 'postblock'
},
{
label: 'Evidently a vandalism-only account',
value: 'vandalonly',
disabled: Morebits.isIPAddress( root.uid.value )
},
{
label: 'Account is evidently a spambot or a compromised account',
value: 'spambot'
},
{
label: 'Account is a promotion-only account',
value: 'promoonly'
Line 183 ⟶ 182:
break;
case 'username':
work_area = new Morebits.quickForm.element( {
type: 'field',
label: 'Report username violation',
name: 'work_area'
} );
work_area.append ( {
type: 'header',
label: 'Type(s) of inappropriate username',
tooltip: 'Wikipedia does not allow usernames that are misleading, promotional, offensive or disruptive. Domain names and email addresses are likewise prohibited. These criteria apply to both usernames and signatures. Usernames that are inappropriate in another language, or that represent an inappropriate name with misspellings and substitutions, or do so indirectly or by implication, are still considered inappropriate.'
} );
Line 202 ⟶ 201:
tooltip: 'Misleading usernames imply relevant, misleading things about the contributor. For example, misleading points of fact, an impression of undue authority, or the suggestion that the account is operated by a group, project or collective rather than one individual.'
},
{
label: 'Promotional username',
value: 'promotional',
tooltip: 'Promotional usernames are advertisements for a company, website or group. Please do not report these names to UAA unless the user has also made promotional edits related to the name.'
},
{
label: 'Offensive username',
value: 'offensive',
tooltip: 'Offensive usernames make harmonious editing difficult or impossible.'
},
{
label: 'Disruptive username',
value: 'disruptive',
Line 229 ⟶ 228:
 
case 'puppet':
work_area = new Morebits.quickForm.element( {
type: 'field',
label: 'Report suspected sockpuppet',
Line 267 ⟶ 266:
break;
case 'sock':
work_area = new Morebits.quickForm.element( {
type: 'field',
label: 'Report suspected sockpuppeteer',
Line 280 ⟶ 279:
tooltip: 'The username of the sockpuppet without the User:-prefix',
min: 2
} );
);
work_area.append( {
type: 'textarea',
Line 303 ⟶ 301:
old_area.parentNode.replaceChild( work_area, old_area );
break;
case 'an3':
work_area = new Morebits.quickForm.element( {
type: 'field',
label: 'Report edit warring',
name: 'work_area'
} );
 
work_area.append( {
{
type: 'input',
name: 'page',
label: 'Page',
tooltip: 'The page being reported'
} );
 
work_area.append( {
});
type: 'button',
work_area.append(
name: 'load',
{
typelabel: 'buttonLoad',
event: function(e) {
name: 'load',
label: 'Load',
event: function(e) {
var root = e.target.form;
var value = root.page.value;
Line 335 ⟶ 330:
var api = new mw.Api();
api.get({
action: 'query',
prop: 'revisions',
format: 'json',
rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
rvlimit: 500,
rvend: date.toISOString(),
rvuser: uid,
indexpageids: true,
redirects: true,
titles: value
}).done(function(data){
var pageid = data.query.pageids[0];
var page = data.query.pages[pageid];
if(!page.revisions) {
return;
}
for(var i = 0; i < page.revisions.length; ++i) {
var rev = page.revisions[i];
var $entry = $('<div/>', {
'class': 'entry'
});
var $input = $('<input/>', {
'type': 'checkbox',
'name': 's_diffs',
'value': rev.revid
});
$input.data('revinfo',rev);
$input.appendTo($entry);
$entry.append('<span>"'+rev.parsedcomment+'" at <a href="'+mw.config.get('wgScript')+'?diff='+rev.revid+'">'+moment(rev.timestamp).calendar()+'</a></span>').appendTo($diffs);
}
 
 
}
 
}).fail(function(data){
console.log( 'API failed :(', error );
});
var $warnings = $(root).find('[name=warnings]');
Line 375 ⟶ 367:
 
api.get({
action: 'query',
prop: 'revisions',
format: 'json',
rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
rvlimit: 500,
rvend: date.toISOString(),
rvuser: mw.config.get('wgUserName'),
indexpageids: true,
redirects: true,
titles: 'User talk:' + uid
}).done(function(data){
var pageid = data.query.pageids[0];
var page = data.query.pages[pageid];
if(!page.revisions) {
return;
}
for(var i = 0; i < page.revisions.length; ++i) {
var rev = page.revisions[i];
var $entry = $('<div/>', {
'class': 'entry'
});
var $input = $('<input/>', {
'type': 'checkbox',
'name': 's_warnings',
'value': rev.revid
});
$input.data('revinfo',rev);
$input.appendTo($entry);
$entry.append('<span>"'+rev.parsedcomment+'" at <a href="'+mw.config.get('wgScript')+'?diff='+rev.revid+'">'+moment(rev.timestamp).calendar()+'</a></span>').appendTo($warnings);
}
 
 
}
 
}).fail(function(data){
console.log( 'API failed :(', error );
});
 
 
var $resolves = $(root).find('[name=resolves]');
Line 421 ⟶ 409:
 
api.get({
action: 'query',
prop: 'revisions',
format: 'json',
rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
rvlimit: 500,
rvend: date.toISOString(),
rvuser: mw.config.get('wgUserName'),
indexpageids: true,
redirects: true,
titles: talk_page
}).done(function(data){
var pageid = data.query.pageids[0];
var page = data.query.pages[pageid];
if(!page.revisions) {
return;
}
for(var i = 0; i < page.revisions.length; ++i) {
var rev = page.revisions[i];
var $entry = $('<div/>', {
'class': 'entry'
});
var $input = $('<input/>', {
'type': 'checkbox',
'name': 's_resolves',
'value': rev.revid
});
$input.data('revinfo',rev);
$input.appendTo($entry);
$entry.append('<span>"'+rev.parsedcomment+'" at <a href="'+mw.config.get('wgScript')+'?diff='+rev.revid+'">'+moment(rev.timestamp).calendar()+'</a></span>').appendTo($resolves);
}
 
// add free form input
var $free_entry = $('<div/>', {
'class': 'entry'
});
var $inputfree_input = $('<input/>', {
'type': 'checkboxtext',
'name': 's_resolvess_resolves_free',
'value': rev.revid
});
$input.data('revinfo',rev);
$input.appendTo($entry);
$entry.append('<span>"'+rev.parsedcomment+'" at <a href="'+mw.config.get('wgScript')+'?diff='+rev.revid+'">'+moment(rev.timestamp).calendar()+'</a></span>').appendTo($resolves);
 
var $free_label = $('<label/>', {
 
'for': 's_resolves_free',
}
'html': 'Diff to additional discussions: '
 
});
// add free form input
var $free_entry = .append($free_label).append('<div/>', {$free_input).appendTo($resolves);
'class': 'entry'
});
var $free_input = $('<input/>', {
'type': 'text',
'name': 's_resolves_free'
});
 
var $free_label = $('<label/>', {
'for': 's_resolves_free',
'html': 'Diff to additional discussions: '
});
$free_entry.append($free_label).append($free_input).appendTo($resolves);
 
}).fail(function(data){
console.log( 'API failed :(', error );
});
}
} );
work_area.append( {
type: 'field',
name: 'diffs',
label: 'User\'s reverts',
tooltip: 'Select the edits you believe are reverts'
} );
work_area.append( {
type: 'field',
name: 'warnings',
label: 'Warnings given to subject',
tooltip: 'You must have warned the subject before reporting'
} );
work_area.append( {
type: 'field',
name: 'resolves',
label: 'Resolution initiatives',
tooltip: 'You should have tried to resolve the issue on the talk page first'
} );
 
work_area.append( {
});
type: 'textarea',
work_area.append(
label: 'Comment:',
{
typename: 'fieldcomment',
} );
name: 'diffs',
label: 'User\'s reverts',
tooltip: 'Select the edits you believe are reverts'
}
);
work_area.append(
{
type: 'field',
name: 'warnings',
label: 'Warnings given to subject',
tooltip: 'You must have warned the subject before reporting'
}
);
work_area.append(
{
type: 'field',
name: 'resolves',
label: 'Resolution initiatives',
tooltip: 'You should have tried to resolve the issue on the talk page first'
}
);
 
work_area.append( {
type: 'textarea',
label: 'Comment:',
name: 'comment'
} );
work_area = work_area.render();
old_area.parentNode.replaceChild( work_area, old_area );
break;
 
work_area = work_area.render();
old_area.parentNode.replaceChild( work_area, old_area );
break;
}
};
 
Twinkle.arv.callback.evaluate = function(e) {
 
var form = e.target;
var reason = "";
Line 657 ⟶ 635:
case "puppet":
var sockParameters = {
evidence: form.evidence.value.trimRight(),
checkuser: form.checkuser.checked,
notify: form.notify.checked
};
Line 678 ⟶ 656:
break;
 
case 'an3':
 
var diffs = $.map( $('input:checkbox[name=s_diffs]:checked',form), function(o){ return $(o).data('revinfo'); });
 
if(diffs.length < 3) {
alert("You must select at least three offending edits.");
return;
}
 
Line 690 ⟶ 667:
 
if(!warnings.length && !confirm("You have not selected any edits where you warn the offender; You wish to make the report anyway?")) {
return;
}
 
Line 697 ⟶ 674:
 
var an3_next = function(free_resolves) {
if(!resolves.length && !free_resolves && !confirm("You have not selected any edits where you tries to resolve the issue; You wish to make the report anyway?")) {
return;
}
 
var an3Parameters = {
'uid': uid,
'page': form.page.value.trim(),
'comment': form.comment.value.trim(),
'diffs': diffs,
'warnings': warnings,
'resolves': resolves,
'free_resolves': free_resolves
};
 
Morebits.simpleWindow.setButtonsEnabled( false );
Morebits.status.init( form );
Twinkle.arv.processAN3( an3Parameters );
};
 
if(free_resolves) {
var oldid=mw.util.getParamValue('oldid',free_resolves);
var api = new mw.Api();
api.get({
action: 'query',
prop: 'revisions',
format: 'json',
rvprop: 'ids|timestamp|comment',
indexpageids: true,
revids: oldid
}).done(function(data){
var pageid = data.query.pageids[0];
var page = data.query.pages[pageid];
an3_next(page);
}).fail(function(data){
console.log( 'API failed :(', error );
});
} else {
an3_next();
}
break;
Line 784 ⟶ 761:
// prepare the SPI report
var text = "\n\n{{subst:SPI report|socksraw=" +
params.sockpuppets.map( function(v) {
return "* {{" + ( Morebits.isIPAddress( v ) ? "checkip" : "checkuser" ) + "|1=" + v + "}}";
} ).join( "\n" ) + "\n|evidence=" + params.evidence + " \n";
Line 808 ⟶ 785:
 
Twinkle.arv.processAN3 = function( params ) {
// prepare the AN3 report
var sha1, minid;
for(var i = 0; i < params.diffs.length; ++i) {
if( params.diffs[i].parentid && (!minid || params.diffs[i].parentid < minid)) {
minid = params.diffs[i].parentid;
}
}
 
var api = new mw.Api();
api.get({
action: 'query',
prop: 'revisions',
format: 'json',
rvprop: 'sha1|ids|timestamp|comment',
rvlimit: 100,
rvstartid: minid,
rvexcludeuser: params.uid,
indexpageids: true,
redirects: true,
titles: params.page
}).done(function(data){
Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "action completed"
var orig;
if(data.length) {
var sha1 = data[0].sha1;
for(var i = 1; i < data.length; ++i) {
if(data[i].sha1 == sha1) {
orig = data[i];
break;
}
}
 
if(!orig) {
orig = data[0];
}
}
 
var api = new mw.Api();
origtext = "";
api.get({
if(orig) {
action: 'query',
origtext = '{{diff2|' + orig.revid + '|' + orig.timestamp + '}} "' + orig.comment + '"';
prop: 'revisions',
}
format: 'json',
rvprop: 'sha1|ids|timestamp|comment',
rvlimit: 100,
rvstartid: minid,
rvexcludeuser: params.uid,
indexpageids: true,
redirects: true,
titles: params.page
}).done(function(data){
Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "action completed"
var orig;
if(data.length) {
var sha1 = data[0].sha1;
for(var i = 1; i < data.length; ++i) {
if(data[i].sha1 == sha1) {
orig = data[i];
break;
}
}
 
if(!orig) {
var grouped_diffs = {};
orig = data[0];
}
}
 
origtext = "";
var revid, parentid, lastid;
if(orig) {
for(var j = 0; j < params.diffs.length; ++j) {
origtext = '{{diff2|' + orig.revid + '|' + orig.timestamp + '}} "' + orig.comment + '"';
var cur = params.diffs[j];
}
if( cur.revid && cur.revid != parentid || lastid === null ) {
lastid = cur.revid;
grouped_diffs[lastid] = [];
}
parentid = cur.parentid;
grouped_diffs[lastid].push(cur);
}
 
var grouped_diffs = {};
var difftext = $.map(grouped_diffs, function(sub, index){
var ret = "";
if(sub.length >= 2) {
var last = sub[0];
var first = sub.slice(-1)[0];
var label = "Consecutive edits made from " + moment(first.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + " to " + moment(last.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]');
ret = "# {{diff|oldid="+first.parentid+"|diff="+last.revid+"|label="+label+"}}\n";
}
ret += sub.reverse().map(function(v){
return (sub.length >= 2 ? '#' : '') + '# {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
}).join("\n");
return ret;
}).reverse().join("\n");
var warningtext = params.warnings.reverse().map(function(v){
return '# ' + ' {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
}).join("\n");
var resolvetext = params.resolves.reverse().map(function(v){
return '# ' + ' {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
}).join("\n");
 
var revid, parentid, lastid;
if(params.free_resolves) {
for(var pagej = 0; j < params.free_resolvesdiffs.length; ++j) {
var revcur = pageparams.revisionsdiffs[0j];
if( cur.revid && cur.revid != parentid || lastid === null ) {
resolvetext += "\n# " + ' {{diff2|' + rev.revid + '|' + moment(rev.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + ' on ' + page.title + '}} "' + rev.comment + '"';
lastid = cur.revid;
}
grouped_diffs[lastid] = [];
}
parentid = cur.parentid;
grouped_diffs[lastid].push(cur);
}
 
var difftext = $.map(grouped_diffs, function(sub, index){
var comment = params.comment.replace(/~*$/g, '').trim();
var ret = "";
if(sub.length >= 2) {
var last = sub[0];
var first = sub.slice(-1)[0];
var label = "Consecutive edits made from " + moment(first.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + " to " + moment(last.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]');
ret = "# {{diff|oldid="+first.parentid+"|diff="+last.revid+"|label="+label+"}}\n";
}
ret += sub.reverse().map(function(v){
return (sub.length >= 2 ? '#' : '') + '# {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
}).join("\n");
return ret;
}).reverse().join("\n");
var warningtext = params.warnings.reverse().map(function(v){
return '# ' + ' {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
}).join("\n");
var resolvetext = params.resolves.reverse().map(function(v){
return '# ' + ' {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
}).join("\n");
 
if(commentparams.free_resolves) {
var page = params.free_resolves;
comment += " ~~~~";
var rev = page.revisions[0];
}
resolvetext += "\n# " + ' {{diff2|' + rev.revid + '|' + moment(rev.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + ' on ' + page.title + '}} "' + rev.comment + '"';
}
 
var comment = params.comment.replace(/~*$/g, '').trim();
var text = "\n\n"+'{{subst:AN3 report|diffs='+difftext+'|warnings='+warningtext+'|resolves='+resolvetext+'|pagename='+params.page+'|orig='+origtext+'|comment='+comment+'|uid='+params.uid+'}}';
 
if(comment) {
var reportpage = 'Wikipedia:Administrators\' noticeboard/Edit warring';
comment += " ~~~~";
}
 
var text = "\n\n"+'{{subst:AN3 report|diffs='+difftext+'|warnings='+warningtext+'|resolves='+resolvetext+'|pagename='+params.page+'|orig='+origtext+'|comment='+comment+'|uid='+params.uid+'}}';
Morebits.wiki.actionCompleted.redirect = reportpage;
Morebits.wiki.actionCompleted.notice = "Reporting complete";
 
var reportpage = 'Wikipedia:Administrators\' noticeboard/Edit warring';
var an3Page = new Morebits.wiki.page( reportpage, 'Retrieving discussion page' );
an3Page.setFollowRedirect( true );
an3Page.setEditSummary( 'Adding new report for [[Special:Contributions/' + params.uid + '|' + params.uid + ']].'+ Twinkle.getPref('summaryAd') );
an3Page.setAppendText( text );
an3Page.append();
 
Morebits.wiki.actionCompleted.redirect = reportpage;
// notify user
Morebits.wiki.actionCompleted.notice = "Reporting complete";
 
var an3Page = new Morebits.wiki.page( reportpage, 'Retrieving discussion page' );
var notifyEditSummary = "Notifying about edit warring noticeboard discussion." + Twinkle.getPref('summaryAd');
an3Page.setFollowRedirect( true );
var notifyText = "\n\n{{subst:an3-notice|1=" + mw.util.wikiUrlencode(params.uid) + "|auto=1}} ~~~~";
an3Page.setEditSummary( 'Adding new report for [[Special:Contributions/' + params.uid + '|' + params.uid + ']].'+ Twinkle.getPref('summaryAd') );
an3Page.setAppendText( text );
an3Page.append();
 
// notify user
var talkPage = new Morebits.wiki.page( 'User talk:' + params.uid, 'Notifying edit warrior' );
 
talkPage.setFollowRedirect( true );
var notifyEditSummary = "Notifying about edit warring noticeboard discussion." + Twinkle.getPref('summaryAd');
talkPage.setEditSummary( notifyEditSummary );
var notifyText = "\n\n{{subst:an3-notice|1=" + mw.util.wikiUrlencode(params.uid) + "|auto=1}} ~~~~";
talkPage.setAppendText( notifyText );
talkPage.append();
Morebits.wiki.removeCheckpoint(); // all page updates have been started
}).fail(function(data){
console.log( 'API failed :(', error );
});
 
var talkPage = new Morebits.wiki.page( 'User talk:' + params.uid, 'Notifying edit warrior' );
talkPage.setFollowRedirect( true );
talkPage.setEditSummary( notifyEditSummary );
talkPage.setAppendText( notifyText );
talkPage.append();
Morebits.wiki.removeCheckpoint(); // all page updates have been started
}).fail(function(data){
console.log( 'API failed :(', error );
});
};
})(jQuery);