User:逆襲的天邪鬼/+1s.js

From TestWiki

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.
(function () {
    if (mw.config.get('wgUserGroups').indexOf('sysop') === -1) {
        return;
    }

    var SUMMARY = '+1s by [[User:逆襲的天邪鬼/+1s.js|+1s.js]] (Test)';

    document.styleSheets[0].insertRule('.donate1second { color:red; }');
    document.styleSheets[0].insertRule('a.donating1second { color:grey; }');

    var block = function (username) {
        return $.ajax({
            url: mw.util.wikiScript('api'),
            data: {
                format: 'json',
                action: 'block',
                user: username,
                expiry: '1 second',
                reason: SUMMARY,
                allowusertalk: '',
                token: mw.user.tokens.get('editToken'),
            },
            dataType: 'json',
            type: 'POST',
        });
    };

    var startHaMode = function () {
        var getUserName = function (item) {
            var title = item.getAttribute('title');

            if (title.indexOf('/') > -1) {
                return null;
            }

            // deal with markblocked
            if (title.indexOf(';') > -1) {
                return title.substr(5, title.indexOf(';') - 5);
            } else {
                return title.substr(5);
            }
        };

        var donate1second = function (e) {
            e.preventDefault();
            var username = this.getAttribute('data-username');
            var that = this;

            if (that.className.indexOf('donating1second') !== -1) {
                return;
            }

            that.classList.add('donating1second');

            block(username).then(function (data) {
                if (data.error) {
                    mw.notify("Cannot donate " + username + "'s 1 second.");
                } else {
                    mw.notify("+1s succeeded.");
                }
            }).fail(function () {
                mw.notify("Cannot donate " + username + "'s 1 second.");
            }).always(function () {
                that.classList.remove('donating1second');
            });
        };

        $('a[title^="User:"]', '#mw-content-text').each(function (index, item) {
            var username = getUserName(item);
            if (username) {
                var x = $('<a href="#" class="donate1second"><sup>+1s</sup></a>')
                            .attr('data-username', username)
                            .click(donate1second);
                $(item).after(x);
            }
        });
    };

    var isHaMode = function() { return localStorage['+1s'] !== undefined && localStorage['+1s'] !== 'false'; };
    var label = function() { return isHaMode() ? '[√] +1s Mode' : '[ ] +1s Mode'; };

    var node = mw.util.addPortletLink('p-cactions', '#', label());
    $(node).click(function (e) {
        e.preventDefault();
        localStorage['+1s'] = !isHaMode();
        $('a', this).text(label());

        if (isHaMode()) {
            if ($('.donate1second').length === 0) {
                startHaMode();
            }
        } else {
            $('.donate1second').remove();
        }
    });

    if (isHaMode()) {
        startHaMode();
    }
})();