From 01436ac220f959178da553b12b3ae84a1c021f7d Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Fri, 16 Jan 2026 15:37:23 +0100 Subject: [PATCH] feat: add match eq support --- .../ffsaf/domain/service/ResultService.java | 134 +++++++++--------- .../ffsaf/rest/data/ResultCategoryData.java | 12 +- src/main/webapp/public/competition.js | 15 +- src/main/webapp/public/img/171892.png | Bin 0 -> 14734 bytes src/main/webapp/public/locales/en/result.json | 1 + src/main/webapp/public/locales/fr/result.json | 1 + .../webapp/src/pages/result/ResultView.jsx | 13 +- 7 files changed, 95 insertions(+), 81 deletions(-) create mode 100644 src/main/webapp/public/img/171892.png diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/ResultService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/ResultService.java index f370f38..0156acb 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/ResultService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/ResultService.java @@ -174,46 +174,25 @@ public class ResultService { .distinct() .filter(Objects::nonNull) .map(comb -> { - AtomicInteger w = new AtomicInteger(0); - AtomicInteger pointMake = new AtomicInteger(0); - AtomicInteger pointTake = new AtomicInteger(0); - - matchEntities.stream() - .filter(m -> m.isEnd() && (m.isC1(comb) || m.isC2(comb))) - .forEach(matchModel -> { - int win = matchModel.win(); - if ((matchModel.isC1(comb) && win > 0) || matchModel.isC2(comb) && win < 0) - w.getAndIncrement(); - - for (ScoreEmbeddable score : matchModel.getScores()) { - if (score.getS1() <= -900 || score.getS2() <= -900) - continue; - if (matchModel.isC1(comb)) { - pointMake.addAndGet(score.getS1()); - pointTake.addAndGet(score.getS2()); - } else { - pointMake.addAndGet(score.getS2()); - pointTake.addAndGet(score.getS1()); - } - } - }); - float pointRate = (pointTake.get() == 0) ? pointMake.get() : (float) pointMake.get() / pointTake.get(); - + CombStat stat = makeStat(matchEntities, comb); return new ResultCategoryData.RankArray(0, - comb.getName(membreModel, ResultPrivacy.REGISTERED_ONLY_NO_DETAILS), w.get(), - pointMake.get(), pointTake.get(), pointRate); + comb.getName(membreModel, ResultPrivacy.REGISTERED_ONLY_NO_DETAILS), stat.score, stat.w, + stat.pointMake, stat.pointTake, stat.getPointRate()); }) .sorted(Comparator - .comparing(ResultCategoryData.RankArray::getWin) + .comparing(ResultCategoryData.RankArray::getScore) + .thenComparing(ResultCategoryData.RankArray::getWin) .thenComparing(ResultCategoryData.RankArray::getPointRate).reversed()) .toList(); out.getMatchs().put(c, matchs); + int lastScore = -1; int lastWin = -1; float pointRate = 0; int rank = 0; for (ResultCategoryData.RankArray rankArray1 : rankArray) { - if (rankArray1.getWin() != lastWin || pointRate != rankArray1.getPointRate()) { + if (rankArray1.getScore() != lastScore || rankArray1.getWin() != lastWin || pointRate != rankArray1.getPointRate()) { + lastScore = rankArray1.getScore(); lastWin = rankArray1.getWin(); pointRate = rankArray1.getPointRate(); rank++; @@ -275,12 +254,7 @@ public class ResultService { .distinct() .map(comb -> { var builder2 = CombsArrayData.CombsData.builder(); - AtomicInteger w = new AtomicInteger(0); - AtomicInteger l = new AtomicInteger(0); - AtomicInteger pointMake = new AtomicInteger(); - AtomicInteger pointTake = new AtomicInteger(); - - makeStat(matchModels, comb, w, l, pointMake, pointTake); + CombStat stat = makeStat(matchModels, comb); Categorie categorie = null; String clubName = null; @@ -302,14 +276,13 @@ public class ResultService { builder2.cat((categorie == null) ? "---" : categorie.getName(trad)); builder2.name(comb.getName(membreModel, ResultPrivacy.REGISTERED_ONLY)); - builder2.w(w.get()); - builder2.l(l.get()); - builder2.ratioVictoire((l.get() == 0) ? w.get() : (float) w.get() / l.get()); + builder2.w(stat.w); + builder2.l(stat.l); + builder2.ratioVictoire((stat.l == 0) ? stat.w : (float) stat.w / stat.l); builder2.club(clubName); - builder2.pointMake(pointMake.get()); - builder2.pointTake(pointTake.get()); - builder2.ratioPoint( - (pointTake.get() == 0) ? pointMake.get() : (float) pointMake.get() / pointTake.get()); + builder2.pointMake(stat.pointMake); + builder2.pointTake(stat.pointTake); + builder2.ratioPoint(stat.getPointRate()); return builder2.build(); }) @@ -434,7 +407,7 @@ public class ResultService { } else { builder2.score(new ArrayList<>()); } - builder2.win(matchModel.win() > 0); + builder2.win(matchModel.isEnd() && matchModel.win() > 0); } else { builder2.adv(Utils.getFullName(matchModel.getC1_id(), matchModel.getC1_guest())); if (matchModel.isEnd()) { @@ -449,9 +422,9 @@ public class ResultService { } else { builder2.score(new ArrayList<>()); } - builder2.win(matchModel.win() < 0); + builder2.win(matchModel.isEnd() && matchModel.win() < 0); } - + builder2.eq(matchModel.isEnd() && matchModel.win() == 0); builder2.ratio( (pointTake.get() == 0) ? pointMake.get() : (float) pointMake.get() / pointTake.get()); @@ -495,7 +468,7 @@ public class ResultService { @Builder @RegisterForReflection public static record MatchsData(Date date, String poule, String adv, List score, float ratio, - boolean win) { + boolean win, boolean eq) { } } @@ -566,12 +539,7 @@ public class ResultService { List combData = combs.stream().map(comb -> { var builder2 = ClubArrayData.CombData.builder(); - AtomicInteger w = new AtomicInteger(0); - AtomicInteger l = new AtomicInteger(0); - AtomicInteger pointMake = new AtomicInteger(); - AtomicInteger pointTake = new AtomicInteger(); - - makeStat(matchModels, comb, w, l, pointMake, pointTake); + CombStat stat = makeStat(matchModels, comb); Categorie categorie = null; @@ -587,15 +555,15 @@ public class ResultService { builder2.cat((categorie == null) ? "---" : categorie.getName(trad)); builder2.name(comb.getName(membreModel, ResultPrivacy.REGISTERED_ONLY)); - builder2.w(w.get()); - builder2.l(l.get()); - builder2.ratioVictoire((l.get() == 0) ? w.get() : (float) w.get() / l.get()); - builder2.pointMake(pointMake.get()); - builder2.pointTake(pointTake.get()); - builder2.ratioPoint((pointTake.get() == 0) ? pointMake.get() : (float) pointMake.get() / pointTake.get()); + builder2.w(stat.w); + builder2.l(stat.l); + builder2.ratioVictoire((stat.l == 0) ? stat.w : (float) stat.w / stat.l); + builder2.pointMake(stat.pointMake); + builder2.pointTake(stat.pointTake); + builder2.ratioPoint(stat.getPointRate()); - tt_win.addAndGet(w.get()); - tt_match.addAndGet(w.get() + l.get()); + tt_win.addAndGet(stat.w); + tt_match.addAndGet(stat.w + stat.l); return builder2.build(); }) @@ -615,30 +583,34 @@ public class ResultService { return builder.build(); } - private static void makeStat(List matchModels, CombModel comb, AtomicInteger w, AtomicInteger l, - AtomicInteger pointMake, AtomicInteger pointTake) { + private static CombStat makeStat(List matchModels, CombModel comb) { + CombStat stat = new CombStat(); matchModels.stream() .filter(m -> m.isEnd() && (m.isC1(comb) || m.isC2(comb))) .forEach(matchModel -> { int win = matchModel.win(); - if ((matchModel.isC1(comb) && win > 0) || matchModel.isC2(comb) && win < 0) { - w.getAndIncrement(); + if (win == 0) { + stat.score += 1; + } else if ((matchModel.isC1(comb) && win > 0) || matchModel.isC2(comb) && win < 0) { + stat.w++; + stat.score += 3; } else { - l.getAndIncrement(); + stat.l++; } matchModel.getScores().stream() .filter(s -> s.getS1() > -900 && s.getS2() > -900) .forEach(score -> { if (matchModel.isC1(comb)) { - pointMake.addAndGet(score.getS1()); - pointTake.addAndGet(score.getS2()); + stat.pointMake += score.getS1(); + stat.pointTake += score.getS2(); } else { - pointMake.addAndGet(score.getS2()); - pointTake.addAndGet(score.getS1()); + stat.pointMake += score.getS2(); + stat.pointTake += score.getS1(); } }); }); + return stat; } @Builder @@ -652,6 +624,27 @@ public class ResultService { } } + @RegisterForReflection + public static class CombStat { + public int w; + public int l; + public int score; + public int pointMake; + public int pointTake; + + public CombStat() { + this.w = 0; + this.l = 0; + this.score = 0; + this.pointMake = 0; + this.pointTake = 0; + } + + public float getPointRate() { + return (pointTake == 0) ? pointMake : (float) pointMake / pointTake; + } + } + private Uni hasAccess(String uuid, SecurityCtx securityCtx) { return registerRepository.find("membre.userId = ?1 AND competition.uuid = ?2", securityCtx.getSubject(), uuid) .firstResult() @@ -678,7 +671,8 @@ public class ResultService { securityCtx.getSubject()) .chain(c2 -> { if (c2 > 0) return Uni.createFrom().item(m); - return Uni.createFrom().failure(new DForbiddenException(trad.t("access.denied"))); + return Uni.createFrom() + .failure(new DForbiddenException(trad.t("access.denied"))); }); } }); diff --git a/src/main/java/fr/titionfire/ffsaf/rest/data/ResultCategoryData.java b/src/main/java/fr/titionfire/ffsaf/rest/data/ResultCategoryData.java index 1ea8279..0b04ba7 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/data/ResultCategoryData.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/data/ResultCategoryData.java @@ -11,6 +11,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; @@ -32,6 +33,7 @@ public class ResultCategoryData { public static class RankArray { int rank; String name; + int score; int win; int pointMake; int pointTake; @@ -39,7 +41,8 @@ public class ResultCategoryData { } @RegisterForReflection - public record PouleArrayData(String red, boolean red_w, List score, boolean blue_w, String blue, boolean end) { + public record PouleArrayData(String red, boolean red_w, List score, boolean blue_w, String blue, + boolean eq, boolean end, Date date) { public static PouleArrayData fromModel(MatchModel matchModel, MembreModel membreModel, ResultPrivacy privacy) { return new PouleArrayData( matchModel.getC1Name(membreModel, privacy), @@ -49,7 +52,9 @@ public class ResultCategoryData { : new ArrayList<>(), matchModel.isEnd() && matchModel.win() < 0, matchModel.getC2Name(membreModel, privacy), - matchModel.isEnd()); + matchModel.isEnd() && matchModel.win() == 0, + matchModel.isEnd(), + matchModel.getDate()); } } @@ -57,7 +62,8 @@ public class ResultCategoryData { public static record TreeData(long id, String c1FullName, String c2FullName, List scores, boolean end) { public static TreeData from(MatchModel match, MembreModel membreModel, ResultPrivacy privacy) { - return new TreeData(match.getId(), match.getC1Name(membreModel, privacy), match.getC2Name(membreModel, privacy), match.getScores(), match.isEnd()); + return new TreeData(match.getId(), match.getC1Name(membreModel, privacy), + match.getC2Name(membreModel, privacy), match.getScores(), match.isEnd()); } } } diff --git a/src/main/webapp/public/competition.js b/src/main/webapp/public/competition.js index 09b5c54..6f14d9c 100644 --- a/src/main/webapp/public/competition.js +++ b/src/main/webapp/public/competition.js @@ -7,6 +7,9 @@ const rootDiv = document.getElementById("safca_api_data"); const cupImg = `` +const cupImg2 = `` const voidFunction = () => { @@ -15,7 +18,7 @@ let lastRf = 0; let rfFonction = voidFunction; setInterval(() => { - rfFonction(); + // rfFonction(); }, 15000); function setSubPage(name) { @@ -214,11 +217,11 @@ function buildMatchArray(matchs) { arrayContent += ` ${match.red} - ${match.red_w ? cupImg : ""} + ${match.red_w ? cupImg : (match.eq ? cupImg2 : "")} ${scoreToString(match.score)} - ${match.blue_w ? cupImg : ""} + ${match.blue_w ? cupImg : (match.eq ? cupImg2 : "")} ${match.blue} - ${dateToString((match.red_w || match.blue_w) ? match.date : null)} + ${dateToString((match.end) ? match.date : null)} ` } arrayContent += `` @@ -234,6 +237,7 @@ function buildRankArray(rankArray) { ${i18next.t('place')} ${i18next.t('nom')} + ${i18next.t('score')} ${i18next.t('victoire')} ${i18next.t('ratio')} ${i18next.t('pointsMarqués')} @@ -245,6 +249,7 @@ function buildRankArray(rankArray) { ${row.rank} ${row.name} + ${row.score} ${row.win} ${row.pointRate.toFixed(3)} ${row.pointMake} @@ -419,7 +424,7 @@ function buildCombView(comb) { ${match.adv} ${scoreToString(match.score)} ${match.ratio.toFixed(3)} - ${match.win ? cupImg : ""} + ${match.win ? cupImg : (match.eq ? cupImg2 : "")} ` } arrayContent += `` diff --git a/src/main/webapp/public/img/171892.png b/src/main/webapp/public/img/171892.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b3c1a084b8d95169a6f7b3933a4499cec909a2 GIT binary patch literal 14734 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 Do*9u| literal 0 HcmV?d00001 diff --git a/src/main/webapp/public/locales/en/result.json b/src/main/webapp/public/locales/en/result.json index 094181e..c43e1e5 100644 --- a/src/main/webapp/public/locales/en/result.json +++ b/src/main/webapp/public/locales/en/result.json @@ -57,6 +57,7 @@ "rechercheParCombattant": "Search by fighter", "rouge": "Red", "résultatDeLaCompétition": "Competition result", + "score": "Score", "scores": "Scores", "statistique": "Statistics", "tauxDeVictoire2": "Win rate: {{nb}}% ({{victoires}} out of {{matchs}})", diff --git a/src/main/webapp/public/locales/fr/result.json b/src/main/webapp/public/locales/fr/result.json index 2122fd0..ec2c1ec 100644 --- a/src/main/webapp/public/locales/fr/result.json +++ b/src/main/webapp/public/locales/fr/result.json @@ -57,6 +57,7 @@ "rechercheParCombattant": "Recherche par combattant", "rouge": "Rouge", "résultatDeLaCompétition": "Résultat de la compétition", + "score": "Score", "scores": "Scores", "statistique": "Statistique", "tauxDeVictoire2": "Taux de victoire : {{nb}}% ({{victoires}} sur {{matchs}})", diff --git a/src/main/webapp/src/pages/result/ResultView.jsx b/src/main/webapp/src/pages/result/ResultView.jsx index a314c2f..b5aed60 100644 --- a/src/main/webapp/src/pages/result/ResultView.jsx +++ b/src/main/webapp/src/pages/result/ResultView.jsx @@ -14,6 +14,11 @@ function CupImg() { style={{width: "16px"}} src="/img/171891.png" alt=""/> } +function CupImg2() { + return +} export function ResultView() { const {uuid} = useParams() @@ -87,9 +92,9 @@ function BuildMatchArray({matchs}) { {matchs.map((match, idx) => {match.red} - {match.red_w ? : ""} + {match.red_w ? : (match.eq ? : "")} {scoreToString(match.score)} - {match.blue_w ? : ""} + {match.blue_w ? : (match.eq ? : "")} {match.blue} )} @@ -105,6 +110,7 @@ function BuildRankArray({rankArray}) { {t('place')} {t('nom')} + {t('score')} {t('victoire')} {t('ratio')} {t('pointsMarqués')} @@ -115,6 +121,7 @@ function BuildRankArray({rankArray}) { {rankArray.map((row, idx) => {row.rank} {row.name} + {row.score} {row.win} {row.pointRate.toFixed(3)} {row.pointMake} @@ -395,7 +402,7 @@ function CombResult({uuid, combId}) { {match.adv} {scoreToString(match.score)} {match.ratio.toFixed(3)} - {match.win ? : ""} + {match.win ? : (match.eq ? : "")} )} -- 2.49.0