« Fonctionnement technique de Jeuxvideo.com » : différence entre les versions
Nouveau : sous-domaines de Jeuxvideo.com, où on peut y trouver des choses parfois étranges. |
|||
| (14 versions intermédiaires par 3 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/app/modeles/core/OiPDOStatement.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/sso/Compte.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/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> | |||
loadMenu<br> | |||
checkMenuItem<br> | |||
getSingleton<br> | |||
getHtmlJeuForum<br> | |||
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. | 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 246 : | Ligne 246 : | ||
<s>messageTextArea.value = message;</s> | <s>messageTextArea.value = message;</s> | ||
Heureusement, il existe | 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 | 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 257 : | Ligne 257 : | ||
Ensuite, il suffit simplement de faire appel à cette fonction quand on doit remplir une zone de texte : | 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. | 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> | 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 officielle JVC === | |||
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 : | |||
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> | Par ailleurs, en dehors de cette méthode, JVC a proposé une entrée native pour interagir directement avec REACT :<br> | ||
| Ligne 274 : | Ligne 281 : | ||
jvc.getMessageEditor(".class").selectedText; // Récupérer la sélection utilisateur. | jvc.getMessageEditor(".class").selectedText; // Récupérer la sélection utilisateur. | ||
PS : Pour garantir le bon fonctionnement, utilisez simplement jvc.getMessageEditor(); | 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 | 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 : | Cette fonction prend directement en compte des sélecteurs CSS et pas des éléments, exemple : | ||
let selector = "#message_topic" | let selector = "#message_topic"; | ||
jvc.getMessageEditor(selector).insertText('text'); //✅ Marche | 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 | ||
| Ligne 292 : | Ligne 299 : | ||
En revanche, pour manipuler le champ entièrement (suppression, remplacement) {{fleched}} la fonction a moins d'intérêt.<br> | 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. | 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. | |||
== Sous-domaines == | |||
*.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]) | |||
==Voir aussi== | |||
== Voir aussi == | |||
* [[Documentation de l'API Jeuxvideo.com]] | *[[Documentation de l'API Jeuxvideo.com]] | ||
{{SectionRéférences}} | {{SectionRéférences}} | ||