Fandom Developers Wiki
Advertisement

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.
/**
 * Name:        HighlightUpdate
 * Version:     v1.0
 * Author:      KockaAdmiralac <1405523@gmail.com>
 * Description: Adds a button for updating [[MediaWiki:Highlight.css]].
 */
require([
    'wikia.window',
    'jquery',
    'mw',
    'BannerNotification'
], function(window, $, mw, BannerNotification) {
    'use strict';
    var config = mw.config.get([
        'wgArticleId',
        'wgCityId'
    ]);
    if (
        config.wgArticleId !== 2160 ||
        config.wgCityId !== '7931' ||
        $('#ca-highlights').exists()
    ) {
        return;
    }
    var HighlightUpdater = {
        groups: {
            'content-volunteer': {
                color: '#ff7000',
                cssVar: 'convol'
            },
            'vanguard': {
                color: '#1eaf7a',
                cssVar: 'vanguard'
            },
            'voldev': {
                color: '#23c8d2',
                cssVar: 'voldev'
            },
            'global-discussions-moderator': {
                color: '#4286f4',
                cssVar: 'gdm'
            },
            'soap': {
                color: '#ff7777',
                cssVar: 'soap'
            },
            'helper': {
                color: '#4c5f1d',
                cssVar: 'helper'
            },
            'content-team-member': {
                color: '#d27d2c',
                cssVar: 'ctm'
            },
            'wiki-manager': {
                color: '#09e5a2',
                cssVar: 'wiki-manager'
            },
            'staff': {
                color: '#ddaa00',
                cssVar: 'staff'
            }
        },
        overrides: {
            add: {},
            remove: {
                'CT1000': ['soap'],
                'Data-engineering-bot': ['global-discussions-moderator'],
                'DSlayful': [
                    'staff',
                    'helper',
                    'soap'
                ],
                'Noreports': ['global-discussions-moderator'],
                'Socvoluntary': ['soap'],
                'Testludwikvs': ['soap'],
                'Ucpnltest2': ['soap'],
                'Wiki-o-slay': ['soap']
            }
        },
        init: function() {
            this.api = new mw.Api();
            $('.page-header__contribution-buttons .wds-list').append(
                $('<li>').append(
                    $('<a>', {
                        click: $.proxy(this.click, this),
                        id: 'ca-highlights',
                        text: 'Update highlights',
                        href: '#'
                    })
                )
            );
        },
        click: function() {
            this.api.get({
                action: 'query',
                list: 'groupmembers',
                gmgroups: Object.keys(this.groups).join('|') + '|bot-global',
                gmlimit: 'max',
                pageids: 2160,
                prop: 'revisions',
                rvprop: 'content',
                indexpageids: true,
                cb: Date.now()
            }).then($.proxy(this.callback, this));
        },
        callback: function(data) {
            var users = {};
            var overrides = this.overrides;
            for (var group1 in this.groups) {
                users[group1] = [];
            }
            data.users.forEach(function(u) {
                var groups = u.groups;
                if (overrides.remove[u.name]) {
                    overrides.remove[u.name].forEach(function(g) {
                        if (groups.indexOf(g) !== -1) {
                            groups.splice(groups.indexOf(g), 1);
                        }
                    });
                }
                if (groups.indexOf('bot-global') !== -1) {
                    return;
                }
                groups.forEach(function(g) {
                    users[g].push(u.name);
                });
            });
            Object.keys(overrides.add).forEach(function(name) {
                overrides.add[name].forEach(function(g) {
                    if (users[g] && users[g].indexOf(name) === -1) {
                        users[g].push(name);
                    }
                });
            });
            var text = '';
            for (var group in users) {
                text +=
                    '/* ' + group + ' */\n' +
                    this.getSelectorsFor(group, users[group].sort())
                    .join(',\n') + ' {\n' + 
                    '    color: ' + this.groups[group].color +
                    ' !important;\n' + 
                    '    color: var(--highlight-' + this.groups[group].cssVar +
                    ') !important;\n}\n\n';
            }
            this.api.post({
                action: 'edit',
                text: data.query.pages[data.query.pageids[0]]
                    .revisions[0]['*']
                    .replace(
                        /(\/\* HighlightUpdate-start \*\/\n)[\s\S]*$/igm,
                        function(_, m) {
                            return m + text;
                        }
                    ),
                title: 'MediaWiki:Highlight.css',
                // eslint-disable-next-line max-len
                summary: 'Automatically updating via [[MediaWiki:Highlight.js|Highlight.js]]',
                minor: true,
                bot: true,
                token: mw.user.tokens.get('editToken')
            }).then($.proxy(this.edited, this));
        },
        getSelectorsFor: function(group, users) {
            var encode = [];
            users.forEach(function(u) {
                var regularEncode = u.replace(/\s/g, '_'),
                    wikiEncode = mw.util.wikiUrlencode(u);
                encode.push(regularEncode);
                if (regularEncode !== wikiEncode) {
                    encode.push(wikiEncode);
                }
            });
            var selectors = encode.map(function(sel) {
                return 'a[href$=":' + sel + '"]';
            });
            if (group === 'staff') {
                selectors.push('.ChatWindow .User.staff');
            }
            return selectors;
        },
        edited: function() {
            new BannerNotification(
                'Highlights successfully updated!',
                'confirm'
            ).show();
            setTimeout(function() {
                window.location.reload();
            }, 3000);
        }
    };
    mw.loader.using([
        'mediawiki.api',
        'mediawiki.user',
        'mediawiki.util'
    ]).then($.proxy(HighlightUpdater.init, HighlightUpdater));
});
Advertisement