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.
当前为
// ==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;
}
})();