MediaWiki:Gadget-userProfile.js

From Anvil Empires Wiki
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
// User profile
// <nowiki>
mw.loader.using(['mediawiki.util', 'mediawiki.api']).done(function() {
    var config = mw.config.get([
        'wgRelevantUserName',
        'wgNamespaceNumber',
        'wgUserLanguage',
        'wgArticleId',
        'wgAction',
        'wgTitle'
    ]);
    var username = config.wgRelevantUserName;
    if (!username || window.loadedHorseUserProfile) return;
    window.loadedHorseUserProfile = true;
    if (config.wgNamespaceNumber !== -1 && config.wgTitle.includes('/')) return;

    var lang = mw.language.bcp47(config.wgUserLanguage);
    var dateOptions = {
        year: "numeric",
        month: "short",
        day: "numeric",
        hour: "2-digit",
        minute: "2-digit",
        timeZone: "UTC",
        timeZoneName: "short"
    };
    var api = new mw.Api();
    if (mw.util.isIPAddress(username)) api.get({
        action: 'query',
        list: ['usercontribs', 'blocks'],
        ucuser: username,
        ucprop: [],
        uclimit: 'max',
        bkip: username,
        bkprop: ['user', 'by', 'timestamp', 'expiry', 'flags', 'reason', 'restrictions'],
        bklimit: 1,
        formatversion: 2
    }).done(function(data) {
        var editcount = data.query.usercontribs.length;
        if (data.continue && data.continue.uccontinue) editcount = data.limits.usercontribs + '+';
        var user = {
            groups: ['*'],
            editcount: editcount
        };
        formatProfile(user, data.query.blocks[0]);
    });
    else api.get({
        action: 'query',
        list: ['users', 'blocks'],
        ususers: username,
        usprop: ['groups', 'editcount', 'registration', 'emailable'],
        bkusers: username,
        bkprop: ['user', 'by', 'timestamp', 'expiry', 'flags', 'reason', 'restrictions'],
        bklimit: 1,
        formatversion: 2
    }).done(function(data) {
        formatProfile(data.query.users[0], data.query.blocks[0]);
    });

    if (window.loadedHorseUserProfileContribs) return;
    window.loadedHorseUserProfileContribs = true;
    if (config.wgNamespaceNumber === 2 && !config.wgArticleId && config.wgAction === 'view') {
        mw.loader.using(['mediawiki.pager.styles', 'mediawiki.special.changeslist']).then(function() {
            var text = '== [[Special:Contributions/' + username + '|{{int:contributions-title|' + username + '}}]] ==\n{{Special:Contributions/' + username + '|limit=20}}';
            new mw.Api().parse(text, {
                title: 'User:' + config.wgTitle,
                wrapoutputclass: 'horse-userprofile-contribs',
                disableeditsection: true,
                disablelimitreport: true,
                uselang: config.wgUserLanguage
            }).done(function(parsedText) {
                mw.hook('wikipage.content').fire(
                    $(parsedText).appendTo('#mw-content-text')
                );
            });
        });
    }

    function formatProfile(user, block) {
        user.groups.splice(user.groups.indexOf('*'), 1);
        var text = '<div class="horse-userprofile-info">';
        if (user.groups.length) {
            var groupList = user.groups.map(function(group) {
                var grouppage = '{{MediaWiki:grouppage-' + group + '}}';
                return [
                    '{{#ifexist: ' + grouppage + ' | [[' + grouppage + '|{{int:group-' + group + '}}]] | {{int:group-' + group + '}} }}',
                    '{{#ifexist: ' + grouppage + ' | [[' + grouppage + '|{{int:group-' + group + '-member|' + username + '}}]] | {{int:group-' + group + '-member|' + username + '}} }}'
                ];
            }).reduce(function(prev, cur) {
                prev[0].push(cur[0]);
                prev[1].push(cur[1]);
                return prev;
            }, [
                [],
                []
            ]);
            text += '\n\n<span>{{int:prefs-memberingroups|' + user.groups.length + '|' + username + '}}</span>\t<span>{{int:prefs-memberingroups-type|' + mw.language.listToText(groupList[0]) + '|' + mw.language.listToText(groupList[1]) + '}}</span>';
        }
        text += '\n\n<span>{{int:prefs-edits}}</span>\t<span>[[Special:Contribs/' + username + '|' + mw.language.convertNumber(user.editcount) + ']]</span>';
        if (user.registration) {
            text += '\n\n<span>{{int:prefs-registration}}</span>\t<span>' + mw.language.convertNumber(new Date(user.registration).toLocaleString(lang, dateOptions)) + '</span>';
            if (!user.emailable) text += '\n\n<span>{{int:nowikiemailtext|' + username + '}}</span>';
        }
        text += '\n\n</div>';
        if (block && !$('.mw-warning-with-logexcerpt .mw-logevent-loglines > .mw-logline-block').length) {
            var notice = 'sp-contributions-blocked-notice';
            if (mw.util.isIPAddress(block.user, true)) notice += '-anon';
            var logentry = 'logentry-block-block';
            var partialBlock = [];
            if (block.partial) {
                notice += '-partial';
                logentry = 'logentry-partialblock-block';
                if (block.restrictions.pages) {
                    var blockpages = block.restrictions.pages.map(function(page) {
                        return '[[' + page.title + ']]';
                    });
                    partialBlock.push('{{int:logentry-partialblock-block-page|' + blockpages.length + '|' + mw.language.listToText(blockpages) + '}}');
                }
                if (block.restrictions.namespaces) {
                    var blocknamespaces = block.restrictions.namespaces.map(function(namespace) {
                        if (!namespace) return '[[Special:AllPages|{{int:blanknamespace}}]]';
                        return '[[Special:AllPages/{{ns:' + namespace + '}}:|{{ns:' + namespace + '}}]]';
                    });
                    partialBlock.push('{{int:logentry-partialblock-block-ns|' + blocknamespaces.length + '|' + mw.language.listToText(blocknamespaces) + '}}');
                }
                if (block.restrictions.actions) {
                    var blockactions = block.restrictions.actions.map(function(action) {
                        return '{{int:ipb-action-' + action + '}}';
                    });
                    partialBlock.push('{{int:logentry-partialblock-block-action|' + blockactions.length + '|' + mw.language.listToText(blockactions) + '}}');
                }
                if (!partialBlock.length) logentry = 'logentry-non-editing-block-block';
            }
            var blockDate = new Date(block.timestamp);
            var blockexpiry = '{{int:infiniteblock}}';
            if (!['infinite', 'indefinite', 'infinity', 'never'].includes(block.expiry)) {
                var expiry = new Date(block.expiry.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2,3})/, '$1-$2-$3T$4:$5:$6Z'));
                var duration = expiry - blockDate;
                var blockDuration = [];
                var factor = 1000;
                if (duration % factor === 0) blockDuration = ['duration-seconds', Math.floor(duration / factor)];
                factor *= 60;
                if (duration % factor === 0) blockDuration = ['duration-minutes', Math.floor(duration / factor)];
                factor *= 60;
                if (duration % factor === 0) blockDuration = ['duration-hours', Math.floor(duration / factor)];
                factor *= 24;
                if (duration % factor === 0) blockDuration = ['duration-days', Math.floor(duration / factor)];
                if (duration % (factor * 7) === 0) blockDuration = ['duration-weeks', Math.floor(duration / (factor * 7))];
                if (duration % (factor * 30) === 0) blockDuration = ['months', Math.floor(duration / (factor * 30))];
                factor *= 365;
                if (duration % factor === 0) blockDuration = ['duration-years', Math.floor(duration / factor)];
                if (duration % (factor * 10) === 0) blockDuration = ['duration-decades', Math.floor(duration / (factor * 10))];
                if (duration % (factor * 100) === 0) blockDuration = ['duration-centuries', Math.floor(duration / (factor * 100))];
                if (duration % (factor * 1000) === 0) blockDuration = ['duration-millennia', Math.floor(duration / (factor * 1000))];
                if (blockDuration.length < 2 || blockDuration[1] > 1000) blockexpiry = mw.language.convertNumber(expiry.toLocaleString(lang, dateOptions));
                else blockexpiry = '{{int:' + blockDuration.join('|') + '}}';
            }
            var blockflags = '';
            var blockflaglist = [];
            if (block.anononly) blockflaglist.push('{{int:block-log-flags-anononly}}');
            if (block.nocreate) blockflaglist.push('{{int:block-log-flags-nocreate}}');
            if (!block.autoblock && !mw.util.isIPAddress(block.user, true)) blockflaglist.push('{{int:block-log-flags-noautoblock}}');
            if (!block.allowusertalk) blockflaglist.push('{{int:block-log-flags-nousertalk}}');
            if (block.noemail) blockflaglist.push('{{int:block-log-flags-noemail}}');
            if (block.hidden) blockflaglist.push('{{int:block-log-flags-hiddenname}}');
            if (blockflaglist.length) blockflags = '{{int:parentheses|' + blockflaglist.join(mw.msg('comma-separator')) + '}}';
            var blockreason = ' <span class="comment">{{int:parentheses|' + block.reason + '}}</span>';
            if (!block.reason) blockreason = '';
            text += '<div class="horse-userprofile-block mw-warning-with-logexcerpt"><div>\n{{int:' + notice + '|' + username + '}}\n';
            text += '<ul class="mw-logevent-loglines"><li class="mw-logline-block">' + mw.language.convertNumber(blockDate.toLocaleString(lang, dateOptions)) + ' {{int:' + logentry + '|[[User:' + block.by + '|' + block.by + ']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:' + block.by + '|{{int:talkpagelinktext}}]]</span> <span>[[Special:Contribs/' + block.by + '|{{int:contribslink}}]]</span></span>|' + block.by;
            if (mw.util.isIPAddress(block.user, true)) text += '|[[Special:Contribs/' + block.user + '|' + block.user + ']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:' + block.user + '|{{int:talkpagelinktext}}]]</span></span>';
            else text += '|[[User:' + block.user + '|' + block.user + ']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:' + block.user + '|{{int:talkpagelinktext}}]]</span> <span>[[Special:Contribs/' + block.user + '|{{int:contribslink}}]]</span></span>';
            text += '|' + block.user + '|' + blockexpiry + '|' + blockflags + '|' + mw.language.listToText(partialBlock) + '}}' + blockreason + '</li></ul></div></div>';
        }
        api.parse(text, {
            disablelimitreport: true,
            wrapoutputclass: 'horse-userprofile mw-message-box mw-content-' + ($('#contentSub').attr('dir') || 'ltr'),
            uselang: config.wgUserLanguage
        }).done(function(parsedText) {
            parsedText = parsedText.replace(/\u29FCgroup-([^\u29FC\u29FD]+?)(?:-member)?\u29FD/g, '$1');
            mw.hook('wikipage.content').fire(
                $(parsedText).appendTo('#contentSub')
            );
        });
    }
});
// </nowiki>