« Fonctionnement technique de Jeuxvideo.com » : différence entre les versions

user: 23ec76d (?)
JvCare JS : at (ES 2022) au lieu de charAt
Edwado (discussion | contributions)
Nouveau : sous-domaines de Jeuxvideo.com, où on peut y trouver des choses parfois étranges.
 
(42 versions intermédiaires par 7 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
{{Bannière Info|Contenu=Co-rédacteur de l'[[API|article sur l'API de JVC]], j'aurais besoin de l'aide d'un khey calé sur l'API de JVC et/ou le fonctionnement technique de jeuxvideo.com. J'ai plusieurs questions à poser en vue de la réalisation d'un projet informatique. (Edwado si tu passes par là…)<br>
{{Bannière Incomplet}}


Merci de me contacter sur JVC (pseudo '''ContrapunctusI'''{{CDV|Pseudo=ContrapunctusI}}). Toute aide sera appréciée.}}
{{Bannière Info|Contenu=Cette page détaille le fonctionnement technique de jeuxvideo.com. L'API v4 du site est quant à elle documentée sur [[Documentation de l'API Jeuxvideo.com]].}}


== Introduction ==
== Introduction ==
Ligne 79 : Ligne 79 :


Comme dit précédemment, Respawn semble être un mélange de MVC et de code classique sans modèle particulier de respecté. Les fichiers du back-end sont également mitigés du côté de leur appellation, laissant encore droit au mélange entre Français et Anglais. Exemples de fichiers côté back-end :
Comme dit précédemment, Respawn semble être un mélange de MVC et de code classique sans modèle particulier de respecté. Les fichiers du back-end sont également mitigés du côté de leur appellation, laissant encore droit au mélange entre Français et Anglais. Exemples de fichiers côté back-end :
 
/opt/datas/JEUXVIDEO.COM/htdocs/forums/liste_topic.php<br>
''/opt/datas/JEUXVIDEO.COM/htdocs/forums/liste_topic.php''<br>
/opt/datas/JEUXVIDEO.COM/app/modeles/core/OiPDOStatement.php<br>
''/opt/datas/JEUXVIDEO.COM/app/modeles/core/OiPDOStatement.php''<br>
/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Transaction.php<br>
''/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Transaction.php''<br>
/opt/datas/JEUXVIDEO.COM/app/modeles/GoogleTagManager.php<br>
''/opt/datas/JEUXVIDEO.COM/app/modeles/GoogleTagManager.php''<br>
/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Compte.php<br>
''/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Compte.php''<br>
/opt/datas/JEUXVIDEO.COM/app/controllers/forum/liste_topic.php<br>
''/opt/datas/JEUXVIDEO.COM/app/controllers/forum/liste_topic.php''<br>
/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Session.php<br>
''/opt/datas/JEUXVIDEO.COM/app/modeles/sso/Session.php''<br>
/opt/datas/JEUXVIDEO.COM/app/vendor/...
''/opt/datas/JEUXVIDEO.COM/app/vendor/...''


=== Nommage des fonctions ===
=== Nommage des fonctions ===


Respawn possède aussi des fonctions dont le nommage est entre le Français et l'Anglais. Exemples de fonctions côté back-end :
Respawn possède aussi des fonctions dont le nommage est entre le Français et l'Anglais. Exemples de fonctions côté back-end :
 
getInfoFromIdForum<br>
''getInfoFromIdForum''<br>
loadMenu<br>
''loadMenu''<br>
checkMenuItem<br>
''checkMenuItem''<br>
getSingleton<br>
''getSingleton''<br>
getHtmlJeuForum<br>
''getHtmlJeuForum''<br>
blocHtmlBoutiqueRandom
''blocHtmlBoutiqueRandom''


=== Optimisations ===
=== Optimisations ===
Ligne 134 : Ligne 132 :
=== Recherche des forums ===
=== Recherche des forums ===


La recherche des forums utilise le moteur de recherche Sphinx qui est intégré au site. La recherche des forums est limitée à 1 mois sur les blablas, elle peut être contournée via https://jvarchive.com/.
La recherche des forums utilise le moteur de recherche Sphinx qui est intégré au site. La recherche des forums est limitée à 1 mois sur les blablas, elle peut être contournée via https://jvarchive.net/.


=== Sécurité informatique ===
=== Sécurité informatique ===
Ligne 162 : Ligne 160 :
==== JavaScript ====
==== JavaScript ====


  function jvCake(classe) {
  function jvCare(classe) {
   const base16 = '0A12B34C56D78E9F';
   const base16 = '0A12B34C56D78E9F';
   let lien = <nowiki>''</nowiki>;
   let lien = <nowiki>''</nowiki>;
Ligne 170 : Ligne 168 :
   }
   }
   return lien;
   return lien;
}
===== Fonctionnel =====
function jvCake(classe) {
  const base16 = '0A12B34C56D78E9F';
  const s = classe.split(' ')[1];
  const codeUnits = s
    .match(/../g)
    .map((i) => base16.indexOf(i[0]) * 16 + base16.indexOf(i[1]));
  return String.fromCharCode(...codeUnits);
  }
  }


