Jump to content

User:Eejit43/scripts/rmtr-helper.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Eejit43 (talk | contribs) at 01:00, 11 February 2023 (create basic script, no functionality aside from parsing requests). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
/* global mw */

mw.loader.using(['mediawiki.util', 'mediawiki.notification'], () => {
    if (mw.config.get('wgPageName') !== 'Wikipedia:Requested_moves/Technical_requests') return;

    mw.util.addCSS(`
#rmtr-review-result {
    margin: 1em;
    padding: 2.5%;
    border: solid 1px #ddd;
    background-color: #b4d3ff;
    font-size: 0.8em;
}

#rmtr-review-header {
    font-size: 1.5em;
    font-weight: bold;
    margin-bottom: 0.5em;
}

.rmtr-review-header {
    font-size: 1em;
    font-weight: bold;
    margin: 0.5em 0;
}

.rmtr-review-section-content {
    margin-left: 1em;
}

#rmtr-review-submit {
    margin-top: 0.2em;
}
`);

    mw.util.addPortletLink('p-cactions', '#', 'Review move requests', 'review-rmtr-requests');

    document.getElementById('review-rmtr-requests').addEventListener('click', async (event) => {
        event.preventDefault();

        mw.util.hidePortlet('review-rmtr-requests');

        const pageContent = (await new mw.Api().get({ action: 'query', format: 'json', prop: 'revisions', formatversion: 2, titles: mw.config.get('wgPageName'), rvprop: 'content', rvslots: '*' })).query.pages[0].revisions[0].slots.main.content;

        const result = {};

        ['Uncontroversial technical requests', 'Requests to revert undiscussed moves', 'Contested technical requests', 'Administrator needed'].forEach((section) => {
            const sectionContent = pageContent
                .split(new RegExp(`={3,} ?${section} ?={3,}`))[1]
                .split(/={3,}/m)[0]
                .trim();

            const requests = sectionContent.match(/(?:\* ?\n)?\* {{RMassist\/core.+?(?=\* {{RMassist\/core|$)/gis);

            if (!requests) return (result[section] = []);
            else
                result[section] = requests.map((request) => {
                    request = request.trim();
                    const full = request;
                    request = request.replace(/(?:\* ?\n)?\* {{RMassist\/core \||}}.*?/gi, '');
                    const params = request.split(' | ').map((param) => param.trim());

                    const finalParams = Object.fromEntries(params.map((param) => param.split(' = ').map((value) => value.trim())));

                    finalParams.full = full;

                    finalParams.original = finalParams[1];
                    finalParams.destination = finalParams[2];

                    delete finalParams[1];
                    delete finalParams[2];

                    return finalParams;
                });
        });

        const resultElement = document.createElement('div');
        resultElement.id = 'rmtr-review-result';

        const header = document.createElement('div');
        header.id = 'rmtr-review-header';
        header.textContent = 'Technical move requests review';

        resultElement.appendChild(header);

        Object.entries(result).forEach(([section, requests]) => {
            const sectionHeader = document.createElement('div');
            sectionHeader.classList.add('rmtr-review-header');
            sectionHeader.textContent = section;

            resultElement.appendChild(sectionHeader);

            const sectionContent = document.createElement('div');
            sectionContent.classList.add('rmtr-review-section-content');

            if (requests.length === 0) {
                const noRequests = document.createElement('div');
                noRequests.textContent = 'No requests in this section';

                sectionContent.appendChild(noRequests);
            } else {
                const requestsList = document.createElement('ul');

                requests.forEach((request) => {
                    const requestElement = document.createElement('li');
                    requestElement.textContent = request.full;

                    requestsList.appendChild(requestElement);
                });

                sectionContent.appendChild(requestsList);
            }

            resultElement.appendChild(sectionContent);
        });

        const submitButton = document.createElement('button');
        submitButton.id = 'rmtr-review-submit';
        submitButton.textContent = 'Submit';

        resultElement.appendChild(submitButton);

        document.querySelector('main#content.mw-body').prepend(resultElement);
    });
});

// </nowiki>