RainbowDDB mod màj

Rajoute instantanément un cadre de couleur autour des messages d'un topic qui ont été signalés et affiche le motif invoqué.
mail@pastecode.io avatar
unknown
javascript
2 years ago
25 kB
1
Indexable
Never
// ==UserScript==
// @name        RainbowDDB
// @namespace   CrazyJeux/Daring-Do
// @author      CrazyJeux/Daring-Do
// @match       *://www.jeuxvideo.com/*
// @match       *://m.jeuxvideo.com/*
// @match       *://www.forumjv.com/*
// @description Ajoute un contour autour des messages signalés. La couleur change selon qui a effectué l'alerte ou si l'alerte a été traitée.
// @version     23
// @updateURL   https://openuserjs.org/meta/CrazyJeux/RainbowDDB.meta.js
// @grant       none
// ==/UserScript==

//Topic dédié : http://www.jeuxvideo.com/forums/42-1000021-39882332-1-0-1-0-rainbowddb-reperez-tous-les-messages-signales-meme-les-votres.htm

//Explications : http://image.noelshack.com/fichiers/2015/25/1434754809-explications-final.png


//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// MISE À JOUR MAI 2022
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// des problèmes étaient apparus suite à plusieurs mises à jour du forum en 2021 et 2022, cette mise à jour du script les résoud :
// 1/ l'affichage du motif de DDB des messages qui avait complètement disparu a été rétabli, le texte qui s'était décalé à cause de la dernière mise à jour a été repositionné correctement 
// 2/ le bug qui empêchait de pouvoir afficher la fenêtre des smileys/noelshack, etc, en utilisant le script a été résolu
// Le script ralentissait également le chargement de la liste des topics dans sa version complète, cette version ne fonctionne que pour les topics individuellement (elle ne cause aucun lag pour le chargement d'un topic) et conserve un temps de chargement normal dans la liste des topics
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//     FIN DES MODIFICATIONS
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

//Ajoutez ou retirez ici les motifs de ban complets qui doivent conduire au masquage automatique du message.
var reasonsToHide = [];

//Enlevez les "//" des trois lignes ci-dessous pour cacher tous les messages signalés dont la raison a pu être déterminée.
//reasonsToHide = reasonsToHide.concat("Pédopornographie", "Incitation à la haine, discrimination", "Mise en danger des personnes", "Diffamation, menaces", "Piratage, non respect des droits d'auteurs", "Apologie de comportements illégaux", "Données personnelles");
//reasonsToHide = reasonsToHide.concat("Pornographie", "Insultes", "Flood de masse", "Raids, mass-dislikes et attaques de sites", "Spoilers");
//reasonsToHide = reasonsToHide.concat("Message inopportun", "Doublons", "Publicité", "Règles spécifiques à chaque forum");

var colors = {"byother": "orange",
    "byme": "red",
    "ishandledbymod": "lightgreen",
    "ishandledbyadmin": "turquoise",
    "isadmin": "#9393f5"};
var borderWidthMessage = "5px";
var borderWidthTopic = "2px";


var isMobileIframe = false;
var srcSave = null;
var originSave = null;

var DEBUG = false;

function log(str) {
    if (DEBUG) {
        if (isMobileIframe == true)
        {
            srcSave.postMessage({'log': str}, originSave);
        } else {
            console.log(str);
        }
    }
}

