Greasy Fork is available in English.

Risibank Avatar

Offre la possibilite d'ajouter un avatar anime (GIF) dans les parametres de profil JVC (Fonctionne aussi avec des images fixes) aux yeux des utilisateurs de ce script.

// ==UserScript==
// @name         Risibank Avatar
// @namespace    http://tampermonkey.net/
// @version      2024-09.v0.1.1
// @description  Offre la possibilite d'ajouter un avatar anime (GIF) dans les parametres de profil JVC (Fonctionne aussi avec des images fixes) aux yeux des utilisateurs de ce script.
// @author       Treflou
// @match        https://www.jeuxvideo.com/forums/*
// @match        https://www.jeuxvideo.com/messages-prives/*
// @match        https://www.jeuxvideo.com/profil/*?mode=infos
// @match        https://www.jeuxvideo.com/profil/*?mode=historique_forum
// @match        https://www.jeuxvideo.com/sso/infos_pseudo.php?id=*
// @icon         https://risibank.fr/logo.png
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    function openRisiBank() { // Appel Risibank
        RisiBank.activate({

            ...RisiBank.Defaults.Overlay.Dark,
            mediaSize: 'sm',

            // Add selected image (risibank) to specified text area
            onSelectMedia: RisiBank.Actions.addRisiBankImageLink('#AvatarAnimeeRisi'),
        });
    }

    if (window.location.href.includes("https://www.jeuxvideo.com/sso/infos_pseudo.php?id=")) //Parametres du profil -> Ajout de la ligne "Ajouter un avatar anime :" avec previsualisation
    {

        // Import api risibank
        // html : script src="https://risibank.fr/downloads/web-api/risibank.js"></script>
        var risibankscript = document.createElement('script');
        risibankscript.src = "https://risibank.fr/downloads/web-api/risibank.js";
        risibankscript.type = "text/javascript";
        risibankscript.async = true;

        // Verifie que l'api est bien load
        risibankscript.addEventListener('load', function() {
            console.log('Le script Risibank est chargé et prêt à être utilisé.');
        });
        // Insertion du script dans le head
        document.head.appendChild(risibankscript);

        let InfosTable = document.getElementsByTagName("tbody")[0];
        let Ligne = InfosTable.insertRow(12); //Ajoute ligne au tableau
        let Case = Ligne.insertCell(0); //Ajoute première colonne

        Case.className += "cell-description p-inline-block";

        let Text = document.createElement('div');
        Text.className += "libelle";
        Text.appendChild(document.createTextNode("Avatar Animé : ")); //Ajoute ce texte dans la nouvelle ligne du tableau
        let button = document.createElement('a');
        button.className = "risibank-image"; //Bouton Risibank
        button.title = "Ajouter un média RisiBank";
        button.onclick = function() {
            document.getElementById('AvatarAnimeeRisi').value = ''; // Vide la zone de texte
            openRisiBank(); //Ouvre Risibank si logo cliqué
            return false;
        };
        button.href = "javascript:void(0);"; //palce holder
        let img = document.createElement('img'); //apparence logo risibank
        img.src = "https://risibank.fr/logo.png";
        img.width = 30; // Width in pixels //apparence
        img.height = 30; //apparence
        button.appendChild(img);
        Text.appendChild(button);
        Case.append(Text);

        let Url = document.createElement('div'); //Prépare la case lien URL
        Url.className += "valeur";
        Case.appendChild(Url);

        let UrlInput = document.createElement('input');
        UrlInput.className = 'form-control';
        UrlInput.placeholder = "https://risibank.fr/cache/medias..."; //Création de la case URl avec texte exemple
        UrlInput.id = "AvatarAnimeeRisi";
        Url.append(UrlInput);

        const InputStyle = {

            margin: "0.4rem 0", //Apparance de la case URL
            color : "#000000",
        };

        Object.assign(UrlInput.style, InputStyle); //Donne l'apparance à la case URL

        let Visuel = document.createElement('span');
        let Img = document.createElement('img'); //Création d'une image carré permettant de prévisualiser le sticker
        Img.setAttribute('src', 'https://image.jeuxvideo.com/avatar-sm/default.jpg'); //apparance sans avatar
        Img.style.height = '50px'; //apparance
        Img.style.width = '50px';
        Img.style.borderColor = "#4a4c4f";
        Img.style.margin = "10px";
        Img.style.objectFit = "scale-down"; //apparance

        Visuel.appendChild(Img);
        Case.appendChild(Visuel);

        let VisuelCercle = document.createElement('span');
        let ImgCercle = document.createElement('img'); //Création d'une image circulaire permettant de prévisualiser le sticker
        ImgCercle.setAttribute('src', 'https://image.jeuxvideo.com/avatar-sm/default.jpg'); //apparance sans avatar
        ImgCercle.style.height = '50px'; //apparance
        ImgCercle.style.width = '50px';
        ImgCercle.style.borderColor = "#4a4c4f";
        ImgCercle.style.borderRadius = "50%"; //Rend l'image circulaire
        ImgCercle.style.margin = "10px";
        ImgCercle.style.objectFit = "cover"; //apparance

        VisuelCercle.appendChild(ImgCercle);
        Case.appendChild(VisuelCercle);

        let NewSignature = document.querySelector("#signature");
        let NewSignatureText = NewSignature.textContent; //Récupère le texte de la signature
        let NewTag = ""; //initialisation du code sticker en lien avec le script
        let TagEnd = 0; //Fin du code
        let TagStart = 0; //Début du code

        let Valider = document.createElement('span');
        let BoutonValidation = document.createElement('button'); //Création du bouton "valider"
        BoutonValidation.innerText = "Valider"; //Texte du bouton
        BoutonValidation.className = 'simpleButton';
        Valider.appendChild(BoutonValidation);
        Valider.style.margin = '50px'; //apparence
        Case.appendChild(Valider);

        // Efface l'integralite du champ si "RETOUR ARRIERE" ou "SUPPR" sont utilises.
        UrlInput.onkeydown = function() {
            if(event.key === "Backspace" || event.key === "Delete") {
                UrlInput.value = "";
                return false;
            }
        };

        // Selectionne l'URL complete lors d'un clic si l'utilisateur veut la remplacer.
        UrlInput.addEventListener("click", () => UrlInput.select());

        UrlInput.addEventListener("input", (event) => {
            //let paste = (event.clipboardData || window.clipboardData).getData("text");
            let paste = UrlInput.value;

            if(paste === "")
            {
                return;
            }

            Img.setAttribute("src", paste); //Previsualisation "Carre"
            ImgCercle.setAttribute("src", paste); //Previsualisation "Cercle"

            NewTag = paste;

            if (NewTag.includes('https://risibank.fr/cache/medias/')) {
                //lien_risibank
            } else {
                alert("L'url doit contenir le lien direct risibank \nExemple : https://risibank.fr/cache/medias/0/34/3493/349399/full.png"); //Message d'erreur si l'URL n'est pas un lien Risibank (Noelshack non accepté par exemple)
                window.location.reload(); //RéActualise la page
                return;
            }

            let FormatLetter = NewTag.at(NewTag.lastIndexOf(".") + 1); //Récupère la première lette de l'extension : G comme Gif par exemple
            TagEnd = NewTag.lastIndexOf("/"); //Fin du Tag dans le lien collé
            TagStart = NewTag.lastIndexOf("/", TagEnd - 2); // Début du tag dans le lien collé

            NewTag = NewTag.substring(TagStart + 1,TagEnd) + FormatLetter; //Le nouveau code = le Tag du sticker (=son id) + la lettre de format G comme gif
        });

        Url.addEventListener("keydown", ({key}) => { //Validation du sticker si touche entrer - Securite

            if (key === "Enter") {

                Validation();
            }
        });

        BoutonValidation.addEventListener("click", () => { //Validation du sticker si bouton "Valider"

                Validation();
        });

        document.getElementsByClassName("valider-modif-profil")[0].addEventListener("click", () => { //Validation du sticker si validation du formulaire

                Validation();
        });

        function Validation() {
            if (NewTag.trim() !== "") { // Contenue valide
                if (NewSignatureText.indexOf("{") != -1) { //Verifie la presence d'un Tag debutant par {
                    let Accolade1 = NewSignatureText.indexOf("{"); //Position de la première accolade
                    let Accolade2 = NewSignatureText.indexOf("}", Accolade1 + 1); //Positon de la deuxième accolade
                    if (Accolade2 != -1) { //Verifie la presence d'une seconde } (= fin du tag)
                        if (Accolade1 + 1 === Accolade2) { //acolade_vide
                            NewSignature.innerHTML = NewSignatureText.slice(0, Accolade1 + 1) + NewTag + NewSignatureText.slice(Accolade2); //Indique que les accolades sont vides et où ajouter le tag
                        } else {
                            NewSignature.innerHTML = NewSignatureText.replace(NewSignatureText.substring(Accolade1 + 1, Accolade2), NewTag); //Si un ancien tag existait, le remplace
                        }
                    }
                } else { // = Premier avatar custom
                    NewSignature.innerHTML = NewSignatureText + " {"+NewTag+"} "; //Si premier avatar animé, ajout du tag
                }
            } else {
                // Si NewTag est vide vire les acolades existante avec des caratere ou non
                NewSignature.innerHTML = NewSignatureText.replace(/\{[^}]*\}/g, '');
            }
        }
    }

    if (window.location.href.includes("profil")) { //Si Page Profil
        try {
            let ProfilSignatureElement = document.getElementsByClassName("bloc-signature-desc"); //Regarde la signature
            let ProfilSignature = ProfilSignatureElement[0].textContent; //Récupère le texte de la signature
            let ProfilTag = getTag(ProfilSignature); //Récupère le tag en signature si existant
            if (ProfilTag != "") {

                let NewProfilAvatarURL = tagToURL(ProfilTag); //Permet de convertir le tag en lien Risibank équivalent
                let ProfilAvatar = document.querySelector("#header-profil > div.content-img-avatar > img");
                ProfilAvatar.setAttribute("src", NewProfilAvatarURL); //Change l'avatar de la page profil avec l'avatar animé
                ProfilAvatar.setAttribute("data-src", ""); // Corrige le lazy load
            }
        } catch (error) {
            console.error("Pas de Valeur PP signature"); //Si pas de tag en signature -> Message d'erreur
        }
    }

    let SignatureList = document.querySelectorAll("div.signature-msg"); //Liste des signatures de la page
    SignatureList.forEach(function(valeur){

        let Signature = valeur.textContent; //Recupere le texte de la signature
        let Tag = getTag(Signature); //Récupère le tag si existant

        if (Tag != "")
        {

            let NewAvatarURL = tagToURL(Tag); //Permet de convertir le tag en lien Risibank équivalent
            let Avatar = valeur.closest("div.conteneur-message").children[0].children[0].children[0]; //Trouve l'avatar lié à la signature
            Avatar.setAttribute("src", NewAvatarURL); //Change l'avatar du post avec l'avatar animé
            Avatar.setAttribute("data-src", ""); //Corrige le lazy load

            let TagRemoved = valeur.innerHTML.replace("{"+Tag+"}",""); //Enleve Tag de la signature
            valeur.innerHTML = TagRemoved;

        }
    });

    function getTag(SignatureString)
    {
        let Tag = "";

        if (SignatureString.indexOf("{") != -1) //Verifie la presence d'un Tag debutant par {
        {

            let PremiereAccolade = SignatureString.indexOf("{");
            let DeuxiemeAccolade = SignatureString.indexOf("}", PremiereAccolade + 1);

            if (DeuxiemeAccolade != -1) //Verifie la presence d'une seconde } (= fin du tag)
            {
                Tag = SignatureString.substring(PremiereAccolade + 1, DeuxiemeAccolade); //Scan les chiffres entre les {}
            }
        }

        return Tag;
    }

    function tagToURL(TagString) //Permet d'obtenir le lien de l'image desiree à partir de son tag
    {

        let Tag = TagString;
        let URL = "/full."; //fin de l'URL avant format
        let Format = Tag.slice(-1).toLowerCase(); //Dernier caractere ( p pour PNG, j pour JPEG, g pour GIF,s pour SVG, b pour BMP, t pour TIFF) -> ajoute le format de l'image en fin d'URL
        let Length = Tag.length - 1;

        switch (Format) {

            case 'p':
                URL = URL + "png";
                break;
            case 'j':
                URL = URL + "jpeg";
                break;
            case 'g':
                URL = URL + "gif";
                break;
            case 's':
                URL = URL + "svg";
                break;
            case 'b':
                URL = URL + "bpm";
                break;
            case 't':
                URL = URL + "tiff";
                break;
            default:
                URL = URL + "gif";
                Length = Length + 1;
        }

        Tag = Tag.slice(0, Length); //enleve le dernier caractere du type de format
        URL = Tag + URL;

        for (var k = 1; k < 4; k++) //Reproduit la generation des URL de Risibank en partant du Tag (De droite vers la gauche) /!\ Pourrait devenir obsolete si les URL Risibank venaient à changer de https://risibank.fr/cache/medias/0/2/239/23942/full.png à https://risibank.fr/cache/medias/0/0/2/239/23942/full.png

        {
            Length = Length - 2;

            if (Length > 0)
            {
                URL = Tag.slice(0,Length) +"/"+ URL;
            }
            else{URL = "0/" + URL;}
        }

        URL = "https://risibank.fr/cache/medias/" + URL; //Debut de l'URL
        return URL;
    }

})();