// ==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 = `
`;
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'));
})();