From cd319dbacc50f1378b01ffe81b0778c70ad0ee52 Mon Sep 17 00:00:00 2001 From: "Christian P. MOMON" Date: Wed, 14 Apr 2021 19:36:58 +0200 Subject: [PATCH] Improved !oops command. Improved stats. --- .../bot/hooks/CancelPreviousInputHook.java | 6 +- .../hebdobot/bot/hooks/FinishReviewHook.java | 4 +- .../april/hebdobot/bot/hooks/StatsHook.java | 1 + .../hebdobot/bot/review/ReviewReporter.java | 4 +- .../april/hebdobot/bot/stats/ReviewDatas.java | 64 ++++++++- .../bot/stats/ReviewStatsReporter.java | 133 +++++++++++------- .../bot/stats/ReviewStatsReporterTest.java | 4 +- 7 files changed, 150 insertions(+), 66 deletions(-) diff --git a/src/org/april/hebdobot/bot/hooks/CancelPreviousInputHook.java b/src/org/april/hebdobot/bot/hooks/CancelPreviousInputHook.java index 9f4b8c9..c20dc2f 100644 --- a/src/org/april/hebdobot/bot/hooks/CancelPreviousInputHook.java +++ b/src/org/april/hebdobot/bot/hooks/CancelPreviousInputHook.java @@ -43,7 +43,7 @@ public class CancelPreviousInputHook extends Hook if (StringsUtils.containsAnyIgnoreCase(message, "!cancelprevious", "!oops", "!oups")) { - logger.info("!cancelprevious/!oups caught."); + logger.info("!cancelprevious/!oops caught."); // Missing. if (bot.getReview() == null) @@ -62,11 +62,11 @@ public class CancelPreviousInputHook extends Hook String previousMessage = topic.cancelPreviousMessage(sender); if (previousMessage == null) { - bot.sendMessage("Vous n'avez pas d'entrée en cours."); + bot.sendMessage(sender + ", vous n'avez pas d'entrée en cours."); } else { - bot.sendMessage(sender + ", suppressiond de votre dernière entrée : " + previousMessage); + bot.sendMessage(sender + ", suppressiond de votre précédente entrée : " + previousMessage); } } } diff --git a/src/org/april/hebdobot/bot/hooks/FinishReviewHook.java b/src/org/april/hebdobot/bot/hooks/FinishReviewHook.java index 9614e20..6a74559 100644 --- a/src/org/april/hebdobot/bot/hooks/FinishReviewHook.java +++ b/src/org/april/hebdobot/bot/hooks/FinishReviewHook.java @@ -159,12 +159,12 @@ public class FinishReviewHook extends Hook } // Send conclusion message in channel. - bot.sendMessage("% " + ReviewStatsReporter.reportReviewCount(datas)); + bot.sendMessage("% " + ReviewStatsReporter.reportCurrentReviewCount(datas)); bot.sendMessage("% Compte-rendu de la revue : " + pastebinUrl); bot.sendMessage("% Durée de la revue : " + bot.getReview().getDurationInMinutes() + " minutes"); bot.sendMessage("% Nombre de personnes participantes : " + bot.getReview().getParticipants().size()); - bot.sendMessage("% " + ReviewStatsReporter.reportNewUserCountRecord(datas)); + bot.sendMessage("% " + ReviewStatsReporter.reportCheckUserCountRecord(datas)); bot.sendMessage(bot.getReview().getOwner(), ReviewStatsReporter.reportUserCount(datas, bot.getReview().getParticipants().size())); bot.sendMessage(bot.getReview().getOwner(), ReviewStatsReporter.reportDuration(datas, bot.getReview().getDurationInMinutes())); diff --git a/src/org/april/hebdobot/bot/hooks/StatsHook.java b/src/org/april/hebdobot/bot/hooks/StatsHook.java index 76362c4..c473c8f 100644 --- a/src/org/april/hebdobot/bot/hooks/StatsHook.java +++ b/src/org/april/hebdobot/bot/hooks/StatsHook.java @@ -56,6 +56,7 @@ public class StatsHook extends Hook { ReviewDatas datas = ReviewDatasFile.load(reviewDataFile); datas.clean(); + bot.sendMessage("% " + ReviewStatsReporter.reportReviewCount(datas)); bot.sendMessage("% " + ReviewStatsReporter.reportUserCountBoard(datas)); bot.sendMessage("% " + ReviewStatsReporter.reportDurationBoard(datas)); } diff --git a/src/org/april/hebdobot/bot/review/ReviewReporter.java b/src/org/april/hebdobot/bot/review/ReviewReporter.java index 8472883..3722e49 100644 --- a/src/org/april/hebdobot/bot/review/ReviewReporter.java +++ b/src/org/april/hebdobot/bot/review/ReviewReporter.java @@ -343,12 +343,12 @@ public class ReviewReporter addEmpty(buffer); addCenter(buffer, "Statistiques"); addEmpty(buffer); - addChunk(buffer, ReviewStatsReporter.reportReviewCount(datas)); + addChunk(buffer, ReviewStatsReporter.reportCurrentReviewCount(datas)); addChunk(buffer, "Horaire de début de la revue : " + review.getFormattedStartTime()); addChunk(buffer, "Horaire de fin de la revue : " + review.getFormattedEndTime()); addChunk(buffer, "Durée de la revue : " + review.getDurationInMinutes() + " minutes"); addChunk(buffer, "Nombre de personnes participantes : " + review.getParticipants().size()); - addChunk(buffer, ReviewStatsReporter.reportNewUserCountRecord(datas)); + addChunk(buffer, ReviewStatsReporter.reportCheckUserCountRecord(datas)); addChunk(buffer, ReviewStatsReporter.reportUserCount(datas, review.getParticipants().size())); addChunk(buffer, ReviewStatsReporter.reportDuration(datas, review.getDurationInMinutes())); diff --git a/src/org/april/hebdobot/bot/stats/ReviewDatas.java b/src/org/april/hebdobot/bot/stats/ReviewDatas.java index 06feb4b..e2f80d4 100644 --- a/src/org/april/hebdobot/bot/stats/ReviewDatas.java +++ b/src/org/april/hebdobot/bot/stats/ReviewDatas.java @@ -106,6 +106,34 @@ public class ReviewDatas extends ArrayList return result; } + /** + * Gets the averatge user count. + * + * @return the averatge user count + */ + public double getAveratgeUserCount() + { + double result; + + if (isEmpty()) + { + result = 0; + } + else + { + result = 0; + for (ReviewData data : this) + { + result += data.getUserCount(); + } + + result = result / size(); + } + + // + return result; + } + /** * Gets the by year. * @@ -298,32 +326,60 @@ public class ReviewDatas extends ArrayList /** * Reverse. */ - public void reverse() + public ReviewDatas reverse() { + ReviewDatas result; + Collections.reverse(this); + + result = this; + + // + return result; } /** * Sort by date. */ - public void sortByDate() + public ReviewDatas sortByDate() { + ReviewDatas result; + Collections.sort(this, new ReviewDataComparator(Sorting.DATE)); + + result = this; + + // + return result; } /** * Sort by duration. */ - public void sortByDuration() + public ReviewDatas sortByDuration() { + ReviewDatas result; + Collections.sort(this, new ReviewDataComparator(Sorting.DURATION)); + + result = this; + + // + return result; } /** * Sort by user count. */ - public void sortByUserCount() + public ReviewDatas sortByUserCount() { + ReviewDatas result; + Collections.sort(this, new ReviewDataComparator(Sorting.USERCOUNT)); + + result = this; + + // + return result; } } diff --git a/src/org/april/hebdobot/bot/stats/ReviewStatsReporter.java b/src/org/april/hebdobot/bot/stats/ReviewStatsReporter.java index 983d63f..7c71032 100644 --- a/src/org/april/hebdobot/bot/stats/ReviewStatsReporter.java +++ b/src/org/april/hebdobot/bot/stats/ReviewStatsReporter.java @@ -108,6 +108,82 @@ public class ReviewStatsReporter return result; } + /** + * Report new max. The current user count is found in last review by date. + * + * @param datas + * the datas + * @return the string + */ + public static String reportCheckUserCountRecord(final ReviewDatas datas) + { + String result; + + if ((datas == null) || (datas.isEmpty()) || (datas.size() == 1)) + { + result = "Absence de statistique sur la participation."; + } + else + { + ReviewDatas reviews = new ReviewDatas(datas); + reviews.sortByDate(); + ReviewData lastReview = datas.getLastByIndex(); + reviews.removeLast(); + reviews.sortByUserCount(); + ReviewData recordReview = reviews.getLastByIndex(); + + if (lastReview.getUserCount() < recordReview.getUserCount()) + { + double averageUserCount = reviews.getAveratgeUserCount(); + result = String.format("La moyenne de participation est de %02.1f personnes.", averageUserCount); + } + else if (lastReview.getUserCount() == recordReview.getUserCount()) + { + String lastRecordDate = recordReview.getDate().format(DateTimeFormatter.ofPattern("EEEE dd MMMM yyyy", Locale.FRENCH)); + result = String.format("\\o/ Record de participation égalé \\o/ Le précédent record de %d personnes était le %s.", + recordReview.getUserCount(), lastRecordDate); + } + else + { + String lastRecordDate = recordReview.getDate().format(DateTimeFormatter.ofPattern("EEEE dd MMMM yyyy", Locale.FRENCH)); + result = String.format( + "*\\o/* Nouveau record de participation : %d personnes ! *\\o/* Le précédent record était de %d personnes le %s.", + lastReview.getUserCount(), recordReview.getUserCount(), lastRecordDate); + } + } + + // + return result; + } + + /** + * Report review count. + * + * @param datas + * the datas + * @return the string + */ + public static String reportCurrentReviewCount(final ReviewDatas datas) + { + String result; + + if ((datas == null) || (datas.isEmpty())) + { + result = "Pas de statistique sur le nombre de revues."; + } + else + { + long currentYear = LocalDateTime.now().getYear(); + long reviewYearCount = datas.countByYear(currentYear); + + result = String.format("C'était la %d%s revue hebdomadaire de l'April, la %d%s de l'année %d.", datas.size(), numberSuffix(datas.size()), + reviewYearCount, numberSuffix(reviewYearCount), currentYear); + } + + // + return result; + } + /** * Report duration. * @@ -169,55 +245,6 @@ public class ReviewStatsReporter return result; } - /** - * Report new max. The current user count is found in last review by date. - * - * @param datas - * the datas - * @return the string - */ - public static String reportNewUserCountRecord(final ReviewDatas datas) - { - String result; - - if ((datas == null) || (datas.isEmpty()) || (datas.size() == 1)) - { - result = "Absence de statistique sur la participation."; - } - else - { - ReviewDatas reviews = new ReviewDatas(datas); - reviews.sortByDate(); - ReviewData lastReview = datas.getLastByIndex(); - reviews.removeLast(); - reviews.sortByUserCount(); - ReviewData recordReview = reviews.getLastByIndex(); - - if (lastReview.getUserCount() < recordReview.getUserCount()) - { - String lastRecordDate = recordReview.getDate().format(DateTimeFormatter.ofPattern("EEEE dd MMMM yyyy", Locale.FRENCH)); - result = String.format("Le dernier record de participation est de %d personnes le %s.", recordReview.getUserCount(), lastRecordDate); - } - else if (lastReview.getUserCount() == recordReview.getUserCount()) - { - result = "Record de participation égalé."; - String lastRecordDate = recordReview.getDate().format(DateTimeFormatter.ofPattern("EEEE dd MMMM yyyy", Locale.FRENCH)); - result = String.format("\\o/ Record de participation égalé \\o/ Le précédent record était de %d personnes le %s.", - recordReview.getUserCount(), lastRecordDate); - } - else - { - String lastRecordDate = recordReview.getDate().format(DateTimeFormatter.ofPattern("EEEE dd MMMM yyyy", Locale.FRENCH)); - result = String.format( - "*\\o/* Nouveau record de participation : %d personnes ! *\\o/* Le précédent record était de %d personnes le %s.", - lastReview.getUserCount(), recordReview.getUserCount(), lastRecordDate); - } - } - - // - return result; - } - /** * Report review count. * @@ -235,11 +262,11 @@ public class ReviewStatsReporter } else { - long currentYear = LocalDateTime.now().getYear(); - long reviewYearCount = datas.countByYear(currentYear); + ReviewData firstReview = datas.sortByDate().get(0); + long reviewCount = datas.size(); + String firstDate = firstReview.getDate().format(DateTimeFormatter.ofPattern("EEEE dd MMMM yyyy", Locale.FRENCH)); - result = String.format("C'était la %d%s revue hebdomadaire de l'April, la %d%s de l'année %d.", datas.size(), numberSuffix(datas.size()), - reviewYearCount, numberSuffix(reviewYearCount), currentYear); + result = String.format("Il y a eu %d revues. La première date du %s.", reviewCount, firstDate); } // diff --git a/test/org/april/hebdobot/bot/stats/ReviewStatsReporterTest.java b/test/org/april/hebdobot/bot/stats/ReviewStatsReporterTest.java index c96ad5d..c7144a1 100644 --- a/test/org/april/hebdobot/bot/stats/ReviewStatsReporterTest.java +++ b/test/org/april/hebdobot/bot/stats/ReviewStatsReporterTest.java @@ -72,7 +72,7 @@ public class ReviewStatsReporterTest logger.debug("File loaded."); ReviewData currentReview = new ReviewData(LocalDateTime.now(), 12, 17L); datas.add(currentReview); - String report = ReviewStatsReporter.reportNewUserCountRecord(datas); + String report = ReviewStatsReporter.reportCheckUserCountRecord(datas); logger.debug("Report=" + report); Assert.assertTrue(StringUtils.startsWith(report, "Le dernier record de")); } @@ -92,7 +92,7 @@ public class ReviewStatsReporterTest logger.debug("File loaded."); ReviewData currentReview = new ReviewData(LocalDateTime.now(), 42000, 17L); datas.add(currentReview); - String report = ReviewStatsReporter.reportNewUserCountRecord(datas); + String report = ReviewStatsReporter.reportCheckUserCountRecord(datas); logger.debug("Report=" + report); Assert.assertTrue(StringUtils.startsWith(report, "*\\o/* Nouveau record de participation")); }