Skip to content
Snippets Groups Projects
Commit 7ff7c8cd authored by Lucie Bader's avatar Lucie Bader
Browse files
parents 82c1f376 c2d2ff60
No related branches found
No related tags found
No related merge requests found
...@@ -202,123 +202,122 @@ self.onmessage = async (event) => { ...@@ -202,123 +202,122 @@ self.onmessage = async (event) => {
// --- Vérification du seuil et notification --- // --- Vérification du seuil et notification ---
let pendingWords = {}; // Stocker temporairement les mots en attente d'ajout let pendingWords = {}; // Stocke temporairement les mots en attente d'ajout
let attemptedWords = {}; // Stocke les mots déjà tentés (ajout réussi ou non)
let addWordTimeout = null; // Timer pour regrouper les ajouts let addWordTimeout = null; // Timer pour regrouper les ajouts
async function checkThreshold(lang) { async function checkThreshold(lang) {
await stoplistsReady; // Attendre que les stoplists soient chargées await stoplistsReady; // Attendre que les stoplists soient chargées
if (!autoAddEnabled || !isAuthenticated) { if (!autoAddEnabled || !isAuthenticated) {
log("[Worker] Auto-Add désactivé ou utilisateur non connecté."); log("[Worker] Auto-Add désactivé ou utilisateur non connecté.");
} else if (!trackedLanguages.includes(lang)) { return;
}
if (!trackedLanguages.includes(lang)) {
log(`[Worker] La langue '${lang}' n'est pas suivie.`); log(`[Worker] La langue '${lang}' n'est pas suivie.`);
} else { return;
log(`[Worker] Vérification des fréquences pour la langue '${lang}'...`);
const stoplist = stoplistsByLang[lang] || new Set();
const shouldFilterStopwords = stoplist.size > 0 && !includeStopwords;
log(`[Worker] Stoplist pour '${lang}' : ${shouldFilterStopwords ? "Appliquée" : "Non appliquée"}`);
const wordsFrequencies = storedFrequencies[lang] || {};
const notifiedSet = new Set(notifiedWords[lang] || []);
// Filtrer les mots qui dépassent le seuil
const exceededWords = Object.entries(wordsFrequencies)
.filter(([word, count]) => count >= userThreshold && !notifiedSet.has(word))
.map(([word]) => word);
if (exceededWords.length === 0) {
log(`[Worker] Aucun mot dépassant le seuil pour '${lang}'.`);
} else {
// Filtrer selon la stoplist si nécessaire
const finalWords = shouldFilterStopwords
? exceededWords.filter(word => {
const isInStoplist = stoplist.has(word);
if (isInStoplist) log(`[Worker] Mot "${word}" exclu (stoplist)`);
return !isInStoplist;
})
: exceededWords;
if (finalWords.length === 0) {
log(`[Worker] Tous les mots dépassant le seuil pour '${lang}' sont dans la stoplist.`);
} else {
// Ajouter les mots aux sets et logs
notifiedWords[lang] = notifiedSet;
finalWords.forEach(word => notifiedSet.add(word));
log("Mots dépassant le seuil :", finalWords);
self.postMessage({ type: "threshold-exceeded", wordsAboveThreshold: { [lang]: finalWords } });
// Ajout aux mots en attente pour un envoi groupé
if (!pendingWords[lang]) pendingWords[lang] = [];
pendingWords[lang].push(...finalWords);
// Regrouper les ajouts en une seule tâche différée
if (!addWordTimeout) {
addWordTimeout = setTimeout(processPendingWords, 3000);
}
}
}
} }
}
/** log(`[Worker] Vérification des fréquences pour la langue '${lang}'...`);
* Traite les ajouts groupés const stoplist = stoplistsByLang[lang] || new Set();
*/ const shouldFilterStopwords = stoplist.size > 0 && !includeStopwords;
async function processPendingWords() {
log("Traitement des mots à ajouter en lot...");
for (const lang in pendingWords) { log(`[Worker] Stoplist pour '${lang}' : ${shouldFilterStopwords ? "Appliquée" : "Non appliquée"}`);
const words = pendingWords[lang];
for (const word of words) { const wordsFrequencies = storedFrequencies[lang] || {};
await addWordToLexicon(lang, word); const notifiedSet = new Set(notifiedWords[lang] || []);
// Filtrer les mots qui dépassent le seuil
const exceededWords = Object.entries(wordsFrequencies)
.filter(([word, count]) => count >= userThreshold && !notifiedSet.has(word))
.map(([word]) => word);
if (exceededWords.length === 0) {
log(`[Worker] Aucun mot dépassant le seuil pour '${lang}'.`);
return;
}
// Exclure les stopwords et les mots déjà tentés
const finalWords = exceededWords.filter(word => {
if (shouldFilterStopwords && stoplist.has(word)) {
log(`[Worker] Mot "${word}" exclu (stoplist)`);
return false;
} }
if (attemptedWords[lang]?.has(word)) {
log(`[Worker] Mot "${word}" déjà tenté, on l'ignore.`);
return false;
}
return true;
});
if (finalWords.length === 0) {
log(`[Worker] Aucun mot à ajouter après filtrage.`);
return;
} }
// Réinitialiser la file d'attente et le timeout // Ajouter à notifiedWords pour éviter de les re-traiter immédiatement
pendingWords = {}; notifiedWords[lang] = notifiedWords[lang] || new Set();
addWordTimeout = null; finalWords.forEach(word => notifiedWords[lang].add(word));
log("Mots dépassant le seuil et à ajouter :", finalWords);
self.postMessage({ type: "threshold-exceeded", wordsAboveThreshold: { [lang]: finalWords } });
// Ajout aux mots en attente pour un envoi groupé
pendingWords[lang] = pendingWords[lang] || [];
pendingWords[lang].push(...finalWords);
// Initialiser attemptedWords si nécessaire
attemptedWords[lang] = attemptedWords[lang] || new Set();
// Regrouper les ajouts en une seule tâche différée
if (!addWordTimeout) {
addWordTimeout = setTimeout(() => {
addWordTimeout = null;
processPendingWords();
}, 3000);
}
} }
/** /**
* Ajoute un mot au lexique * Traite les ajouts groupés
* @param {string} lang - La langue du mot.
* @param {string} word - Le mot à ajouter.
*/ */
async function addWordToLexicon(lang, word) { async function processPendingWords() {
log("Traitement des mots en attente d'ajout...");
if (!authToken) { if (!authToken) {
log("Impossible d'ajouter le mot : Aucun token dauthentification."); log("Impossible d'ajouter les mots : Aucun token d'authentification.");
return; return;
} }
log(`Tentative d'ajout du mot '${word}' pour la langue '${lang}'`); for (const lang in pendingWords) {
// Trouver les lexiques correspondant à la langue détectée const words = [...new Set(pendingWords[lang])];
const targetLexicons = userLexicons if (words.length === 0) continue;
.filter(lexicon => lexicon.language === lang && lexicon.category === "User")
.map(lexicon => lexicon.id); log(`Envoi des mots '${words.join(", ")}' pour la langue '${lang}'`);
if (targetLexicons.length === 0) { // Récupérer les lexiques pour la langue
log(`Aucun lexique trouvé pour la langue '${lang}'. Impossible d'ajouter '${word}'.`); const targetLexicons = userLexicons
return; .filter(lexicon => lexicon.language === lang && lexicon.category === "User")
} .map(lexicon => lexicon.id);
try { if (targetLexicons.length === 0) {
log(`Envoi de '${word}' aux lexiques ${targetLexicons}...`); log(`⚠ Aucun lexique trouvé pour la langue '${lang}', envoi annulé.`);
await AddWord(authToken, word, targetLexicons); continue;
// Notifier le background de l'ajout réussi }
self.postMessage({ type: "word-added", word, language: lang, lexicons: targetLexicons });
} catch (error) { await autoAddWord(lang, authToken, words, targetLexicons);
console.error(`Erreur lors de l'ajout du mot '${word}':`, error);
} }
} }
async function AddWord(authToken, selectedWord, lexiconIds, force = false) { /**
* Envoi des mots à l'API en évitant les doublons
*/
async function autoAddWord(lang, authToken, wordsArray, lexiconIds, force = false) {
if (!authToken) { if (!authToken) {
console.error("Aucun token d’authentification fourni."); console.error("Aucun token d’authentification fourni.");
return; return;
} }
if (!selectedWord) { if (!Array.isArray(wordsArray) || wordsArray.length === 0) {
console.error("Aucun mot spécifié pour l’ajout."); console.error("Aucun mot spécifié pour l’ajout.");
return; return;
} }
...@@ -327,32 +326,58 @@ async function AddWord(authToken, selectedWord, lexiconIds, force = false) { ...@@ -327,32 +326,58 @@ async function AddWord(authToken, selectedWord, lexiconIds, force = false) {
return; return;
} }
const url = "https://babalex.lezinter.net/api/entry/create"; const url = "https://babalex.lezinter.net/api/entry/create";
const body = {
graphy: selectedWord, for (const word of wordsArray) {
force, // 🔹 Vérifier et initialiser attemptedWords[lang]
target_lex: lexiconIds if (!attemptedWords[lang]) attemptedWords[lang] = new Set();
};
// 🔹 Si le mot a déjà été tenté, on ne le retente pas
log("Envoi de la requête API AddWord :", body); if (attemptedWords[lang].has(word)) {
log(`[Worker] Mot '${word}' déjà tenté, on l'ignore.`);
try { continue;
const response = await fetch(url, { }
method: "POST",
headers: { // 🔹 Ajouter immédiatement le mot à attemptedWords
"Content-Type": "application/json", attemptedWords[lang].add(word);
"Authorization": `Bearer ${authToken}` log(`[Worker] Liste des mots tentés pour '${lang}':`, Array.from(attemptedWords[lang]));
},
body: JSON.stringify(body) const body = {
}); graphy: word,
log(`Mot '${selectedWord}' ajouté avec succès aux lexiques ${lexiconIds}`); force,
target_lex: lexiconIds
if (!response.ok) { };
throw new Error(`Erreur API (${response.status}): ${response.statusText}`);
log("Envoi de la requête API autoAddWord :", body);
try {
await new Promise(resolve => setTimeout(resolve, 3000)); // espacer les requêtes
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${authToken}`
},
body: JSON.stringify(body)
});
if (!response.ok) {
throw new Error(`Erreur API (${response.status}): ${response.statusText}`);
}
log(`Mot '${word}' ajouté avec succès aux lexiques ${lexiconIds}`);
attemptedWords[word] = "success"; // Marquer comme ajouté avec succès
} catch (error) {
console.error(`Erreur lors de l'ajout du mot '${word}':`, error);
attemptedWords[word] = "failed"; // Marquer comme échec pour éviter la répétition
log(attemptedWords)
// Réessayer après 24H
setTimeout(() => {
delete attemptedWords[word]; // On retente après 24h
}, 24 * 60 * 60 * 1000);
} }
return await response.json();
} catch (error) {
console.error(`Erreur lors de l'ajout du mot '${selectedWord}':`, error);
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment