Greasy Fork is available in English.
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;
}
})();