// ==UserScript==
// @name JVChat Premium
// @description Outil de discussion instantanée pour les forums de Jeuxvideo.com
// @author Blaff
// @namespace JVChatPremium
// @version 0.1.14
// @match http://*.jeuxvideo.com/forums/42-*
// @match https://*.jeuxvideo.com/forums/42-*
// @match http://*.jeuxvideo.com/forums/1-*
// @match https://*.jeuxvideo.com/forums/1-*
// @grant none
// @downloadURL none
// ==/UserScript==
/*
ROADMAP:
- Smooth transition on append messages + Fade-in
- Détection captcha
- Si la page retournée vaut 1: bug des messages supprimés, donc on essaye avec la page d'avant, idem s'il y a 0 messages sur la page
- Bouton actualiser les messages (+ afficher le delai courrant d'actualisation)
- Bouton désactiver JVChat
- Bouton retour liste des sujets
- Citations
- Notification avec @pseudo
- Blacklist
- Pouvoir voir les anciens messages
- La leftbar ne se rétrécie pas si le titre du topic n'a pas d'espaces
*/
let CSS = ``;
let PANEL = `
Profil
Topic
`;
function getForm(doc) {
return doc.getElementsByClassName('form-post-message')[0];
}
let freshForm = getForm(document);
let firstMessageId = undefined;
let allMessagesId = new Set();
let userConnected = undefined;
let updateIntervals = [2, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 30, 30, 30, 30, 30, 30, 30, 30, 60];
let transisitions = [0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 19, 19, 19, 19, 19, 19, 19, 19, 31];
let updateIntervalIdx = 0;
let updateIntervalMax = updateIntervals.length - 1;
let isLocked = false;
let isError = false;
let isReduced = true;
let storageKey = "jvchat-premium-default-reduced";
let nbNewMessage = 0;
let favicon = makeFavicon();
function getTopicLocked(elem) {
let lock = elem.getElementsByClassName("message-lock-topic")[0];
if (lock === undefined) {
return lock;
}
let reason = lock.getElementsByTagName("span")[0].textContent.trim();
return `Le topic a été vérouillé pour la raison suivante : "${reason}"`;
}
function getTopicError(elem) {
let error = elem.getElementsByClassName("img-erreur")[0];
if (error === undefined) {
return error;
}
return `Le topic présente une erreur: ${error.getAttribute("alt")}`;
}
function tryCatch(func) {
function wrapped(optArg) {
try {
func(optArg);
} catch(err) {
let message = `Une erreur est survenue dans JVChat Premium: '${err.message}' (line ${err.lineNumber})`;
console.error(message);
try {
addAlertbox("danger", message);
} catch(e) {
alert(message);
}
}
}
return wrapped;
}
function toggleTextarea() {
let isDown = isScrollDown();
document.getElementById("bloc-formulaire-forum").getElementsByClassName("jv-editor-toolbar")[0].classList.toggle("jvchat-hide");
document.getElementById("jvchat-enlarge").classList.toggle("jvchat-hide");
document.getElementById("jvchat-reduce").classList.toggle("jvchat-hide");
document.getElementById("jvchat-post").classList.toggle("jvchat-hide");
document.getElementById("bloc-formulaire-forum").classList.toggle("jvchat-reduced");
isReduced = !isReduced;
localStorage.setItem(storageKey, isReduced);
setTextareaHeight();
if (isDown) {
setScrollDown();
}
}
function parseURL(url) {
let regex = /^(.*?)(\/\d+-\d+-\d+-)(\d+)(-\d+-\d+-\d+-)(.*?)(\.htm)(.*)$/i;
let [_, domain, ids, page, nums, title, htm, anchor] = url.match(regex);
return {domain: domain, ids: ids, page: page, nums: nums, title: title, htm: htm, anchor: anchor};
}
function buildURL(dict) {
return `${dict.domain}${dict.ids}${dict.page}${dict.nums}${dict.title}${dict.htm}${dict.anchor}`;
}
function getLastPage(document) {
let blocPages = document.getElementsByClassName("bloc-liste-num-page")[0];
let spans = blocPages.getElementsByTagName("span");
let lastPage = 1;
for (let span of spans) {
let page = parseInt(span.textContent.trim());
if (!isNaN(page) && page > lastPage) {
lastPage = page;
}
}
return lastPage;
}
function parseMessage(elem) {
let author = elem.getElementsByClassName("bloc-pseudo-msg")[0].textContent.trim();
let avatar = elem.getElementsByClassName("user-avatar-msg")[0];
if (avatar !== undefined) {
avatar = avatar.getAttribute("data-srcset");
}
let date = elem.getElementsByClassName("bloc-date-msg")[0].textContent.trim();
let content = fixMessage(elem.getElementsByClassName("text-enrichi-forum")[0]);
let id = parseInt(elem.getAttribute("data-id"));
return {author: author, date: date, avatar: avatar, id: id, content: content};
}
function parseUserInfo(elem) {
let mpBox = elem.getElementsByClassName("jv-account-number-mp")[0];
if (mpBox === undefined) {
return undefined;
}
let notifBox = elem.getElementsByClassName("jv-account-number-notif")[0];
let avatarBox = elem.getElementsByClassName("account-avatar-box")[0];
let authorBox = elem.getElementsByClassName("account-pseudo")[0];
let mp = parseInt(mpBox.getAttribute("data-val"));
let notif = parseInt(notifBox.getAttribute("data-val"));
let avatar = avatarBox.style["background-image"].slice(5, -2).replace("/avatar-md/", "/avatar/");
let author = authorBox.textContent.trim();
return {author: author, avatar: avatar, mp: mp, notif: notif};
}
function parseTopicInfo(elem) {
let title = elem.querySelector("#bloc-title-forum").textContent.trim();
let connected = parseInt(elem.getElementsByClassName("nb-connect-fofo")[0].textContent.trim());
let lastPage = getLastPage(elem);
let pageActive = elem.getElementsByClassName("page-active")[0];
let page = 1;
if (pageActive !== undefined) {
page = parseInt(pageActive.textContent.trim());
}
return {title: title, connected: connected, lastPage: lastPage, page: page};
}
function fixMessage(elem) {
let jvcares = Array.from(elem.getElementsByClassName("JvCare"));
for (let jvcare of jvcares) {
let a = document.createElement("a");
a.setAttribute("target", "_blank");
a.setAttribute("href", jvCake(jvcare.getAttribute("class")));
a.innerHTML = jvcare.innerHTML;
jvcare.outerHTML = a.outerHTML;
}
return elem;
}
function jvCake(cls) {
let base16 = '0A12B34C56D78E9F', lien = '', s = cls.split(' ')[1];
for (let i = 0; i < s.length; i += 2) {
lien += String.fromCharCode(base16.indexOf(s.charAt(i)) * 16 + base16.indexOf(s.charAt(i + 1)));
}
return lien;
}
function clearPage(document) {
let buttons = `
`;
document.head.insertAdjacentHTML("beforeend", CSS);
let messageTopic = document.getElementById("message_topic");
if (messageTopic) {
messageTopic.setAttribute("placeholder", "Hop hop hop, le message ne va pas s'écrire tout seul !");
messageTopic.insertAdjacentHTML("afterend", buttons);
messageTopic.addEventListener("keydown", tryCatch(postMessageIfEnter));
document.getElementById("jvchat-post").addEventListener("click", tryCatch(postMessage));
document.getElementById("jvchat-enlarge").addEventListener("click", tryCatch(toggleTextarea));
document.getElementById("jvchat-reduce").addEventListener("click", tryCatch(toggleTextarea));
}
document.getElementsByClassName("conteneur-messages-pagi")[0].insertAdjacentHTML("afterbegin", "