Benutzer:Steef389/js/user status.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
// Dieses Script zeigt auf Benutzerseiten einige Informationen über den Benutzer an
//  von [[Benutzer:Steef389]]

(function ($) {

var user_status =
{
    version: 1.20,
    // Config
    lastEditSeconds: false,                             // Show seconds of last edit
    styleMissingData: "color: #999999; font-style: italic", // Styles for missing entries
    styleLoading: "font-style: italic",
    styleBlocked: "color: #cc0000",
    styleNotBlocked: "color: #008800",
    viewPatrolNumber: false,

    groups:
    {
        groupnames:
        {
	        // Allgemeine Gruppen
	        "accountcreator": "Benutzerkonten-Ersteller",
	        "autoconfirmed": "Autoconfirmed",
	        "autoreview": "Passiver Sichter",
	        "bot": "Bot",
	        "bureaucrat": "Bürokrat",
	        "checkuser": "Checkuser",
	        "confirmed": "Bestätigter Benutzer",
	        "editor": "Sichter",
	        "sysop": "Administrator",
	        "import": "Importeur",
	        "interface-admin": "Benutzeroberflächenadministrator",
	        "ipblock-exempt": "IP-Sperre-Ausnahme",
	        "no-ipinfo": "Fürs IP-Infotool gesperrt",
	        "noratelimit": "Limit-Ausgenommene",
	        "push-subscription-manager": "Push-Abonnementverwalter",
	        "reviewer": "Prüfer",
	        "suppress": "Oversighter",
	        "transwiki": "Transwiki-Importeur",
	
	        // Globale Gruppen
	        "abusefilter-helper": "Missbrauchsfilter-Helfer",
	        "abusefilter-maintainer": "Missbrauchsfilter-Betreuer",
	        "founder": "Gründer",
	        "global-bot": "Globaler Bot",
	        "global-interface-editor": "Globaler Benutzeroberflächenbearbeiter",
	        "global-ipblock-exempt": "Globale IP-Sperre-Ausnahme",
	        "global-rollbacker": "Globaler Zurücksetzer",
	        "global-sysop": "Globaler Administrator",
	        "oathauth-tester": "2FA-Tester",
	        "ombuds": "Ombudsperson",
	        "staff": "Staff",
	        "steward": "Steward",
	        "sysadmin": "Systemadministrator",
	        "vrt-permissions": "Support-Team Mitglied",
	
	        // Seltene Gruppen
	        "apihighlimits-requestor": "API High-Limit-Requestor",
	        "captcha-exempt": "CAPTCHA-Ausnahme",
	        "global-deleter": "Globaler Löscher",
	        "global-flow-create": "Global Flow creator",
	        "new-wikis-importer": "Neuwikiimporteur",
	        "recursive-export": "Rekursiver Exporteur",
	        "wmf-researcher": "WMF-Forscher"
        },

        error_message: "(Fehlende Gruppe)",
        ignore_list: ["*", "user"],

        getLocalNames: function (/* array */ group_arr)  /* @return array */
        {
            var res = [];
            for (var i = 0; i < group_arr.length; ++i)
            {
                if ($.inArray (group_arr [i], user_status.groups.ignore_list) !== -1)
                {
                    continue;
                }
                var group = group_arr[i];
                if (typeof(user_status.groups.groupnames[group]) !== "undefined")
                {
                    res.push (user_status.groups.groupnames[group]);
                }
                else
                {
                    res.push (group + " " + user_status.groups.error_message);
                }
            }
            return res;
        }
    },

    ajaxRequest: function (method, params, on_success)
    {
        if (method.toLowerCase() !== "post" && method.toLowerCase() !== "get")
        {
            method = 'get';
        }

        var on_error = function (XMLHttpRequest, textStatus, errorThrown)
            {
                mw.util.jsMessage("<span style=\"color: #ff0000\">Userstatus: Fehler bitte <a href=\"" + mw.util.getUrl("Benutzer Diskussion:Steef389") + "\">Steef389</a> melden.<br />Genauer Fehler: " + errorThrown + "</span>", "userstatus_error_message");
                throw "Userstatus: AJAX-Request failed";
            };

        $.ajax (
            {
                url: mw.util.wikiScript("api"),
                data: params,
                dataType: "json",
                type: method.toUpperCase(),
                success: on_success,
                error: on_error
            } );
    },

    getHeading: function ()
    {
        var heading = $("#firstHeading");

        // Section 0 Edit-Button
        if (heading.length === 0)
        {
            heading = $("#section-0");
            if (heading.length === 0)
            {
                mw.util.jsMessage("<span style=\"color: #ff0000\">Sperrloganzeige: Konnte Überschrift nicht finden, bitte <a href=\"" + mw.util.getUrl("Benutzer Diskussion:Steef389") + "\">Steef389</a> melden.</span>", "sperrloganzeige_error_message");
                throw "Can't find heading";
            }
        }

        return heading;
    },

    init: function ()
    {
        if (mw.config.get ("wgAction") !== "view" || !(mw.config.get ("wgNamespaceNumber") === 2 || mw.config.get ("wgNamespaceNumber") === 3) || mw.config.get ("wgPageName").indexOf ("/") !== -1)
        {
            return;
        }

        var user = mw.config.get ("wgTitle");

        var params =
            {
                action:  'query',
                list: 'users',
                ususers: user,
                usprop: 'blockinfo|groups|editcount|registration',
                format: 'json'
            };

        user_status.user = user;
        user_status.ajaxRequest("get", params, user_status.writeCommonInfo);
    },

    actions: [],

    writeCommonInfo : function (answer)
    {
        if (typeof(answer.query.users[0].missing) !== "undefined" || typeof(answer.query.users[0].invalid) !== "undefined")
        {
            return;
        }

        // Fix size in vector
        mw.util.addCSS(".skin-vector div#steef_user_status_box { font-size: 0.8em; }");

        var edits = answer.query.users[0].editcount;
        var registration = answer.query.users[0].registration;
        var groups = answer.query.users[0].groups;
        var blocked = (typeof (answer.query.users[0].blockreason) !== "undefined");

        // Box erstellen
        var status_box = $(mw.html.element ("div", { style: "border-bottom: 1px solid #AAAAAA" , id: "steef_user_status_box" }));
        var ul = $(mw.html.element ("ul", { style: "list-style: none" }));
        status_box.append (ul);

        ul.append ($(mw.html.element ("li", { id: "steef_user_status_editcount" }))
                .append (mw.html.element ("b", {}, "Bearbeitungen:"))
                .append (" " + edits)
            );
            
        // Sichtungen
        if (user_status.viewPatrolNumber)
        {
            ul.append ($(mw.html.element ("li", { id: "steef_user_status_patrolcount" }))
                    .append (mw.html.element ("b", {}, "Sichtungen:"))
                    .append (" ")
                    .append ($(mw.html.element ("span", { style: user_status.styleLoading, id: "steef_user_status_patrolcount_loading" }, "wird geladen...")))
                );
                
            user_status.actions.push (
                {
                    apiparams:
                    {
                        action: "query",
                        prop: "revisions",
                        rvlimit: 1,
                        rvprop: "content",
                        titles: "User:" + user_status.user + "/Sichterbeiträge",
                        format: "json"
                    },
                    func : user_status.writePatrolCount
                });               
        }

        var regdate;
        if (registration !== null && registration !== "")
        {
            regdate = user_status.formatDate (registration);
        }
        else
        {
            regdate = $(mw.html.element ("span", { style: user_status.styleMissingData }, "<nicht in Datenbank>"));
        }

        ul.append ($(mw.html.element ("li", { id: "steef_user_status_reg_date" }))
                .append (mw.html.element ("b", {}, "Registrierungsdatum:"))
                .append (" ")
                .append (regdate)
            );

        // lokale Gruppen
        if (typeof (groups) !== "undefined")
        {
            var groupstr = user_status.groups.getLocalNames(groups).join(", ");
            var group;
            if (groupstr !== "")
            {
                group = groupstr.replace (/(.*)\,([^,]*)/, "$1 und$2");
            }
            else
            {
                group = $(mw.html.element ("span", { style: user_status.styleMissingData }, "keine Gruppen"));
            }

            ul.append ($(mw.html.element ("li", { id: "steef_user_status_local_group" }))
                    .append (mw.html.element ("b", {}, "Lokale Benutzergruppen:"))
                    .append (" ")
                    .append (group)
                );
        }

        ul.append ($(mw.html.element ("li", { id: "steef_user_status_global_group", style: "display: none" }))
                .append (mw.html.element ("b", {}, "Globale Benutzergruppen:"))
                .append (" ")
                .append ($(mw.html.element ("span", { id: "steef_user_status_global_group_loading" }, "wird geladen...")))
            );

        // Letzter Edit
        if (edits > 0)
        {
            ul.append ($(mw.html.element ("li", { id: "steef_user_status_last_edit" }))
                    .append (mw.html.element ("b", {}, "Letzter Edit:"))
                    .append (" ")
                    .append ($(mw.html.element ("span", { style: user_status.styleLoading, id: "steef_user_status_last_edit_loading" }, "wird geladen...")))
                );

            user_status.actions.push (
                {
                    apiparams:
                    {
                        action: "query",
                        list: "usercontribs",
                        ucuser: user_status.user,
                        uclimit: 1,
                        format: "json"
                    },
                    func : user_status.writeLastEdit
                });
        }

        ul = $(mw.html.element ("ul", { style: "list-style: none" }));
        status_box.append (ul);

        // Sperren
        ul.append ($(mw.html.element ("li", { id: "steef_user_status_block_status" }))
                .append (mw.html.element ("b", {}, "Sperrstatus:"))
                .append (" ")
                .append ($(mw.html.element ("span", { style: ((blocked) ? user_status.styleBlocked : user_status.styleNotBlocked), id: "steef_user_status_block_status_span" }, ((blocked) ? "gesperrt" : "nicht gesperrt"))))
            );

        if (blocked)
        {
            ul.append ($(mw.html.element ("li", { id: "steef_user_status_block_time" }))
                .append (mw.html.element ("b", {}, "Sperrende:"))
                .append (" ")
                .append ($(mw.html.element ("span", { style: user_status.styleLoading, id: "steef_user_status_block_time_loading" }, "wird geladen...")))
            );

            ul.append ($(mw.html.element ("li", { id: "steef_user_status_block_reason" }))
                .append (mw.html.element ("b", {}, "Sperrbegründung:"))
                .append (" ")
                .append ($(mw.html.element ("span", { style: user_status.styleLoading, id: "steef_user_status_block_reason_loading" }, "wird geladen...")))
            );

            ul.append ($(mw.html.element ("li", { id: "steef_user_status_blocker" }))
                .append (mw.html.element ("b", {}, "Sperrender:"))
                .append (" ")
                .append ($(mw.html.element ("span", { style: user_status.styleLoading, id: "steef_user_status_blocker_loading" }, "wird geladen...")))
            );

            user_status.actions.push (
                {
                    apiparams:
                    {
                        action: "query",
                        list: "logevents",
                        letitle: "User:" + user_status.user,
                        letype: "block",
                        format: "json",
                        lelimit: 1
                    },
                    func : user_status.writeBlockDetail
                });
        }

        user_status.getHeading ().after (status_box);

        user_status.actions.push (
                {
                    apiparams:
                    {
                        action: "query",
                        meta: "globaluserinfo",
                        guiuser: user_status.user,
                        guiprop: "groups",
                        format: "json"
                    },
                    func : user_status.writeGlobalGroup
                });

        user_status.doRequest ();
    },

    doRequest: function ()
    {
        var action = user_status.actions[0];
        user_status.actions.shift ();

        user_status.ajaxRequest ("get", action.apiparams, action.func);

        if (user_status.actions.length > 0)
        {
            window.setTimeout (function (thisObj) { thisObj.doRequest (); }, 100, user_status);
        }
    },

    writeLastEdit: function (answer, textStatus)
    {
        if (answer.query.usercontribs.length < 1)
        {
            $("#steef_user_status_last_edit_loading").replace (mw.html.element ("span", { style: user_status.styleMissingData }, "kein Edit gefunden (nur gelöschte Beiträge?)"));
            return;
        }

        var date_str = answer.query.usercontribs[0].timestamp;
        var date = new Date ();
        date.setUTCFullYear (date_str.substr (0, 4));
        date.setUTCMonth (date_str.substr (5, 2) - 1);
        date.setUTCDate (date_str.substr (8, 2));
        date.setUTCHours (date_str.substr (11, 2));
        date.setUTCMinutes (date_str.substr (14, 2));
        date.setUTCSeconds (date_str.substr (17, 2));

        var now = new Date ();

        if (now < date)
        {
            date = now - 1000;
        }

        var diff = {
                years: 0,
                months: 0,
                days: 0,
                hours: 0,
                minutes: 0,
                seconds: 0
            };

        // Jahre
        diff.years = now.getFullYear () - date.getFullYear ();
        date.setFullYear (now.getFullYear ());
        if (date > now)
        {
            --diff.years;
            date.setFullYear (date.getFullYear () - 1);
        }

        // Monate
        while (date < now)
        {
            diff.months++;
            date.setMonth (date.getMonth () + 1);
        }
        date.setMonth (date.getMonth () - 1);
        diff.months--;

        // Tage
        while (date.getTime () + (24 * 60 * 60 * 1000) < now)
        {
            diff.days++;
            date.setTime (date.getTime () + (24 * 60 * 60 * 1000));
        }

        // Stunden
        diff.hours = Math.floor ((now - date) / (60 * 60 * 1000));
        date.setTime (date.getTime () + diff.hours * 60 * 60 * 1000);

        // Minuten
        diff.minutes = Math.floor ((now - date) / (60 * 1000));
        date.setTime (date.getTime () + diff.minutes * 60 * 1000);

        // Sekunden
        diff.seconds = Math.floor ((now - date) / 1000);

        var diff_str = [];

        if (diff.years > 0)
        {
            diff_str.push (diff.years + " Jahr" + ((diff.years > 1) ? "en" : ""));
        }
        if (diff.months > 0)
        {
            diff_str.push (diff.months + " Monat" + ((diff.months > 1) ? "en" : ""));
        }
        if (diff.days > 0)
        {
            diff_str.push (diff.days + " Tag" + ((diff.days > 1) ? "en" : ""));
        }
        if (diff.hours > 0)
        {
            diff_str.push (diff.hours + " Stunde" + ((diff.hours > 1) ? "n" : ""));
        }
        if (diff.minutes > 0)
        {
            diff_str.push (diff.minutes + " Minute" + ((diff.minutes > 1) ? "n" : ""));
        }
        if (diff.seconds > 0 && user_status.lastEditSeconds)
        {
            diff_str.push (diff.seconds + " Sekunde" + ((diff.seconds > 1) ? "n" : ""));
        }

        var diff_text = "";
        if (diff_str.length === 0)
        {
            if (user_status.lastEditSeconds)
            {
                diff_text = "vor weniger als 1 Sekunde";
            }
            else
            {
                diff_text = "vor weniger als 1 Minute";
            }
        }
        else
        {
            diff_text = "vor " + diff_str.join(", ").replace (/(.*)\,([^,]*)/, "$1 und$2");
        }

        diff_text = diff_text + " (" + user_status.formatDate (date_str) + ")";

        $("#steef_user_status_last_edit_loading").replaceWith (diff_text);
    },

    writeGlobalGroup: function (answer, textStatus)
    {
        var groups = answer.query.globaluserinfo.groups;

        if (typeof(groups) !== "undefined" && groups.length > 0)
        {
            $("#steef_user_status_global_group_loading").replaceWith (user_status.groups.getLocalNames(groups).join(", ").replace (/(.*)\,([^,]*)/, "$1 und$2"));

            $("#steef_user_status_global_group").css ("display", "inline");
        }

        // Global lock
        if (typeof(answer.query.globaluserinfo.locked) !== "undefined")
        {
            $("#steef_user_status_block_status_span").text ($("#steef_user_status_block_status_span").text () + " [locked]");
        }
    },

    writeBlockDetail: function (answer, textStatus)
    {
        var duration = "undefined";
        var expiry = "undefined";
        if (typeof(answer.query.logevents[0].params) !== "undefined")
        {
            duration = answer.query.logevents[0].params.duration;
            expiry = "";
            if (duration === "infinite" || duration === "indefinite")
            {
                duration = "unbeschränkt";
                expiry = "nie";
            }
            else
            {
                expiry = user_status.formatDate (answer.query.logevents[0].params.expiry);
            }
        }
        $("#steef_user_status_block_status_span").text ("gesperrt (" + duration + ")");

        $("#steef_user_status_block_time_loading").replaceWith (expiry);
        $("#steef_user_status_block_reason_loading").replaceWith (user_status.parseComment (answer.query.logevents[0].comment, (typeof(answer.query.logevents[0].commenthidden) !== "undefined")));
        $("#steef_user_status_blocker_loading").replaceWith (mw.html.element ("a", { "class": "mw-userlink", title: "Benutzer:" + answer.query.logevents[0].user, href: mw.util.getUrl("Benutzer:" + answer.query.logevents[0].user) }, answer.query.logevents[0].user));
    },

    writePatrolCount: function (answer, textStatus)
    {
        for (var key in answer.query.pages)
        {
            if ("-1" !== key)
            {
                var patrolled_edits = parseInt(answer.query.pages[key].revisions[0]["*"], 10);
                if (0 < patrolled_edits)
                {
                    $("#steef_user_status_patrolcount_loading").replaceWith ("" + patrolled_edits);
                    return;
                }
            }
            break;
        }
    
        $("#steef_user_status_patrolcount_loading").replaceWith (mw.html.element ("span", { style: user_status.styleMissingData }, "nicht verfügbar"));
    },
    
    parseComment: function (text, hidden)
    {
        var comment = $(mw.html.element ("span", { "class": "comment", style: "font-style: normal" }));

        if (typeof (text) === "undefined")
        {
            if (hidden)
            {
                comment.append ("Begründung entfernt").css ("color", "#999999");
                return comment;
            }
            else
            {
                mw.util.jsMessage("<span style=\"color: #ff0000\">Userstatus: Bitte Steef389 folgendes auf die <a href=\"" + mw.util.getUrl("Benutzer Diskussion:Steef389") + "\">Diskussionsseite</a> setzen:<br /><i>Undefined Comment auf Seite " + user_status.user + "</i></span>", "user_status_error_message");
                comment.append ("undefined").css ("color", "red");
                return comment;
            }
        }
        else if (text === null || text === "")
        {
            comment.append ("kein Sperrkommentar").css ("color", "#999999");
            return comment;
        }

        var intLink = /(.*?)\[\[((.*?)\|)?(.*?)\]\](.*)/;
        var suche = text;
        var ergebnis;

        while (null !== (ergebnis = intLink.exec (suche)))
        {
            comment.append (ergebnis[1]);
            if (ergebnis[2] === undefined)
            {
                comment.append (
                    mw.html.element (
                        'a',
                        {
                            href: mw.util.getUrl(ergebnis[4]),
                            title: ergebnis[4]
                        },
                        ergebnis[4]
                    )
                );
            }
            else
            {
                comment.append (
                    mw.html.element (
                        'a',
                        {
                            href: mw.util.getUrl(ergebnis[3]),
                            title: ergebnis[3]
                        },
                        ergebnis[4]
                    )
                );
            }
            suche = ergebnis[5];
        }
        comment.append (suche);
        return comment;
    },

    formatDate: function (datum)
    {
        var ret_datum = new Date ();
        ret_datum.setUTCFullYear (datum.substr (0, 4));
        ret_datum.setUTCMonth (datum.substr (5, 2) - 1);
        ret_datum.setUTCDate (datum.substr (8, 2));
        ret_datum.setUTCHours (datum.substr (11, 2));
        ret_datum.setUTCMinutes (datum.substr (14, 2));
        ret_datum.setUTCSeconds (datum.substr (17, 2));
        return ret_datum.toLocaleString();
    }
};

$(document).trigger('loadWikiScript', ['Benutzer:Steef389/js/user_status.js', user_status]);
$(mw.loader.using('mediawiki.util', user_status.init));
})(jQuery);