function ajaxReport(link, element, width, type) {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
            var reportDiv = document.createElement('div');
            reportDiv.innerHTML = xmlhttp.responseText;
            //reportDiv.style.display = "none";

            document.body.appendChild(reportDiv);
            var reportTextarea = reportDiv.querySelector("#signalement_commentaire");
            if (reportTextarea === null) {
                log("reportTextarea is null");
                var generic = reportDiv.querySelector(".modal-generic-content");
                //console.log(generic);
                                if (reportDiv.querySelector(".g-recaptcha") === null &&
                    //The condition below is for moderators (who don't have a captcha)
                   generic.innerHTML.indexOf("Ce contenu a déjà été signalé par un utilisateur") < 0) {
                    log("this message wasn't reported by someone else");
                    if (generic.parentNode.parentNode.getAttribute("id") == 'jv-smileys'){
                        console.log('smileys');
                        log("generic is null");
                        return;
                    }
                    if (generic === null) {
                        log("generic is null");
                        return;
                    }
                    if (generic.innerHTML.indexOf("Vous avez déjà signalé ce contenu") >= 0) {
                        styleElement(element, "byme", width, type);
                        return;
                    }
                    if (generic.innerHTML.indexOf("Cet utilisateur ne peut pas être signalé") >= 0) {
                        styleElement(element, "isadmin", width, type);
                        return;
                    }
                    if (generic.innerHTML.indexOf("Ce contenu a déjà été modéré. En cas de problème, vous pouvez contacter un administrateur à moderation@jeuxvideo.com") >= 0) {
                        styleElement(element, "ishandledbymod", width, type);
                        return;
                    }
                    if (generic.innerHTML.indexOf("Ce contenu a déjà été modéré par un administrateur") >= 0) {
                        styleElement(element, "ishandledbyadmin", width, type);
                        return;
                    }
                } else {
                    log("this message was reported by someone else");
                    styleElement(element, "byother", width, type);
                    if (type === "message") {
                        var reason = reportDiv.querySelector(".mb-2");
                        if (reason !== null) {
                            reason = reason.innerHTML;
                            log("reason is not null: '"+reason+"'");
                            var options = element.querySelector(".bloc-options-msg");
                            var datemsg = element.querySelector(".bloc-date-msg");
                            var blocHeader = element.querySelector(".bloc-header");
                            //on augmente la taille du container pseudo et date pour pouvoir caler le bloc info sur le motif de ddb
                            blocHeader.style.height = "75px";
                            blocHeader.style.marginTop = "0px";
                            blocHeader.style.marginBottom = "0px";
                            blocHeader.style.alignContent = "start";
                            //on crée le bloc info et on le positionne correctement
                            var info = document.createElement("div");
                            info.innerHTML = reason;
                            //info.style.float = "left";
                            info.style.color = "red";
                            info.style.fontWeight = "bold";
                            info.style.fontSize = "15px";
                            info.style.top = "58px";
                            info.style.marginLeft = "0px";
                            info.style.position = "absolute";
                            //options.parentNode.insertBefore(info, options);
                            //insère le div info après le div date msg
                            datemsg.parentNode.insertBefore(info, datemsg.nextSibling);

                            var msg = element.querySelector(".bloc-contenu .txt-msg");
                            var p = Array.prototype.slice.call(msg.querySelectorAll("p"));
                            p.forEach(function(el) {
                                console.log(el);
                                var klass = el.getAttribute("class");
                                if (klass === null) {
                                    klass = "";
                                }
                                klass += " maybeToHide";
                                el.setAttribute("class", klass);
                            });
                            var toHide = Array.prototype.slice.call(element.querySelectorAll(".maybeToHide"));
                            var wrapper = document.createElement("p");
                            /*
                            var info = document.createElement("span");
                            info.innerHTML = "Message signalé pour " + reason.charAt(0).toLowerCase() + reason.slice(1);
                            info.style.color = "red";
                            info.style.fontWeight = "bold";
                            info.style.top = "12px";
                            wrapper.appendChild(info);
                            */
                            var shouldHide = false;
                            var hideShowMsg = document.createElement("p");
                            if (reasonsToHide.indexOf(reason) >= 0) {
                                shouldHide = true;
                                toHide.forEach(function(el) {
                                    el.style.display = "none";
                                });
                                wrapper.appendChild(document.createElement("br"));
                                hideShowMsg.innerHTML = "Afficher le contenu du message";
                                hideShowMsg.style.marginTop = "15px";
                                hideShowMsg.style.cursor = "pointer";
                                hideShowMsg.style.textDecoration = "underline";
                                hideShowMsg.style.marginBottom = "0px";
                                wrapper.appendChild(hideShowMsg);
                                wrapper.style.marginBottom = "0px";
                            }

                            msg.insertBefore(wrapper, msg.firstChild);

                            if (shouldHide === true) {
                                var isShown = false;

                                hideShowMsg.onclick = function() {
                                    if (!isShown) {
                                        var r = confirm("Voulez-vous vraiment afficher ce message ?\n\n" +
                                                        "Vous pouvez changer les motifs de signalement conduisant au masquage du message.\n\n" +
                                                        "Pour cela, il faut modifier la variable reasonsToHide au début du code du script.");
                                        if (r === false) {
                                            return;
                                        }
                                        toHide.forEach(function(el) {
                                            el.style.display = "initial";
                                        });
                                        hideShowMsg.innerHTML = "Cacher le contenu du message";
                                        wrapper.style.marginBottom = "";
                                        isShown = true;
                                    } else {
                                        toHide.forEach(function(el) {
                                            el.style.display = "none";
                                        });
                                        hideShowMsg.innerHTML = "Afficher le contenu du message";
                                        wrapper.style.marginBottom = "0px";
                                        isShown = false;
                                    }
                                };
                            }
                        }
                    }
                }

            }
            reportDiv.remove();
        }
    };
    xmlhttp.open("GET", link, true);
    xmlhttp.send();
}

