Affiche les smiley manquants sur la table des smileys
// ==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.0.0
// @icon https://image.jeuxvideo.com/smileys_img/11.gif
// @grant none
// @license MIT
// ==/UserScript==
//ATTENDRE_LE_REACT_A_LARRACHE
let tentatives = 0;
(function check() {
const el = document.querySelector('.messageEditor__containerEdit');
if (el) {
main();
} else if (++tentatives < 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();
}