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

user: cb25c7e (?)
Passage en React : Explication de la fonction malgré son aspect propriétaire elle a des simplifications très importantes dans certains cas elle simplifie énormément le travail elle est cependant plus limitée et nécessite un appel à chaque fois
Edwado (discussion | contributions)
Nouveau : sous-domaines de Jeuxvideo.com, où on peut y trouver des choses parfois étranges.
 
(29 versions intermédiaires par 4 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
{{Bannière Incomplet}}
{{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]].}}
{{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]].}}


Ligne 77 : 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 132 : 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 160 : 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 246 : Ligne 246 :
<s>messageTextArea.value = message;</s>
<s>messageTextArea.value = message;</s>


Il faut simuler le changement pour React, Il existe pour cela '''une fonction très utilisée''' sur le web :  
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) {
  function fonctionReact(textarea, value) {
     const prototype = Object.getPrototypeOf(textarea);
     const prototype = Object.getPrototypeOf(textarea);
     const nativeSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;
     const nativeSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;
Ligne 255 : Ligne 255 :
  }
  }


Ensuite il faut faire appel à cette fonction :
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.


fonctionreact(messageTextArea, message);
En 1er on donne l'ID de la zone de texte 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 :


=== Fonction officielle JVC ===
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.
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
https://www.jeuxvideo.com/forums/message/1286112457


  let editor = jvc.getMessageEditor('#bloc-formulaire-forum #message_topic'); //selectionner la zone de texte
  jvc.getMessageEditor(".class").insertText(`mon texte`); // Place du texte à l'endroit sur le focus
if (null !== editor) {
jvc.getMessageEditor(".class").insertStartLine(`mon texte`); // Place du texte en début de ligne.
    editor.insertText(`mon texte`); //pour insérer du texte à un endroit précis.
  jvc.getMessageEditor(".class").selectedText; // Récupérer la sélection utilisateur.
    editor.insertStartLine(`mon texte`); //insérer du texte en debut de ligne.
 
  }
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.


Important il faut retirer la variable "windows" devant la fonction "jvc" .
Cette fonction prend directement en compte des sélecteurs CSS et pas des éléments, exemple :


Cette fonction prend directement en compte des sélecteurs CSS, exemple :
let selector = "#message_topic";
jvc.getMessageEditor(selector).insertText('text'); //✅ Marche


  let selector = document.getElementById("message_topic")
  let selector = document.getElementById("message_topic");
  jvc.getMessageEditor(selector).insertText('text'); //❌ Ne marche pas
  jvc.getMessageEditor(selector).insertText('text'); //❌ Ne marche pas


let selector = "#message_topic"
jvc.getMessageEditor(selector).insertText('text'); //✅ Marche


L'approche de getMessageEditor(...) diffère des fonctions classiques :<br>
Cependant, cette fonction présente plusieurs avantages notables : elle est à la fois native à JVC et intégrée au fonctionnement de React.
Chaque appel agit comme une "photographie" instantanée de la zone de texte — capturant la position du curseur, le texte sélectionné et le contenu actuel.<br>
 
Si le champ est modifié ensuite sans rappeler la fonction, les actions (insertText, insertStartLine, etc.) s’appliqueront à l’ancien état.
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 :
 
* 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.
 
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.


Cependant, cette fonction présente également de nombreux avantages : native à JVC, gestion automatique du Focus (curseur), gestion des espaces.
== Sous-domaines ==


Pour simplifier : <code>jvc.getMessageEditor(<span style="color:red;">AreaIDClasse</span>).insertText(<span style="color:green;">message</span>);</code> avec cette fonction.
*.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


== Liens externes ==
== 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])


* [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==
 
== Voir aussi ==


* [[Documentation de l'API Jeuxvideo.com]]
*[[Documentation de l'API Jeuxvideo.com]]


{{SectionRéférences}}
{{SectionRéférences}}