Risibank Avatar

Offre la possibilité d'ajouter un avatar animé (GIF) dans les paramètres de profil JVC (Fonctionne aussi avec des images fixes) aux yeux des utilisateurs de ce script.

当前为 2024-08-19 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Risibank Avatar
// @namespace    http://tampermonkey.net/
// @version      2024-09.v0.0.8
// @description  Offre la possibilité d'ajouter un avatar animé (GIF) dans les paramètres 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';

    if (window.location.href.includes("https://www.jeuxvideo.com/sso/infos_pseudo.php?id=")) //Paramètres du profil -> Ajout de la ligne "Ajouter un avatar animé :" avec prévisualisation
    {

        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("Ajouter un avatar animé : ")); //Ajoute ce texte dans la nouvelle ligne du tableau
        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
        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);


        Url.addEventListener("paste", (event) => { //Lorsqu'il y a un "coller" dans la zone URl
            let paste = (event.clipboardData || window.clipboardData).getData("text");

            Img.setAttribute("src", paste); //Affiche la Prévisualisation "Carré"
            ImgCercle.setAttribute("src", paste); //Affiche la Prévisualisation "Cercle"

            NewTag = paste; //URl copiée sur Risibank

            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
            }

            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 - Sécurité

            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) { //Vérifie la présence d'un Tag débutant 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) { //Vérifie la présence 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; //Récupère 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+"}",""); //Enlève Tag de la signature
            valeur.innerHTML = TagRemoved;

        }
    });

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

        if (SignatureString.indexOf("{") != -1) //Vérifie la présence d'un Tag débutant par {
        {

            let PremièreAccolade = SignatureString.indexOf("{");
            let DeuxièmeAccolade = SignatureString.indexOf("}", PremièreAccolade + 1);

            if (DeuxièmeAccolade != -1) //Vérifie la présence d'une seconde } (= fin du tag)
            {
                Tag = SignatureString.substring(PremièreAccolade + 1, DeuxièmeAccolade); //Scan les chiffres entre les {}
            }
        }

        return Tag;
    }

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

        let Tag = TagString;
        let URL = "/full."; //fin de l'URL avant format
        let Format = Tag.slice(-1).toLowerCase(); //Dernier caractère ( 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); //enlève le dernier caractère du type de format
        URL = Tag + URL;

        for (var k = 1; k < 4; k++) //Reproduit la génération des URL de Risibank en partant du Tag (De droite vers la gauche) /!\ Pourrait devenir obsolète 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; //Début de l'URL
        return URL;
    }

})();