User:NguoiDungKhongDinhDanh/Angrenamer.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:NguoiDungKhongDinhDanh/Angrenamer. |
// For attribution: [[MediaWiki:Gadget-twinkleblock.js]]
// Block summaries and settings copied from Twinkle's block module.
// Only works for sysop and at [[CAT:UAA]].
$(document).ready(function() {
'use strict';
if (mw.config.get('wgPageName').replace(/_/g, ' ') !== 'Category:Wikipedia usernames with possible policy issues' ||
!mw.config.get('wgUserGroups').includes('sysop')) return; // Non-sysop should not use this.
var AR = {};
window.AR = AR;
AR.f = function(un) {
(new mw.Api()).postWithToken('csrf', {
action: 'block',
user: un,
expiry: 'indefinite',
reason: AR.r,
autoblock: $('#AR-autoblock').prop('checked'),
noemail: $('#AR-noemail').prop('checked'),
allowusertalk: $('#AR-allowusertalk').prop('checked')
}, {
async: false
}).done(function(response) {
if ($('#AR-blocknotice').prop('checked')) {
var s = AR.r
.replace(/\{\{/g, '\{\{subst:')
.replace(
/\}\}/g,
(AR.autoblock ? '|anon=yes' : '') +
'|time=indefinite' +
(!AR.allowusertalk ? '|notalk=yes' : '') +
'sig=yes' +
'}}');
console.log(s);
(new mw.Api()).postWithToken('csrf', {
action: 'edit',
title: 'User talk:' + un,
appendtext: '\n\n' + s,
summary: AR.es,
nocreate: AR.nocreate,
format: 'json'
}).done(function(r) {
console.log(r);
AR.cb();
}).fail(function(r) {
console.error(r);
AR.cb();
});
} else {
AR.cb();
}
}).fail(function(f) {
console.warn(f);
});
};
AR.cb = function() {
$('#AR-counter').text($('#AR-counter').text() - 0 + 1);
};
AR.p = mw.util.addPortletLink('p-cactions', '', 'MassBlock', 'pt-angrenamer', 'Initialize');
$(AR.p).click(function(e) {
e.preventDefault();
(new mw.Api()).get({
action: 'query',
list: 'categorymembers',
cmtitle: mw.config.get('wgPageName'),
cmprop: 'title',
cmnamespace: [3],
cmtype: 'page',
cmlimit: 500,
format: 'json'
}).done(function(response) {
AR.list = response.query.categorymembers;
AR.usernames = [];
var j;
for (let i of AR.list) {
j = i.title.slice(10);
AR.usernames.push(
'<label for="AR-usernames-' + j + '" style="display: inline-flex; word-break: break-all;">' +
'<input type="checkbox" name="AR-usernames" value="' + j + '" class="AR-usernames" \
id="AR-usernames-' + j + '" style="align-self: center;">' +
'<span style="padding-left: 0.2em; align-self: center;"> ' + j + '</span>' +
'</label>'
);
}
AR.block = '<button id="AR-block">Block</button>';
AR.summary = '<input type="text" placeholder="Reason for blocks" id="AR-summary" style="flex-grow: 5;">';
AR.settings = {};
AR.settings.arr = [
{
i: 'autoblock',
f: 'Autoblock'
},
{
i: 'noemail',
f: 'Block email'
},
{
i: 'allowusertalk',
f: 'Allow editing own talk page'
},
{
i: 'blocknotice',
f: 'Send block notice'
}
];
AR.settings.select = [
{
t: 'uw-botublock',
c: 'Username implies a bot, soft block',
s: 'You have been indefinitely blocked from editing because your [[WP:U|username]] '+
'indicates this is a [[WP:BOT|bot]] account, which is currently not approved'
},
{
t: 'uw-botuhblock',
c: 'Username implies a bot, hard block',
s: 'You have been indefinitely blocked from editing because your username is a ' +
'blatant violation of the [[WP:U|username policy]].',
p: {
autoblock: true
}
},
{
t: 'uw-ublock',
c: 'Username violation, soft block',
s: 'You have been indefinitely blocked from editing because your username is a ' +
'violation of the [[WP:U|username policy]]'
},
{
t: 'uw-uhblock',
c: 'Username violation, hard block',
s: 'You have been indefinitely blocked from editing because your username is a ' +
'blatant violation of the [[WP:U|username policy]]',
p: {
autoblock: true,
nocreate: true
}
},
{
t: 'uw-causeblock',
c: 'Username represents a non-profit, soft block',
s: 'You have been indefinitely blocked from editing because your [[WP:U|username]] ' +
'gives the impression that the account represents a group, organization or website'
},
{
t: 'uw-ublock-wellknown',
c: 'Username represents a well-known person, soft block',
s: 'You have been indefinitely blocked from editing because your [[WP:U|username]] ' +
'matches the name of a well-known living individual'
},
{
t: 'uw-ublock-double',
c: 'Username closely resembles another user, soft block',
s: 'You have been indefinitely blocked from editing because your [[WP:U|username]] ' +
'is too similar to the username of another Wikipedia user'
},
{
t: 'uw-uhblock-double',
c: 'Attempted impersonation of another user, hard block',
s: 'You have been indefinitely blocked from editing because your [[WP:U|username]] ' +
'appears to impersonate another established Wikipedia user',
p: {
autoblock: true,
nocreate: true
}
},
{
t: 'uw-softerblock',
c: 'Promotional username, soft block',
s: 'You have been indefinitely blocked from editing because your [[WP:U|username]] ' +
'gives the impression that the account represents a group, organization or website'
},
{
t: 'uw-spamublock',
c: 'Promotional username, promotional edits',
s: 'You have been indefinitely blocked from editing because your account is being used ' +
'only for [[WP:SPAM|spam or advertising]] and your username is a violation of the [[WP:U|username policy]]',
p: {
autoblock: true,
nocreate: true
}
},
{
t: 'uw-spamblacklistblock',
c: 'editor only attempts to add blacklisted links, see [[Special:Log/spamblacklist]]',
// s: '',
},
{
t: 'uw-vaublock',
c: 'Username violation, vandalism-only account',
s: 'You have been indefinitely blocked from editing because your account is being ' +
'[[WP:VOA|used only for vandalism]] and your username is a blatant violation of the [[WP:U|username policy]]',
p: {
autoblock: true,
nocreate: true
}
}
];
AR.settings.f = function(i) {
return '<label for="AR-' + i.i + '" class="AR-labels" style="display: inline-flex; word-break: break-all;">' +
'<input type="checkbox" id="AR-' + i.i + '" style="align-self: center;"' +
(['allowusertalk', 'blocknotice'].includes(i.i) ? ' checked' : '') + '>' +
'<span style="align-self: center; padding-left: 0.2em; font-size: 0.75em;">' + i.f + '</span>' +
'</label>';
};
AR.settings.list = function() {
var list = '';
AR.settings.arr.forEach(function(e) {
list += AR.settings.f(e);
});
return list;
};
AR.settings.options = function() {
var options = [];
for (let i in AR.settings.select) {
options.push(
'<option class="AR-options" value="' + i +'">' +
AR.settings.select[i].t +
'</option>'
);
}
return options.join('');
};
AR.nocreate = false;
$('#bodyContent').remove();
$('#firstHeading').after(
'<div id="AR-wrapper" style="border: 1px solid black; padding: 5px; font-size: 0.75em; font-family: sans-serif;">' +
'<div id="AR-usernames" style="display: grid; grid-template-columns: auto auto auto auto; padding: 10px;">' +
AR.usernames.join('') +
'</div>' +
'</div>' +
'<div style="display: flex; flex-wrap: nowrap;">' +
'<select id="AR-select" style="flex-grow: 1;">' +
'<option class="AR-options" value="other">' +
'Other' +
'</option>' +
AR.settings.options() +
'</select>' +
AR.summary +
'</div>' +
'<div style="display: flex; justify-content: space-between;">' +
AR.block +
AR.settings.list() +
'</div>'
);
// For attribution: https://stackoverflow.com/questions/659508
$(function() {
var cbx = $('.AR-usernames');
var lastChecked = null;
cbx.click(function(e) {
if (!lastChecked) {
lastChecked = this;
return;
}
if (e.shiftKey) {
var start = cbx.index(this);
var end = cbx.index(lastChecked);
cbx.slice(Math.min(start, end), Math.max(start, end) + 1).prop('checked', lastChecked.checked);
}
lastChecked = this;
});
});
$('#AR-select').change(function() {
if ($(this).val() !== 'other') {
$('#AR-summary').val(
'{{' +
AR.settings.select[$(this).val()].t +
'}}' +
' <!-- ' +
AR.settings.select[$(this).val()].c +
' -->'
);
if (AR.settings.select[$(this).val()].hasOwnProperty('p')) {
if (AR.settings.select[$(this).val()].p.autoblock) $('#AR-autoblock').prop('checked', true);
if (AR.settings.select[$(this).val()].p.nocreate) AR.nocreate = true;
}
} else {
$('#AR-summary').val('');
}
});
$('#AR-block').click(function(e) {
e.preventDefault();
$(this).after(
'<span>Blocked: <span id="AR-counter">' + 0 + '</span> / <span id="AR-selected">' + 0 + '</span></span>'
);
$('#AR-selected').text($('input.AR-usernames[type="checkbox"]:checked').length);
$('[id^=AR-]:not(#AR-counter, #AR-selected), label > ').hide();
AR.r = $('#AR-summary').val();
AR.es = ($('#AR-select').val() === 'other' ? AR.r : AR.settings.select[$('#AR-select').val()].s);
AR.checked = [];
$('input.AR-usernames[type="checkbox"]:checked').each(function() {
AR.checked.push($(this).val());
});
AR.checked.forEach(function(n) {
AR.f(n, AR.cb);
});
});
});
});
});