// ==UserScript== // @name Newfag detecor // @version 3.3.3 // @description Affiche l'ancienneté des pseudos qui le cachent // @author NocturneX // @match *://www.jeuxvideo.com/profil/*?mode=infos // @grant GM_xmlhttpRequest // @grant GM.xmlHttpRequest // @icon http://image.noelshack.com/fichiers/2017/15/1491900495-7.png // @connect api.jeuxvideo.com // @downloadURL https://raw.githubusercontent.com/Lantea-Git/nocturex_script/main/newfag_detector.user.js // @updateURL https://raw.githubusercontent.com/Lantea-Git/nocturex_script/main/newfag_detector.user.js // @require https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js // ==/UserScript== (() => { if (document.querySelector('.img-erreur')) return; const searchAndDisplay = async (col) => { const alreadyDisplayed = [...col.querySelectorAll('.info-lib')].find((div) => div.textContent.trim() === 'Membre depuis :'); if (alreadyDisplayed) return; const bell = document.querySelector('#header-profil .icon-bell-off'); const pictoAttention = document.querySelector('#header-profil .icon-report-problem'); let pseudoId; if (bell) { pseudoId = bell.dataset.id; } else if (pictoAttention) { pseudoId = pictoAttention.dataset.url.match(/id=(\d+)/)?.[1]; } if (!pseudoId) { throw new Error('Impossible de récupérer l\'id du pseudo'); } pseudoId = parseInt(pseudoId, 10); const bloc = document.createElement('div'); bloc.classList.add('bloc-default-profil'); bloc.innerHTML = `

Newfag Detector

`; col.firstElementChild ? col.firstElementChild.after(bloc) : col.append(bloc); // Injecte le contenu html const updateBloc = (html) => (bloc.querySelector('.info-value').innerHTML = html); const updateBlocError = (message) => updateBloc(`${message || 'La date de création du pseudo n\'a pas pu être estimée.'}`); if (pseudoId <= 2499961) { updateBlocError('Ce pseudo a été créé avant le 16 février 2010.
La date exacte ne peut pas être estimée.'); return; } // Blocage de la fonction le temps que les conditions d'affichage soient résolues. await new Promise(forceShowDate => { //Switch Auto Manual bloc.querySelector('#toggle-date')?.addEventListener('click', () => { let autoDisplayDate = localStorage.getItem('new_fag_auto') === 'true'; if (!confirm(`${autoDisplayDate ? 'Ne plus afficher' : 'Afficher'} systématiquement la date ?`)) return; localStorage.setItem('new_fag_auto', (!autoDisplayDate).toString()); // Toggle forceShowDate(); }); //Affichage Auto if (localStorage.getItem('new_fag_auto') === 'true') return forceShowDate(); //Affichage Manuel bloc.querySelector('#voir-date').addEventListener('mouseover', forceShowDate, { once: true }); }); updateBloc(`Newfag Detector cherche ...`); const requestApiJvc = (url) => new Promise((resolve, reject) => { const partnerKey = '550c04bf5cb2b', hmacSec = 'd84e9e5f191ea4ffc39c22d11c77dd6c'; const timestamp = new Date().toISOString(), method = 'GET'; const apiVersion = 'v4' //passer à 'v5' si ça ne marche pas const signature = CryptoJS.HmacSHA256(`${partnerKey}\n${timestamp}\n${method}\napi.jeuxvideo.com\n/${apiVersion}/${url}\n`, hmacSec); const header = `PartnerKey=${partnerKey}, Signature=${signature}, Timestamp=${timestamp}`; (typeof GM_xmlhttpRequest === 'function' ? GM_xmlhttpRequest : GM?.xmlHttpRequest)?.({ method, headers: { 'Jvc-Authorization': header, 'Content-Type': 'application/json', }, url: `https://api.jeuxvideo.com/${apiVersion}/${url}`, onload: (response) => resolve(JSON.parse(response.responseText)), onerror: (response) => reject(response), }); }); const searchDate = async (direction) => { const maxTry = 20; let date = null; for (let i = 1; i <= maxTry; i += 1) { try { const id = pseudoId + (i * direction); console.log('Newfag Detector: Requête le pseudo n°', id); const profile = await requestApiJvc(`accounts/${id}/profile`); if (profile.info?.creationDate) { date = new Date(profile.info.creationDate); console.log('Newfag Detector: Date trouvée', date, 'pour le pseudo', id, profile.alias); break; } } catch (e) { console.log('Newfag Detector: Erreur requête', e); } } return date; }; const daysBetween = (date1, date2) => Math.round(Math.abs((date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000))); const displayNumber = (number) => number.toLocaleString("fr-FR").replace(/\s+/g, "."); const displayDate = (date) => new Date(date) .toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric', }); const dateBefore = await searchDate(-1); const dateAfter = await searchDate(1); if (!dateBefore) { updateBlocError(); throw new Error('Impossible de récupérer la date de création du pseudo avant'); } if (!dateAfter) { updateBlocError(); throw new Error('Impossible de récupérer la date de création du pseudo après'); } const dateBeforeFormated = displayDate(dateBefore); const dateAfterFormated = displayDate(dateAfter); if (dateBeforeFormated !== dateAfterFormated) { console.log('Newfag Detector: Les deux dates ne correspondent pas', dateBeforeFormated, dateAfterFormated); updateBlocError(`Ce pseudo a été créé entre
Le ${dateBeforeFormated} et le ${dateAfterFormated}.
Le jour exact ne peut pas être estimé.`); return; } const nbDays = daysBetween(dateBefore, new Date()); updateBloc(`${dateBeforeFormated} (${displayNumber(nbDays)} jours)`); }; const alertDanger = document.querySelector('#page-profil .alert.alert-danger'); if (alertDanger?.textContent.trim() === 'Le pseudo est banni.') { setTimeout(() => { const jvCdvBody = document.querySelector('.jvcdv-body') || alertDanger.parentNode; //JVCDV 2 non mis à jour if (!jvCdvBody) return; let col = jvCdvBody.querySelector('.col-lg-6, .col-md-6'); //MD JVCDV 2 non mis à jour if (!col) { col = document.createElement('div'); col.classList.add('col-lg-6'); jvCdvBody.after(col); } searchAndDisplay(col); }, 2000); return; } searchAndDisplay(document.querySelector('#page-profil > .layout__content > .row > .col-lg-6')); })();