From 14d229f6338e3f499a5490543f1474ae2622caa2 Mon Sep 17 00:00:00 2001 From: Klemek Date: Tue, 6 Apr 2021 19:09:55 +0200 Subject: [PATCH 1/3] streak computing --- src/data_types/frequency.py | 40 +++++++++++++++++++++++++++---- src/scanners/frequency_scanner.py | 18 +++++++++++++- src/scanners/full_scanner.py | 2 +- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/data_types/frequency.py b/src/data_types/frequency.py index 4eb622d..14cf5dd 100644 --- a/src/data_types/frequency.py +++ b/src/data_types/frequency.py @@ -2,7 +2,16 @@ from typing import List from datetime import timedelta import calendar -from utils import str_date, str_datetime, from_now, plural, percent, precise, top_key +from utils import ( + str_date, + str_datetime, + from_now, + plural, + percent, + precise, + top_key, + mention, +) class Frequency: @@ -16,8 +25,19 @@ class Frequency: self.busiest_day_count = 0 self.busiest_hour = None self.busiest_hour_count = 0 + self.streaks = [] + self.last_author = None + self.last_streak_start = None + self.last_streak_author = None + self.longest_streak = None + self.longest_streak_start = None + self.longest_streak_author = None - def to_string(self) -> List[str]: + def to_string( + self, + *, + member_specific: bool, + ) -> List[str]: delta = self.dates[-1] - self.dates[0] total_msg = len(self.dates) busiest_weekday = top_key(self.week) @@ -31,14 +51,24 @@ class Frequency: n_hours = delta.days if self.dates[0].hour <= busiest_hour and self.dates[-1].hour >= busiest_hour: n_hours += 1 - return [ + ret = [ f"- **earliest message**: {str_datetime(self.dates[0])} ({from_now(self.dates[0])})", f"- **latest message**: {str_datetime(self.dates[-1])} ({from_now(self.dates[-1])})", f"- **messages/day**: {precise(total_msg/delta.days, precision=3)}", f"- **busiest day of week**: {calendar.day_name[busiest_weekday]} (~{precise(self.week[busiest_weekday]/n_weekdays, precision=3)} msg, {percent(self.week[busiest_weekday]/total_msg)})", - f"- **busiest day ever**: {str_date(self.busiest_day)} ({from_now(self.busiest_day)}) ({self.busiest_day_count} msg)", + f"- **busiest day ever**: {str_date(self.busiest_day)} ({from_now(self.busiest_day)}, {self.busiest_day_count} msg)", f"- **messages/hour**: {precise(total_msg*3600/delta.total_seconds(), precision=3)}", f"- **busiest hour of day**: {busiest_hour:0>2}:00 (~{precise(self.day[busiest_hour]/n_hours, precision=3)} msg, {percent(self.day[busiest_hour]/total_msg)})", - f"- **busiest hour ever**: {str_datetime(self.busiest_hour)} ({from_now(self.busiest_hour)}) ({self.busiest_hour_count} msg)", + f"- **busiest hour ever**: {str_datetime(self.busiest_hour)} ({from_now(self.busiest_hour)}, {self.busiest_hour_count} msg)", f"- **longest break**: {plural(round(self.longest_break.total_seconds()/3600), 'hour')} ({plural(self.longest_break.days,'day')}) from {str_datetime(self.longest_break_start)} ({from_now(self.longest_break_start)})", + f"- **avg. streak**: {precise(sum(self.streaks)/len(self.streaks), precision=3)} msg", ] + if member_specific: + ret += [ + f"- **longest streak**: {self.longest_streak:,} msg from {str_datetime(self.longest_streak_start)} ({from_now(self.longest_streak_start)})" + ] + else: + ret += [ + f"- **longest streak**: {mention(self.longest_streak_author)} ({self.longest_streak:,} msg from {str_datetime(self.longest_streak_start)}, {from_now(self.longest_streak_start)})" + ] + return ret diff --git a/src/scanners/frequency_scanner.py b/src/scanners/frequency_scanner.py index 348be1b..fac0a27 100644 --- a/src/scanners/frequency_scanner.py +++ b/src/scanners/frequency_scanner.py @@ -44,7 +44,9 @@ class FrequencyScanner(Scanner): def get_results(self, intro: str) -> List[str]: FrequencyScanner.compute_results(self.freq) res = [intro] - res += self.freq.to_string() + res += self.freq.to_string( + member_specific=self.member_specific, + ) return res @staticmethod @@ -64,6 +66,20 @@ class FrequencyScanner(Scanner): ): impacted = True freq.dates += [message.created_at] + if message.author == freq.last_author: + freq.streaks[-1] += 1 + else: + if len(freq.streaks) > 0 and ( + freq.longest_streak is None + or freq.streaks[-1] > freq.longest_streak + ): + freq.longest_streak = freq.streaks[-1] + freq.longest_streak_start = freq.last_streak_start + freq.longest_streak_author = freq.last_streak_author + freq.streaks += [1] + freq.last_streak_start = message.created_at + freq.last_streak_author = message.author + freq.last_author = message.author return impacted @staticmethod diff --git a/src/scanners/full_scanner.py b/src/scanners/full_scanner.py index 90c0b09..22149bd 100644 --- a/src/scanners/full_scanner.py +++ b/src/scanners/full_scanner.py @@ -63,7 +63,7 @@ class FullScanner(Scanner): FrequencyScanner.compute_results(self.freq) res = [intro] res += ["__Frequency__:"] - res += self.freq.to_string() + res += self.freq.to_string(member_specific=self.member_specific) res += ["__Composition__:"] res += self.compo.to_string(self.msg_count) res += ["__Presence__:"] From d219edeb7b4d370b4ee990b0dd5b18cd3fa10ba1 Mon Sep 17 00:00:00 2001 From: Klemek Date: Tue, 6 Apr 2021 19:09:59 +0200 Subject: [PATCH 2/3] formating --- src/data_types/counter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data_types/counter.py b/src/data_types/counter.py index 8511074..c59ad43 100644 --- a/src/data_types/counter.py +++ b/src/data_types/counter.py @@ -49,7 +49,7 @@ class Counter: else: output += f"**#{i + 1}**" sum = val_sum(self.usages) - output += f" {name} - {plural(sum, counted)} ({percent(sum/total_usage)}) (last {from_now(self.last_used)})" + output += f" {name} - {plural(sum, counted)} ({percent(sum/total_usage)}, last {from_now(self.last_used)})" top_item = top_key(self.usages) if top_item != 0 and transform is not None: if self.usages[top_item] == sum: From 5ec84871003458527e76472f94045bceda554258 Mon Sep 17 00:00:00 2001 From: Klemek Date: Tue, 6 Apr 2021 19:10:53 +0200 Subject: [PATCH 3/3] new version --- README.md | 2 ++ src/main.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4406d1b..cb2ad20 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,8 @@ python3 src/main.py ## Changelog +* **v1.11** + * streak computing in `%pres` * **v1.10** * multithreading for queries * bug fix diff --git a/src/main.py b/src/main.py index e128333..76c5e1f 100644 --- a/src/main.py +++ b/src/main.py @@ -24,7 +24,7 @@ emojis.load_emojis() bot = Bot( "Discord Analyst", - "1.10", + "1.11", alias="%", )