Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
ff2balex
Manage
Activity
Members
Labels
Plan
Issues
9
Issue boards
Milestones
Wiki
External wiki
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Lex gaMe
ff2balex
Commits
7ff7c8cd
Commit
7ff7c8cd
authored
4 months ago
by
Lucie Bader
Browse files
Options
Downloads
Plain Diff
Merge branch 'main' of
https://gitlab.liris.cnrs.fr/lex-game/balex2ff
parents
82c1f376
c2d2ff60
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/workers/pyodide_worker.js
+138
-113
138 additions, 113 deletions
src/workers/pyodide_worker.js
with
138 additions
and
113 deletions
src/workers/pyodide_worker.js
+
138
−
113
View file @
7ff7c8cd
...
@@ -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 d
’
authentification.
"
);
log
(
"
Impossible d'ajouter le
s
mot
s
: 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
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment