SmileyAllTable

Affiche les smiley manquants sur la table des smileys

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         SmileyAllTable
// @author       Atlantis
// @namespace    SmileyAllTable
// @description  Affiche les smiley manquants sur la table des smileys
// @match        https://www.jeuxvideo.com/messages-prives/nouveau.php*
// @match        https://www.jeuxvideo.com/messages-prives/message.php*
// @match        https://www.jeuxvideo.com/forums/42-*
// @match        https://www.jeuxvideo.com/forums/1-*
// @match        https://www.jeuxvideo.com/forums/0-*
// @version      3.2.0
// @icon         https://image.jeuxvideo.com/smileys_img/11.gif
// @grant        none
// @license      MIT
// ==/UserScript==


//Poll_Wait_React
let attempt = 0;
(function check() {
    const node = document.querySelector('.messageEditor__containerEdit');
    if (node) main();
    else if (++attempt < 6) setTimeout(check, 500);
})();


// Position curseur mémorisée au clic
let lastCursorPosition;

// Associer le gestionnaire d'événements au bouton smiley
function main() {
    const buttonSmileys = document.querySelector('.jvcode-smiley').parentElement;
    buttonSmileys.addEventListener('click', () => {
        const textarea = [...document.querySelectorAll('.messageEditor__edit')].pop();
        lastCursorPosition = textarea.selectionStart;
        waitForSmileyPanel();
    });
}

// Boucle pour détecter le panneau smiley
let tryPannel = 0;
function waitForSmileyPanel() {
    const panel = document.querySelector('.smileys__modal');
    if (panel) {
        handleSmileyPanel();
        tryPannel = 0;
    } else if (++ tryPannel < 10) {
        setTimeout(waitForSmileyPanel, 30);
    }
}


// Remplacement des smileys (classe .smileys__add pour ajouter la logique javascript)
function handleSmileyPanel() {
    const smileysTable = document.querySelector(".smileys__modal .smileys__table");
    smileysTable.querySelector("tr:nth-child(5)").insertAdjacentHTML("afterend", `
      <tr>
        <td class="smileys__cell">
            <img class="smileys__img smileys__add" data-code=":hapoelparty:" src="//image.jeuxvideo.com/smileys_img/hapoelparty.gif" width="45" height="27">
        </td>
        <td class="smileys__cell">:hapoelparty:</td>
        <td class="smileys__cell">
            <img class="smileys__img smileys__add" data-code=":loveyou:" src="//image.jeuxvideo.com/smileys_img/loveyou.gif" width="64" height="30">
        </td>
        <td class="smileys__cell">:loveyou:</td>
        <td class="smileys__cell">
            <img class="smileys__img smileys__add" data-code=":opps:" src="//image.jeuxvideo.com/smileys_img/opps.gif" width="16" height="16">
        </td>
        <td class="smileys__cell">:opps:</td>
        <td class="smileys__cell">
            <img class="smileys__img smileys__add" data-code=":fish:" src="//image.jeuxvideo.com/smileys_img/fish.png" width="16" height="16">
        </td>
        <td class="smileys__cell">:fish:</td>
      </tr>
    `);

    smileysTable.querySelector("tr:last-child").outerHTML = `
      <tr>
        <td class="smileys__cell">
           <img class="smileys__img smileys__add" data-code=":siffle:" src="//image.jeuxvideo.com/smileys_img/siffle.gif" width="22" height="16">
        </td>
        <td class="smileys__cell">:siffle:</td>
        <td class="smileys__cell">
           <img class="smileys__img smileys__add" data-code=":opps:" src="//image.jeuxvideo.com/smileys_img/opps.gif" width="16" height="16">
           </td>
        <td class="smileys__cell">:opps:</td>
        <td class="smileys__cell">
            <img class="smileys__img smileys__add" data-code=":mac:" src="//image.jeuxvideo.com/smileys_img/16.gif" width="16" height="16">
        </td>
        <td class="smileys__cell">:mac:</td>
        <td class="smileys__cell">
            <img class="smileys__img smileys__add" data-code=":globe:" src="//image.jeuxvideo.com/smileys_img/6.gif" width="16" height="16">
        </td>
        <td class="smileys__cell">:globe:</td>
      </tr>
    `;
    //Listener JS
    for (const img of smileysTable.querySelectorAll(".smileys__img.smileys__add")) {
        img.addEventListener("click", (e) => {
            //e.stopPropagation(); e.preventDefault();

            //Fonction JVC (si jvc l'enleve => décommenter le bloc du dessous c'est un insert classic JS React)
            const apiJvc = typeof jvc !== "undefined" ? jvc : unsafeWindow.jvc;
            apiJvc.getMessageEditor('.container__post .messageEditor__edit, #message').insertText(` ${img.dataset.code} `);
            //

            /* REACT FALLBACK NATIVE JS
            const textarea = [...document.querySelectorAll('.messageEditor__edit')].pop();
            insertTextAtCursor(textarea, ` ${img.dataset.code} `);
            */

            // Fermeture modal
            document.querySelector('.smileys__modal .modalWrapper__close')?.click();
        });
    }
}

//  Insertion texte à la position mémorisée
function insertTextAtCursor(textarea, text) {

    //Insert Text
    const start = lastCursorPosition;
    const end = lastCursorPosition;
    const before = textarea.value.substring(0, start);
    const after = textarea.value.substring(end);
    const message = before + text + after;

    //React Write
    const prototype = Object.getPrototypeOf(textarea);
    const nativeSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;
    nativeSetter.call(textarea, message);
    textarea.dispatchEvent(new Event('input', { bubbles: true }));

    //Replace Cursor
    /*
    const newPos = start + text.length;
    textarea.selectionStart = newPos;
    textarea.selectionEnd = newPos;
    */
    textarea.selectionStart = textarea.value.length;
    textarea.focus();
}