MediaWiki:Gadget-GASTERBLASTER.js
Note : après avoir publié vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
- Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
- Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
- Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
/* TODO: MediaWiki 1.45 allows loading .vue files in Gadgets (T340460) */
const {computed, createMwApp, ref} = mw.loader.require('vue');
const {CdxCheckbox, CdxDialog, CdxField, CdxMessage, CdxTextInput} = mw.loader.require('@wikimedia/codex');
const api = new mw.Api();
function getUserContributions(ucuser, contribs, uccontinue) {
if (!contribs) {
contribs = [];
}
return api.get({
action: 'query',
list: 'usercontribs',
ucuser,
uclimit: 'max',
uccontinue,
ucprop: ['ids', 'flags'],
formatversion: 2
}).then(data => {
contribs.push(...data.query.usercontribs);
if (data.continue) {
return getUserContributions(ucuser, contribs, data.continue.uccontinue);
}
return contribs;
});
}
function executeActionQueue(actions) {
const action = actions.shift();
if (!action) {
return;
}
const tokenType = action.action === 'rollback' ? 'rollback' : 'csrf';
return api.postWithToken(tokenType, action)
.always(() => executeActionQueue(actions));
}
function blastUser(user, reason, expiry, allowusertalk, doBlock, doDelete, doRollback) {
const tags = ['gasterblaster'];
return getUserContributions(user).then(contribs => executeActionQueue([
doBlock && {
action: 'block',
user,
expiry,
reason,
nocreate: true,
autoblock: true,
allowusertalk,
tags
},
...contribs.filter(c => c.new).map(({pageid}) => doDelete && {
action: 'delete',
pageid,
reason,
tags
}),
...contribs.filter(c => c.top && !c.new).map(({pageid}) => doRollback && {
action: 'rollback',
pageid,
summary: reason,
tags,
user,
markbot: true
})
].filter(Boolean)));
}
// <nowiki>
const dialog = createMwApp({
components: {CdxCheckbox, CdxDialog, CdxField, CdxMessage, CdxTextInput},
template: `
<a href="#" @click="onOpen">GASTERBLASTER</a>
<cdx-dialog
v-model:open="dialogOpen"
:title="'Blasting ' + user"
:primary-action="primaryAction"
:default-action="defaultAction"
@primary="onSubmit"
@default="dialogOpen = false"
:use-close-button="true"
>
<cdx-field>
<cdx-text-input v-model="reason" />
<template #label>Reason</template>
<template #description>For blocking, deletion and rollbacking of edits.</template>
</cdx-field>
<cdx-field>
<cdx-text-input v-model="expiry" />
<template #label>Block duration</template>
</cdx-field>
<cdx-field>
<cdx-checkbox v-model="doBlock">Block the user</cdx-checkbox>
<cdx-checkbox v-model="doDelete">Delete pages that the user created</cdx-checkbox>
<cdx-checkbox v-model="doRollback">Roll back user's edits</cdx-checkbox>
<cdx-checkbox v-model="allowUserTalk">Allow talk page editing</cdx-checkbox>
<template #label>Details</template>
</cdx-field>
<cdx-message
v-if="actionMessage"
type="success"
:fade-in="true"
:auto-dismiss="true"
:display-time="5000"
@auto-dismissed="dialogOpen = false"
>{{ actionMessage }}</cdx-message>
</cdx-dialog>
`,
setup() {
const user = mw.config.get('wgRelevantUserName');
const dialogOpen = ref(false);
const reason = ref('Vandalism');
const expiry = ref('2 weeks');
const allowUserTalk = ref(true);
const doBlock = ref(true);
const doDelete = ref(true);
const doRollback = ref(true);
const actionMessage = ref('');
return {
dialogOpen,
reason,
expiry,
allowUserTalk,
doBlock,
doDelete,
doRollback,
user,
actionMessage,
primaryAction: {
label: 'Blast',
actionType: 'primary'
},
defaultAction: {
label: 'Cancel'
},
onOpen: event => {
event.preventDefault();
dialogOpen.value = true;
setTimeout(() => document.querySelector('.cdx-dialog .cdx-dialog__footer__primary-action').focus(), 0);
},
onSubmit: () => {
blastUser(
user,
reason.value,
expiry.value,
allowUserTalk.value,
doBlock.value,
doDelete.value,
doRollback.value
).always(() => actionMessage.value = 'IT WAS AS IF IT WAS NEVER THERE AT ALL.');
}
};
}
});
// </nowiki>
if (mw.config.get('wgCanonicalSpecialPageName') === 'Contributions') {
const root = document.createElement('span');
document.querySelector('.mw-changeslist-links').append(root);
dialog.mount(root);
}