Ligne 227 : Ligne 236 :
== Phoenix ==
== Phoenix ==


Phoenix est une partie de JVC développée en Node.js et utilisant React. Elle semble de plus en plus abandonnée, et nous n'avons pas beaucoup d'informations à son sujet. Phoenix utilise une API spéciale hébergée au sous-domaine [[Documentation_de_l%27API_Jeuxvideo.com#API_jvc.gg|''api.jvc.gg'']].
Phoenix était une partie de JVC développée en Node.js et utilisant React. De plus en plus abandonnée au fil du temps, elle était utilisée pour afficher la liste des jeux et des contenus de la rédaction. Phoenix utilisait une API spéciale hébergée au sous-domaine [[Documentation_de_l%27API_Jeuxvideo.com#API_jvc.gg|''api.jvc.gg'']]. Phoenix ainsi que l'API GG disparaissent en février 2025 et les pages qu'elles servaient sont basculées vers la partie principale du site <ref>https://www.jeuxvideo.com/forums/message/1297456370</ref>.
 
== Passage en React==
 
'''Fin mai 2025,''' jvc commence à se baser pour certaines parties du site sur la librairie [https://fr.wikipedia.org/wiki/React React] , ce qui a une grosse influence sur les [[Script|userscripts]] .
 
Insérer du texte manuellement, ne marche plus :
 
<s>messageTextArea.value = message;</s>
 
Heureusement, il existe '''un astuce très utilisée''' sur le web pour contourner ce soucis.<br>Voilà une variante de cette méthode fournie dans le code de JVChat d'après ce [https://www.jeuxvideo.com/forums/message/1286139785 message] :
 
function fonctionReact(textarea, value) {
    const prototype = Object.getPrototypeOf(textarea);
    const nativeSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;
    nativeSetter.call(textarea, value);
    textarea.dispatchEvent(new Event('input', { bubbles: true }));
}
 
Ensuite, il suffit simplement de faire appel à cette fonction quand on doit remplir une zone de texte :
 
fonctionReact(messageTextArea, message);
 
En 1er on donne la zone de texte ciblée et en 2nd le texte à insérer.
 
Pour simplifier, <code><span style="color:red;">messageTextArea</span>.value = <span style="color:green;">message</span>;</code> devient <code>fonctionReact(<span style="color:red;">messageTextArea</span>, <span style="color:green;">message</span>);</code> avec cette fonction.
 
 
Fonction de '''dernier recours'''  (+ bas niveau : API DOM / Simule une vrai entrée clavier) '''à éviter''' ⚠️ sauf si la première méthode est bloquée :


== Liens externes ==
function fonctionReact(textarea, value) {
    textarea.setRangeText(value, 0, textarea.value.length, "end");
    textarea.dispatchEvent(new Event("input", { bubbles: true }));
}
=== Fonction officielle JVC===
 
Par ailleurs, en dehors de cette méthode, JVC a proposé une entrée native pour interagir directement avec REACT :<br>
<code>jvc.getMessageEditor();</code> (C'est une entrée partielle, pour réaliser des fonctions officielles du site.)
 
https://www.jeuxvideo.com/forums/message/1286112457
 
jvc.getMessageEditor(".class").insertText(`mon texte`);  // Place du texte à l'endroit sur le focus
jvc.getMessageEditor(".class").insertStartLine(`mon texte`); // Place du texte en début de ligne.
jvc.getMessageEditor(".class").selectedText; // Récupérer la sélection utilisateur.
 
PS : Pour garantir le bon fonctionnement, utilisez simplement <code>jvc.getMessageEditor();</code> et/ou <code>unsafeWindow.jvc.getMessageEditor();</code> <ref>Les userscripts sont exécutés dans un environnement isolé (appelé sandbox), ce qui empêche parfois l’accès direct aux objets définis dans le contexte global de la page, comme "window" .</ref>. <br>
 
Il est nécessaire de faire appel à <code>jvc.getMessageEditor();</code> à chaque modification, sinon vous travaillerez avec une version antérieure.
 
Cette fonction prend directement en compte des sélecteurs CSS et pas des éléments, exemple :
 
let selector = "#message_topic";
jvc.getMessageEditor(selector).insertText('text'); //✅ Marche
 
let selector = document.getElementById("message_topic");
jvc.getMessageEditor(selector).insertText('text'); //❌ Ne marche pas
 
 
Cependant, cette fonction présente plusieurs avantages notables : elle est à la fois native à JVC et intégrée au fonctionnement de React.
 
De plus, contrairement à une modification directe du champ texte via JavaScript, cette fonction ne nécessite aucune gestion manuelle du curseur, de la sélection ou des espaces, tout est automatiquement pris en charge par la fonction elle-même.
 
En revanche, pour manipuler le champ entièrement (suppression, remplacement) {{fleched}} la fonction a moins d'intérêt.<br>
De plus, elle ne fonctionne que sur JVC, et ce n'est pas une fonction JavaScript universelle, contrairement à la précédente.
 
== Opps! ==
 
Jeuxvideo.com peut afficher des erreurs du type "Opps!", ce qui a valu la création d'un [[délire]] et même d'un [[smiley]] officiel.
 
Le 7 mars 2026, un forumeur écrit avoir reçu le message ci-dessous lors d'un ''downtime'' du site :
'''ERROR: PL/Proxy function public.get_nb_previous_message(3): [forums6] PQconnectPoll: connection to server at "10.142.5.26", port 5432 failed: FATAL: remaining connection slots are reserved for non-replication superuser connections'''
Ce message indique plusieurs choses :
 
* Jeuxvideo.com utilise la plage 10.0.0.0/8 côté infrastructure, ce qui est très courant dans les entreprises,
* PostgreSQL est toujours le moteur de base de données utilisé pour les accès au site,
* Une table nommée "get_nb_previous_message" existe. Son intérêt est pour le moment inconnu.
* Les connexions à PostgreSQL ne sont pas fermées, ce qui est un usage courant sur les sites Internet, afin d'éviter de se connecter en boucle à PostgreSQL et brider les délais d'affichage des pages.
En revanche, il est totalement inconnu de la façon d'où cet utilisateur a eu le pouvoir de voir ce message, réservé à l'équipe technique. Il est possible que le proxy de première instance ai confondu une IPv4 source avec celle d'un utilisateur de l'équipe technique, mais ce n'est qu'une hypothèse.
 
== Plages réseau ==
 
Certains sites permettent d'afficher des informations administratives et techniques sur le fonctionnement de Webedia et de Jeuxvideo.com, notamment du côté du partitionnement des plages IP.
 
D'après https://nextly.net/search?text=Webedia :


* [http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml Interview sur l’architecture de jeuxvideo.com de 1997 à 2005] ([http://web.archive.org/web/20070629165914/http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml archive.org])
* Webedia possède des plages IP très larges, partant côté IPv4, du /24, jusqu'à un grand nombre de /22. Le prix à la revente dépasse les 100 000€, au minimum.
* Étrangement, Webedia possède énormément de plages IPv6, notamment des /32 et /29. Ces plages sont totalement inutiles et polluent les bases RIPE, sachant que Jeuxvideo.com désactive IPv6 de base, et utilise les plages Cloudflare pour les accès IPv4.
* Des blocs IPv4 /29 (donc non routables via BGP) ont été assignés auprès de Webedia, apparemment via le transitaire/FAI Zayo. L'usage est inconnu pour le moment.


== Notes ==
D'autre part, il est à noter que Webedia migre doucement son infrastructure sur Google Cloud. De fait, les plages seront sûrement revendues à bon prix.


<references />
== Sous-domaines ==


== Voir aussi ==
*.preprod.jeuxvideo.com
*.qa.jeuxvideo.com
*.stg.jeuxvideo.com
actu.jeuxvideo.com
api.jeuxvideo.com
api.stg.jeuxvideo.com
bryce.jeuxvideo.com
image.jeuxvideo.com
image.stg.jeuxvideo.com
jump.jeuxvideo.com
jump.stg.jeuxvideo.com
l.jeuxvideo.com
liens.accueil.jeuxvideo.com
liens.bonsplans.jeuxvideo.com
liens.newsletters.jeuxvideo.com
m.jeuxvideo.com
m.preprod.jeuxvideo.com
m.stg.jeuxvideo.com
mta-sts.jeuxvideo.com
play.jeuxvideo.com
preprod.jeuxvideo.com
psnstore.jeuxvideo.com
rabbitmq.jeuxvideo.com
rabbitmq.stg.jeuxvideo.com
static.preprod.jeuxvideo.com
static.stg.jeuxvideo.com
stg.jeuxvideo.com
update.jeuxvideo.com
utiq.jeuxvideo.com
video.jeuxvideo.com
video.stg.jeuxvideo.com
ww.jeuxvideo.com
www.jeuxvideo.com
www.preprod.jeuxvideo.com
www.stg.jeuxvideo.com
wwww.jeuxvideo.com
wwwww.jeuxvideo.com


* [[Documentation de l'API Jeuxvideo.com]]
== Liens externes ==
*[http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml Interview sur l’architecture de jeuxvideo.com de 1997 à 2005] ([http://web.archive.org/web/20070629165914/http://www.journaldunet.com/solutions/itws/050426_it_jeuxvideo.shtml archive.org])
 
==Voir aussi==
 
*[[Documentation de l'API Jeuxvideo.com]]


{{SectionRéférences}}
{{SectionRéférences}}
{{TableauCatégorieFonctionnementJVC}}
{{TableauCatégorieFonctionnementJVC}}
[[Catégorie:Fonctionnement technique de Jeuxvideo.com]]
[[Catégorie:Fonctionnement technique de Jeuxvideo.com]]
[[Catégorie:Extensions et outils]]
[[Catégorie:Extensions et outils]]