function checkMessage(href, callback) {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
            var reportDiv = document.createElement('div');
            reportDiv.innerHTML = xmlhttp.responseText;
            reportDiv.style.display = "none";
            document.body.appendChild(reportDiv);
            var textarea = reportDiv.querySelector("#signalement_commentaire");
            if (textarea !== null) {
                log("textarea is not null");
                callback('isnotreported');
                return;
            }
            var errorDiv = reportDiv.querySelector(".alert.alert-danger");
            if (errorDiv !== null) {
                log("errorDiv is not null, errorDiv.innerHTML:\n"+errorDiv.innerHTML);
                if (errorDiv.innerHTML.indexOf("Ce contenu a déjà été modéré. En cas de problème, vous pouvez contacter un administrateur à moderation@jeuxvideo.com") >= 0) {
                    callback('ishandledbymod');
                    return;
                }
                if (errorDiv.innerHTML.indexOf("Ce contenu a déjà été modéré par un administrateur") >= 0) {
                    callback('ishandledbyadmin');
                    return;
                }
                if (errorDiv.innerHTML.indexOf("Ce contenu a déjà été signalé") >= 0) {
                    callback('isreported');
                    return;
                }
                if (errorDiv.innerHTML.indexOf("Cet utilisateur ne peut pas être signalé") >= 0) {
                    callback('isadmin');
                    return;
                }
            }
        }
    };
    xmlhttp.open("GET", href, true);
    xmlhttp.send();
}

function inIframe() {
    try {
        return window.self !== window.top;
    } catch (e) {
        return true;
    }
}

function styleElement(element, info, borderWidth, elementType) {
    //element.style.borderWidth = borderWidth + "!important";

    var el = null;
    var prevStyle = "";
    if (elementType === "topic") {
        el = element.querySelector("a.topic-title");
        prevStyle = el.getAttribute("style");
        if (typeof prevStyle === "undefined" || prevStyle === null) {
            prevStyle = "";
        }
    }

    switch (info) {
        case "ishandledbymod":
            if (elementType === "topic") {
                el.setAttribute("style", prevStyle + ";color: " + colors.ishandledbymod + " !important;");
            } else {
                element.style.cssText += ";box-shadow: 0 0 " + borderWidth + " " + borderWidth + " " + colors.ishandledbymod + " !important;";
            }
            break;
        case "ishandledbyadmin":
            if (elementType === "topic") {
                el.setAttribute("style", prevStyle + ";color: " + colors.ishandledbyadmin + " !important;");
            } else {
                element.style.cssText += ";box-shadow: 0 0 " + borderWidth + " " + borderWidth + " " + colors.ishandledbyadmin + " !important;";
            }
            break;
        case "byme":
            if (elementType === "topic") {
                //element.style.cssText += ";border: " + borderWidth + " solid " + colors.byme + " !important;";
                el.setAttribute("style", prevStyle + ";color: " + colors.byme + " !important;");
            } else {
                element.style.cssText += ";box-shadow: 0 0 " + borderWidth + " " + borderWidth + " " + colors.byme + " !important;";
            }
            break;
        case "byother":
            if (elementType === "topic") {
                //element.style.cssText += ";border: " + borderWidth + " solid " + colors.byother + " !important;";
                el.setAttribute("style", prevStyle + ";color: " + colors.byother + " !important;");
            } else {
                element.style.cssText += ";box-shadow: 0 0 " + borderWidth + " " + borderWidth + " " + colors.byother + " !important;";
            }
            break;
        case "isadmin":
            if (elementType === "topic") {
                //element.style.cssText += ";border: " + borderWidth + " solid " + colors.isadmin + " !important;";
                //el.setAttribute("style", prevStyle + ";color: " + colors.isadmin + " !important;");
            } else {
                //element.style.cssText += ";box-shadow: 0 0 " + borderWidth + " " + borderWidth + " " + colors.isadmin + " !important;";
            }
            break;
        default:
            var err = "Erreur fonction styleElement : info='" + info + "'";
            alert(err);
            throw new Error(err);
    }
}

