Aller au contenu

MediaWiki:Gadget-GASTERBLASTER.js

De Wiki Undertale FR

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);
}