// ==UserScript== // @name Newfag detecor // @version 2.0 // @description Affiche l'ancienneté des pseudos qui le cachent // @author NocturneX // @match *://www.jeuxvideo.com/profil/*?mode=infos // @grant GM_xmlhttpRequest // @icon http://image.noelshack.com/fichiers/2017/15/1491900495-7.png // @connect api.jeuxvideo.com // @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 = Array.from(document.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 && /\/profil\/gta\.php\?id=([0-9]+)&/g.test(pictoAttention.dataset.selector)) { pseudoId = RegExp.$1.trim(); } if (!pseudoId) { throw new Error('Impossible de récupérer l\'id du pseudo'); } pseudoId = parseInt(pseudoId, 10); const createBloc = (html) => { const div = document.createElement('div'); div.classList.add('bloc-default-profil'); div.innerHTML = `

Newfag Detector

${html}
`; col.appendChild(div); }; const createBlocError = (message) => createBloc(`

${message || 'La date de création du pseudo n\'a pas pu être estimée.'}

`); const requestApiJvc = (url) => new Promise((resolve, reject) => { const timestamp = new Date().toISOString(); const method = 'GET'; const signature = CryptoJS.HmacSHA256(`550c04bf5cb2b\n${timestamp}\n${method}\napi.jeuxvideo.com\n/v3/${url}\n`, 'd84e9e5f191ea4ffc39c22d11c77dd6c'); const header = `PartnerKey=550c04bf5cb2b, Signature=${signature}, Timestamp=${timestamp}`; GM_xmlhttpRequest({ method, headers: { 'Jvc-Authorization': header, 'Content-Type': 'application/json', }, url: `https://api.jeuxvideo.com/v3/${url}`, onload: (response) => resolve(JSON.parse(response.responseText)), onerror: (response) => reject(response), }); }); if (pseudoId <= 2499961) { createBlocError('Ce pseudo a été créé avant le 16 février 2010.
La date exacte n\'a pas pu être estimée.'); return; } 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 && 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.toString().replace(/\B(?=(\d{3})+(?!\d))/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) { createBlocError(); throw new Error('Impossible de récupérer la date de création du pseudo avant'); } if (!dateAfter) { createBlocError(); 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); createBlocError(); return; } const nbDays = daysBetween(dateBefore, new Date()); createBloc(` `); }; const alertDanger = document.querySelector('#page-profil .alert.alert-danger'); if (alertDanger && alertDanger.textContent.trim() === 'Le pseudo est banni.') { setTimeout(() => { const jvcdvBody = document.querySelector('.jvcdv-body'); if (!jvcdvBody) return; let col = jvcdvBody.querySelector('.col-md-6'); if (!col) { col = document.createElement('div'); col.classList.add('col-md-6'); jvcdvBody.after(col); } searchAndDisplay(col); }, 2000); return; } searchAndDisplay(document.querySelector('#page-profil > .layout__content > .row > .col-md-6')); })();