function toCall() {
    //Our own messages
    if (window.location.hostname === "www.jeuxvideo.com") {
        var deleteButtons = document.querySelectorAll(".picto-msg-croix");
        log("deleteButtons.length: "+deleteButtons.length);
        if (deleteButtons.length > 0) {
            var requestsForMyMessages = function(origin) {
                var i = 0;
                (function loop(i) {
                    log("my message  #"+i+"/"+deleteButtons.length);
                    if (i >= deleteButtons.length) {
                        return;
                    }
                    var message = deleteButtons[i].parentNode;
                    while (message.getAttribute("class").indexOf("bloc-message-forum") < 0) {
                        message = message.parentNode;
                    }
                    var messAttr = message.getAttribute("data-handledbyrainbowddb");
                    var isHandled = (messAttr !== null && messAttr === "true");
                    if (!isHandled) {
                        message.setAttribute("data-handledbyrainbowddb", "true");
                        log("before send message to iframe; message id: " + message.getAttribute("data-id"));
                        iframeMessages.contentWindow.postMessage({'messageid': message.getAttribute("data-id")}, origin);
                    }

                    setTimeout(function () {
                        loop(i + 1);
                    }, 5);
                })(i);
            };

            var handleResponseFromMobileJVCForMessages = function (e) {
                var origin = e.origin || e.originalEvent.origin;
                if (origin !== 'http://m.jeuxvideo.com') {
                    return;
                }
                if (e.data.hasOwnProperty("log")) {
                    log("[Mobile iframe] " + e.data.log);
                    return;
                }
                if (e.data.hasOwnProperty("started")) {
                    if (e.data.started === true) {
                        log("mobile iframe is ready, start checking my messages");
                        requestsForMyMessages(origin);
                    }
                    return;
                }
                log("got a response from mobile JVC, e.data:\n" + JSON.stringify(e.data, null, 4));
                if (e.data.hasOwnProperty("messageid")) {
                    var message = document.querySelector("[data-id='" + e.data.messageid + "']");
                    log("e.data.messageid: " + e.data.messageid + ", message found ? " + (message !== null));

                    if (message !== null) {
                        if (e.data.hasOwnProperty("isnotreported")) {
                            return;
                        }
                        if (e.data.hasOwnProperty("ishandledbymod")) {
                            styleElement(message, "ishandledbymod", borderWidthMessage, "message");
                            return;
                        }
                        if (e.data.hasOwnProperty("ishandledbyadmin")) {
                            styleElement(message, "ishandledbyadmin", borderWidthMessage, "message");
                            return;
                        }
                        if (e.data.hasOwnProperty("isreported")) {
                            styleElement(message, "byother", borderWidthMessage, "message");
                            return;
                        }
                        if (e.data.hasOwnProperty("isadmin")) {
                            styleElement(message, "isadmin", borderWidthMessage, "message");
                            return;
                        }
                    }
                }
            };

            window.addEventListener("message", handleResponseFromMobileJVCForMessages, false);

            var mobileURL;
            var index = window.location.pathname.substring(1).indexOf("/");
            var firstDirectory = window.location.pathname.substring(1, index + 1);
            //Direct message
            if (firstDirectory !== "forums") {
                mobileURL = document.querySelector(".btn.btn-actu-new-list-forum").parentNode.href.replace("www.jeuxvideo.com", "m.jeuxvideo.com");
            } else { //Message in a topic
                var desktopURL = document.location.href;
                mobileURL = desktopURL.replace("www.jeuxvideo.com", "m.jeuxvideo.com");
            }

            var iframeMessages = document.createElement("iframe");
            iframeMessages.style.display = "none";
            document.body.appendChild(iframeMessages);
            iframeMessages.src = mobileURL;
        }
    }

    //Other people's messages
    var reportButtons = document.getElementsByClassName("picto-msg-exclam");
    var i = 0;
    (function loop(i) {
        log("reportButton #"+i+"/"+reportButtons.length);
        if (i >= reportButtons.length) {
            return;
        }
        var link = reportButtons[i].getAttribute("data-selector");
        var message = reportButtons[i].parentNode;
        while (message.className.indexOf("bloc-message-forum") < 0) {
            message = message.parentNode;
        }
        var messAttr = message.getAttribute("data-handledbyrainbowddb");
        var isHandled = (messAttr !== null && messAttr === "true");
        log("is link ("+link+") already handled? "+isHandled);
        if (!isHandled) {
            message.setAttribute("data-handledbyrainbowddb", "true");

            log("before ajaxReport for link '"+link+"'");
            ajaxReport(link, message, borderWidthMessage, "message");
        }

        setTimeout(function () {
            loop(i + 1);
        }, 5);
    })(i);


}



