User:Vogone/sperrloganzeige.js

From Meta, a Wikimedia project coordination wiki

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.
// Dieses Script zeigt auf Benutzerseiten und Benutzerdiskussionen mit Hilfe
// der [[WP:API]] auf Wunsch ein Sperrlog an.
(function ($) {

var sperrloganzeige =
{
    // Common settings
    version: 1.2,
    logEntryLimit: 'max',
    showOnPageLoad: false,
    hideLink: false, // Wird nur beachteit, falls showOnPageLoad == true
    emptyHiddenColor: "#999999", // Farbe für leere/versteckte Logeinträge

    // Local Variables
    loadParams: null,
    user: '',

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

        var on_error = function (XMLHttpRequest, textStatus, errorThrown)
            {
                $("#sperrloganzeige_show_link").css ("display", "none");
                mw.notify($("<span style=\"color: #ff0000\">Sperrloganzeige: Fehler bitte <a href=\"" + mw.util.getUrl("User talk:Steef389") + "\">Steef389</a> melden.<br />Genauer Fehler: " + errorThrown + "</span>"), "sperrloganzeige_error_message");
                return;
            };

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

    check_user_exist: function (username)
    {
        var params = {  action: "query",
                        list: "users",
                        ususers: username,
                        format: "json" };

        var antwort = JSON.parse ($.ajax (
                {
                    url: mw.util.wikiScript("api"),
                    data: params,
                    async: false,
                    dataType: "json"
                }).responseText);

        if (typeof(antwort.query.users[0].missing) === "undefined")
        {
            return true;
        }
        return false;
    },

    get_heading: function ()
    {
		var skin = mw.config.get( 'skin' );
		var heading;
		if (skin === "modern")
        	heading = $("#mw_content");
        else
        	heading = $("#content");
        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;
        }

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

        if (!sperrloganzeige.check_user_exist (sperrloganzeige.user))
        {
            return;
        }

        // Validate Limit
        if (sperrloganzeige.logEntryLimit !== "max" && parseInt("0" + sperrloganzeige.logEntryLimit.toString(), 10) < 1)
        {
            sperrloganzeige.logEntryLimit = "max";
        }
        else if (sperrloganzeige.logEntryLimit !== "max")
        {
            // make sure it is a number
            sperrloganzeige.logEntryLimit = parseInt("0" + sperrloganzeige.logEntryLimit.toString(), 10).toString();
        }

/*
        // Validate Animation Time
        if (parseInt("0" + sperrloganzeige.animationTime.toString(), 10) <= 0)
        {
            sperrloganzeige.animationTime = 0;
        }
        else
        {
            // make sure it is a number
            sperrloganzeige.animationTime = parseInt("0" + sperrloganzeige.animationTime.toString(), 10);
        }*/

        if (!(sperrloganzeige.showOnPageLoad && sperrloganzeige.hideLink))
        {
            sperrloganzeige.get_heading ()
                .append (" ")
                .append ($(mw.html.element ('a' ,
                                            {
                                                href: "#",
                                                id: "sperrloganzeige_show_link"
                                            },
                                            !sperrloganzeige.showOnPageLoad ? "(Sperrlog anzeigen)" : "(Sperrlog verstecken)")
                            )
                            .bind ('click', function() { sperrloganzeige.showHideLog (); return false; } )
                            .css ( { fontSize: "0.4em" } ));
        }

        if (sperrloganzeige.showOnPageLoad)
        {
            sperrloganzeige.loadLog ();
        }
    },

    showHideLog: function (user)
    {
        var logOutput = $("#sperrloganzeige_box");
        if (logOutput.length === 0)
        {
            $("#sperrloganzeige_show_link").first ().text ("(Sperrlog verstecken)");
            sperrloganzeige.loadLog ();
        }
        else
        {
            if (logOutput.css ("display") === "none")
            {
                //logOutput.show (sperrloganzeige.animationTime);
                logOutput.css ("display", "block");
                $("#sperrloganzeige_show_link").first ().text ("(Sperrlog verstecken)");
            }
            else
            {
                //logOutput.hide (sperrloganzeige.animationTime);
                logOutput.css ("display", "none");
                $("#sperrloganzeige_show_link").first ().text ("(Sperrlog anzeigen)");
            }
        }
    },

    loadLog: function ()
    {
        sperrloganzeige.loadParams = {  action:  'query',
                                        list: 'logevents',
                                        letitle: 'User:' + sperrloganzeige.user,
                                        letype: 'block',
                                        format: 'json',
                                        lelimit: sperrloganzeige.logEntryLimit };
        var onSuccess = function (antwort) { sperrloganzeige.writeLog (antwort, false); };

        sperrloganzeige.ajax_request ("get", sperrloganzeige.loadParams, onSuccess);
    },

    loadPart: function (start)
    {
        var params = sperrloganzeige.loadParams;
        params.lestart = start;

        var onSuccess = function (antwort) { sperrloganzeige.writeLog (antwort, true); };

        sperrloganzeige.ajax_request ("get", params, onSuccess);
    },

    writeLog: function (antwort, append)
    {
        var ul;
        if (!append)
        {
            ul = $(mw.html.element ( "ul", {}));
        }
        else
        {
            ul = $("#sperrloganzeige_continue_link").parent ();
            $("#sperrloganzeige_continue_link").remove ();
        }

        if (antwort.query.logevents.length === 0)
        {
            ul.append (mw.html.element ("li", { "class": "mw-logline-block" }, "keine Einträge"));
        }
        else
        {
            for (var i = 0; i < antwort.query.logevents.length; i++)
            {
                ul.append (sperrloganzeige.createLogLine (antwort.query.logevents[i]));
            }
        }

        if (antwort["query-continue"] !== undefined)
        {
            ul.append ($(mw.html.element ("li", { "class": "mw-logline-block" , id: "sperrloganzeige_continue_link" }))
                    .append (mw.html.element ("a", { href: "#" }, "..."))
                    .bind ('click', function ()
                        {
                            sperrloganzeige.loadPart(antwort["query-continue"].logevents.lestart);
                            return false;
                        }

                    )
                );
        }

        if (!append)
        {
            $(mw.html.element ( "div",
                                {
                                    id: "sperrloganzeige_box",
                                    "class": "mw-warning-with-logexcerpt"
                                }
                                ))
                .append (mw.html.element (  "p",
                                            {},
                                            "Sperrlogbuch:"))
                .append (ul).prependTo (sperrloganzeige.get_heading ());
        }
    },

    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();
    },

    createLogLine: function (attribs)
    {
        var li = $(mw.html.element ("li", { "class": "mw-logline-block" }, sperrloganzeige.formatDate (attribs.timestamp) + ": "));

        var admin_link = mw.html.element (  "a",
                                            {
                                                "class": "mw-userlink",
                                                title: "User:" + attribs.user,
                                                href: mw.util.getUrl("User:" + attribs.user)
                                            },
                                            attribs.user);

        li.append (admin_link)
            .append (" ");

        var tools = $(mw.html.element ("span", { "class": "mw-usertoollinks" }))
            .append ("(")
            .append (mw.html.element (  "a",
                                        {
                                            title: "User talk:" + attribs.user,
                                            href: mw.util.getUrl("User talk:" + attribs.user)
                                        },
                                        "Diskussion"))
            .append (" | ")
            .append (mw.html.element ( "a",
                                        {
                                            title: "Special:Contributions/" + attribs.user,
                                            href: mw.util.getUrl("Special:Contributions/" + attribs.user)
                                        },
                                        "Beiträge"))
            .append (")");

        li.append (tools);

        switch (attribs.action)
        {
            case "block":
                li.append (" sperrte für den Zeitraum: ");
                break;
            case "unblock":
                li.append (" hob die Sperre auf ");
                break;
            case "reblock":
                li.append (" änderte die Sperre für den Zeitraum: ");
                break;
            default:
                li.append (" machte ??? (Bitte diesen Fehler bei Steef389 melden. Danke) ");
        }
        
        if (attribs.action === "block" || attribs.action === "reblock")
        {
            li.append (
                    mw.html.element (
                        "span",
                        {
                            title: ((typeof(attribs.params) === "undefined") ? "Nicht verfügbar" : attribs.params.duration)
                        },
                        ((typeof(attribs.params) === "undefined") ? "???" : attribs.params.duration)
                    )
                )
                .append (" ");
        }

        li.append (sperrloganzeige.parseComment (attribs.comment, typeof(attribs.commenthidden) !== "undefined"));

        if (typeof(attribs.params) !== "undefined" && (attribs.action === "block" || attribs.action === "reblock") && attribs.params.flags !== null)
        {
            li.append (" ")
                .append (
                    $(mw.html.element ("span", {}, "(" + attribs.params.flags.join (", ") + ")")).css ( { fontSize: "0.9em" } )
                );
        }

        return li;
    },

    parseComment: function (text, hidden)
    {
        var comment = $(mw.html.element ("span", { "class": "comment" }));

        if (typeof (text) === "undefined")
        {
            if (hidden)
            {
                comment.append ("(Begründung entfernt)").css ("color", sperrloganzeige.emptyHiddenColor);
                return comment;
            }
            else
            {
                mw.notify($("<span style=\"color: #ff0000\">Sperrloganzeige: Bitte Steef389 folgendes auf die <a href=\"" + mw.util.getUrl("User talk:Steef389") + "\">Diskussionsseite</a> setzen:<br /><i>Undefined Comment auf Seite " + sperrloganzeige.user + "</i></span>"), "sperrloganzeige_error_message");
                comment.append ("(undefined)").css ("color", "red");
                return comment;
            }
        }
        else if (text === null || text === "")
        {
            comment.append ("(kein Sperrkommentar)").css ("color", sperrloganzeige.emptyHiddenColor);
            return comment;
        }

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

        comment.append ("(");

        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;
    }
};

