/
voixjvchat.js
142 lines (123 loc) · 5.05 KB
/
voixjvchat.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// ==UserScript==
// @name Synthèse Vocale pour jv chat sur le 18-25
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Ajoute la synthèse vocale sur le 18 25 de JeuxVideo.com
// @author Ewn03
// @match https://www.jeuxvideo.com/forums/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
var voices = [];
var voixChargees = false;//attend de charger les voix
var autoriseVoix = false;//autorise manuellement à lire le texte
updateVoices();
function updateVoices() {
voices = speechSynthesis.getVoices();
//console.log(voices); // Log des voix disponibles
if (voices.length > 0) {
voixChargees = true;
createTitre();
} else {
setTimeout(updateVoices, 250);
}
}
function startVoice(contentText) {
var utterance = new SpeechSynthesisUtterance(contentText);
// choisir une voix spécifique:
//"Microsoft Hortense - French (France)"
//"Microsoft Julie - French (France)"
//"Google français"
utterance.voice = voices.find(voice => voice.name === "Google français");
utterance.rate = 1.1;//vitesse de parole
console.log("on speak");
speechSynthesis.speak(utterance);
let r = setInterval(() => {
//console.log(speechSynthesis.speaking);
if (!speechSynthesis.speaking) {
clearInterval(r);
console.log("clearinterval");
} else {
console.log("speech pause and resume");
speechSynthesis.pause();
speechSynthesis.resume();
}
}, 14000);
}
observeDOM();
function handleNewMessage(node) {
if (node && node.querySelectorAll) {
var pElements = node.querySelectorAll('.txt-msg p');
pElements.forEach(function(p) {
// Vérifier si l'élément <p> est contenu dans un <blockquote>
if (!p.closest('blockquote')) {
var textContent = p.textContent;
textContent = textContent.replace(/(http[s]?:\/\/[^\s]+|www\.[^\s]+)/g, ''); //on enleve les liens http
console.log("on va lire : "+textContent);
if (voixChargees){
startVoice(textContent);
}
}
});
}
}
// Fonction pour observer les mutations dans le DOM
function observeDOM() {
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
for (let i = 0; i < mutation.addedNodes.length; i++) {
let node = mutation.addedNodes[i];
if (node.nodeType === 1 && node.matches('.jvchat-bloc-message')) {
if ( autoriseVoix ) handleNewMessage(node);
else console.log("voix pas encore autorisee, cliquez sur la checkbox");
}
}
});
});
// Configuration de l'observer : écouter les ajouts de nouveaux éléments
var config = { childList: true, subtree: true };
observer.observe(document.body, config);
}
function stopVoice() {
if ( speechSynthesis ) speechSynthesis.cancel();
}
function creerCheckbox(){
var checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = 'activerCheckbox';
var label = document.createElement('label');
label.htmlFor = 'Activer la voix';
label.appendChild(document.createTextNode('Activer la voix'));
// Ajouter le checkbox et le label au conteneur
var container = document.createElement('div');
container.appendChild(checkbox);
container.appendChild(label);
checkbox.addEventListener('change', verifierEtatCheckbox);
var forumDiv = document.getElementById('titreVoix');
forumDiv.insertAdjacentElement('afterend', container);
}
function verifierEtatCheckbox(e){
if ( e.target.checked ) {
autoriseVoix = true;//un 'speech' est recréé à chaque fois
} else {
autoriseVoix = false;
stopVoice();//le 'speech' est annulé
}
}
function createTitre(){
var newTitre = document.createElement('h4');
newTitre.textContent = 'Activer la voix qui lit les messages';
newTitre.id = "titreVoix";
var forumDiv = document.getElementById('jvchat-forum');
newTitre.classList.add('titre-info-fofo');
if (forumDiv) {
// Insérer le bouton après la div 'jvchat-forum'
forumDiv.insertAdjacentElement('afterend', newTitre);
creerCheckbox();
} else {
console.log("Élément 'jvchat-forum' introuvable");
setTimeout(createTitre, 500);
}
}
})();