if (window.location.hostname !== "m.jeuxvideo.com") {

    toCall();

    addEventListener('instantclick:newpage', toCall);

    (function btnLoop() {
        var moreCommentsButtons = document.querySelectorAll(".link-plus-de-comm");
        for (var i=0; i<moreCommentsButtons.length; i++) {
            var btnAttr = moreCommentsButtons[i].getAttribute("data-handledbyrainbowddb");
            var isHandled = (btnAttr !== null && btnAttr === "true");
            if (!isHandled) {
                moreCommentsButtons[i].setAttribute("data-handledbyrainbowddb", "true");

                moreCommentsButtons[i].onclick = function() {
                    (function loop() {
                        var newElements = document.querySelectorAll(".bloc-message-forum:not([data-handledbyrainbowddb])");
                        if (newElements.length === 0) {
                            setTimeout(loop, 50);
                        } else {
                            btnLoop();
                            toCall();
                        }
                    })();
                };
            }
        }
    })();
} else {
    if (inIframe()) {
        isMobileIframe = true;

        var handleResponseFromDesktopJVC = function (e) {
            var origin = e.origin || e.originalEvent.origin;
            if (origin !== 'http://www.jeuxvideo.com') {
                return;
            }
            srcSave = e.source;
            originSave = origin;
            log("e.data in iframe: "+JSON.stringify(e.data, null, 4), srcSave, originSave);
            //Message
            if (e.data.hasOwnProperty("messageid")) {
                var realId = "#post_" + e.data.messageid;
                var message = document.querySelector(realId);
                if (message === null) {
                    log("message " + e.data.messageid + " not found...", srcSave, originSave);
                    return;
                }
                var alertButton = message.querySelector(".picto-msg-exclam");
                if (alertButton === null) {
                    log("alertButton is null", srcSave, originSave);
                    return;
                }
                var href = alertButton.parentNode.getAttribute("href");
                checkMessage(href, function (ret) {
                    var result = {'messageid': e.data.messageid};
                    result[ret] = true;
                    log("message " + e.data.messageid + " checked: " + ret, srcSave, originSave);
                    e.source.postMessage(result, origin);
                });
            }



        };

        window.addEventListener("message", handleResponseFromDesktopJVC, false);

        window.parent.postMessage({"started": true, "url": window.location.href}, "*");
    }
}