// DEPRECATED!
function sperrloganzeige_convert_old_config ()
{
    if (typeof(logEntryLimit) !== "undefined")
    {
        sperrloganzeige.logEntryLimit = logEntryLimit;

        // Deprecation Message
        var hide = false;
        var i, x, y, ARRcookies = document.cookie.split (";");
        for (i = 0; i < ARRcookies.length; i++)
        {
            x = ARRcookies[i].substr (0, ARRcookies[i].indexOf ("="));
            y = ARRcookies[i].substr (ARRcookies[i].indexOf ("=") + 1);
            x = x.replace (/^\s+|\s+$/g,"");
            if (x === "sperrloganzeige_deprecated_message")
            {
                hide = (y === "hide_depr_msg");
                break;
            }
        }

        if (!hide)
        {
            mw.notify($("<p style=\"color: #ff4500\">Hallo "+ mw.config.get ("wgUserName") +",<br />Du verwendest eine Funktionalität der Sperrloganzeige, die nun anders bewerkstelligt wird. Im Moment funktioniert dies noch, dies wird sich allerdings mit einem der nächsten Updates ändern.<br />Bitte schaue auf der <a href=\"" + mw.util.getUrl("User:Steef389/js/sperrloganzeige#Konfiguration") + "\">Beschreibungsseite</a> nach, was du ändern musst. Bei Fragen kannst du mich gerne auf meiner Diskussionsseite ansprechen.<br />Mit freundlichen Grüßen,<br />-- <a href=\"" + mw.util.getUrl("User:Steef389") + "\">Steef</a> <sup><a href=\"" + mw.util.getUrl("User talk:Steef389") + "\">389</a></p><br /><p style=\"font-size: 0.75em\"><a href=\"#\" id=\"hide_steef_sperrloganzeige_deprecated_warning\">Diese Meldung verstecken</a></p>"), "sperrloganzeige_deprecated_notice");

            $("#hide_steef_sperrloganzeige_deprecated_warning").bind("click", function ()
                {
                    var exdate=new Date();
                    exdate.setDate(exdate.getDate() + 14);
                    document.cookie="sperrloganzeige_deprecated_message=hide_depr_msg; expires="+exdate.toUTCString()+"; path=/";
                    $(".mw-js-message-sperrloganzeige_deprecated_notice").hide ();
                    return false;
                });
        }
    }
}
//sperrloganzeige_convert_old_config ();

$(document).trigger('loadWikiScript', ['User:Vogone/sperrloganzeige.js', sperrloganzeige]);
$(mw.loader.using('mediawiki.util', sperrloganzeige.init));
})(jQuery);