fixing frequency analysis
This commit is contained in:
@@ -6,20 +6,19 @@ from utils import str_date, str_datetime, from_now
|
|||||||
|
|
||||||
class Frequency:
|
class Frequency:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.earliest = None
|
self.dates = []
|
||||||
self.latest = None
|
|
||||||
self.longest_break = timedelta(seconds=0)
|
self.longest_break = timedelta(seconds=0)
|
||||||
self.longest_break_start = None
|
self.longest_break_start = None
|
||||||
|
|
||||||
def to_string(self) -> List[str]:
|
def to_string(self) -> List[str]:
|
||||||
return [
|
return [
|
||||||
f"**earliest message:** {str_date(self.earliest)} ({from_now(self.earliest)})",
|
f"**earliest message:** {str_datetime(self.dates[0])} ({from_now(self.dates[0])})",
|
||||||
f"**latest message:** {str_date(self.latest)} ({from_now(self.latest)})",
|
f"**latest message:** {str_datetime(self.dates[-1])} ({from_now(self.dates[-1])})",
|
||||||
# "**msg/day:** n",
|
# "**msg/day:** n",
|
||||||
# "**busiest day of week:** dd (avg. n msg)",
|
# "**busiest day of week:** dd (avg. n msg)",
|
||||||
# "**busiest day ever:** jj/mm/yyyy (n days ago) (n msg)",
|
# "**busiest day ever:** jj/mm/yyyy (n days ago) (n msg)",
|
||||||
# "**msg/hour:** n",
|
# "**msg/hour:** n",
|
||||||
# "**busiest hour of day:** hh (avg. n msg)",
|
# "**busiest hour of day:** hh (avg. n msg)",
|
||||||
# "**busiest hour ever:** hh jj/mm/yyyy (n days ago) (n msg)",
|
# "**busiest hour ever:** hh jj/mm/yyyy (n days ago) (n msg)",
|
||||||
f"**longest break:** {int(self.longest_break.total_seconds() / 3600):,} hours from {str_datetime(self.longest_break_start)} ({from_now(self.earliest)})",
|
f"**longest break:** {int(self.longest_break.total_seconds() / 3600):,} hours ({int(self.longest_break.days):,} days) from {str_datetime(self.longest_break_start)} ({from_now(self.longest_break_start)})",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class EmotesScanner(Scanner):
|
|||||||
has_digit_args=True,
|
has_digit_args=True,
|
||||||
valid_args=["all", "members"],
|
valid_args=["all", "members"],
|
||||||
help=EmotesScanner.help(),
|
help=EmotesScanner.help(),
|
||||||
intro_context="emotes usage",
|
intro_context="Emotes usage",
|
||||||
)
|
)
|
||||||
self.top = 20
|
self.top = 20
|
||||||
self.all_emojis = False
|
self.all_emojis = False
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class FrequencyScanner(Scanner):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__(
|
super().__init__(
|
||||||
help=FrequencyScanner.help(),
|
help=FrequencyScanner.help(),
|
||||||
intro_context="frequency",
|
intro_context="Frequency",
|
||||||
)
|
)
|
||||||
|
|
||||||
async def init(self, message: discord.Message, *args: str) -> bool:
|
async def init(self, message: discord.Message, *args: str) -> bool:
|
||||||
@@ -35,6 +35,7 @@ class FrequencyScanner(Scanner):
|
|||||||
return FrequencyScanner.analyse_message(message, self.freq, self.raw_members)
|
return FrequencyScanner.analyse_message(message, self.freq, self.raw_members)
|
||||||
|
|
||||||
def get_results(self, intro: str) -> List[str]:
|
def get_results(self, intro: str) -> List[str]:
|
||||||
|
FrequencyScanner.compute_results(self.freq)
|
||||||
res = [intro]
|
res = [intro]
|
||||||
res += self.freq.to_string()
|
res += self.freq.to_string()
|
||||||
return res
|
return res
|
||||||
@@ -47,18 +48,16 @@ class FrequencyScanner(Scanner):
|
|||||||
# If author is included in the selection (empty list is all)
|
# If author is included in the selection (empty list is all)
|
||||||
if len(raw_members) == 0 or message.author in raw_members:
|
if len(raw_members) == 0 or message.author in raw_members:
|
||||||
impacted = True
|
impacted = True
|
||||||
date = message.created_at
|
freq.dates += [message.created_at]
|
||||||
# order is latest to earliest
|
return impacted
|
||||||
if freq.latest is None:
|
|
||||||
freq.earliest = date
|
|
||||||
freq.latest = date
|
|
||||||
|
|
||||||
delay = freq.earliest - date
|
@staticmethod
|
||||||
|
def compute_results(freq: Frequency):
|
||||||
|
freq.dates.sort()
|
||||||
|
latest = freq.dates[0]
|
||||||
|
for date in freq.dates:
|
||||||
|
delay = date - latest
|
||||||
if delay > freq.longest_break:
|
if delay > freq.longest_break:
|
||||||
freq.longest_break = delay
|
freq.longest_break = delay
|
||||||
freq.longest_break_start = date
|
freq.longest_break_start = latest
|
||||||
|
latest = date
|
||||||
# TODO
|
|
||||||
|
|
||||||
freq.earliest = date
|
|
||||||
return impacted
|
|
||||||
|
|||||||
+12
-8
@@ -128,32 +128,36 @@ def get_intro(
|
|||||||
if full:
|
if full:
|
||||||
return f"{subject} in this server ({nc} channels, {nmm:,} messages):"
|
return f"{subject} in this server ({nc} channels, {nmm:,} messages):"
|
||||||
elif len(channels) < 5:
|
elif len(channels) < 5:
|
||||||
return f"{aggregate([c.mention for c in channels])} {subject} in {nmm:,} messages:"
|
return f"{aggregate([c.mention for c in channels])} {subject.lower()} in {nmm:,} messages:"
|
||||||
else:
|
else:
|
||||||
return f"These {len(channels)} channels {subject} in {nmm:,} messages:"
|
return (
|
||||||
|
f"These {len(channels)} channels {subject.lower()} in {nmm:,} messages:"
|
||||||
|
)
|
||||||
elif len(members) < 5:
|
elif len(members) < 5:
|
||||||
if full:
|
if full:
|
||||||
return f"{aggregate([m.mention for m in members])} {subject} in {nmm:,} messages:"
|
return f"{aggregate([m.mention for m in members])} {subject.lower()} in {nmm:,} messages:"
|
||||||
elif len(channels) < 5:
|
elif len(channels) < 5:
|
||||||
return (
|
return (
|
||||||
f"{aggregate([m.mention for m in members])} on {aggregate([c.mention for c in channels])} "
|
f"{aggregate([m.mention for m in members])} on {aggregate([c.mention for c in channels])} "
|
||||||
f"{subject} in {nmm:,} messages:"
|
f"{subject.lower()} in {nmm:,} messages:"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return (
|
return (
|
||||||
f"{aggregate([m.mention for m in members])} on these {len(channels)} channels "
|
f"{aggregate([m.mention for m in members])} on these {len(channels)} channels "
|
||||||
f"{subject} in {nmm:,} messages:"
|
f"{subject.lower()} in {nmm:,} messages:"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
if full:
|
if full:
|
||||||
return f"These {len(members)} members {subject} in {nmm:,} messages:"
|
return (
|
||||||
|
f"These {len(members)} members {subject.lower()} in {nmm:,} messages:"
|
||||||
|
)
|
||||||
elif len(channels) < 5:
|
elif len(channels) < 5:
|
||||||
return (
|
return (
|
||||||
f"These {len(members)} members on {aggregate([c.mention for c in channels])} "
|
f"These {len(members)} members on {aggregate([c.mention for c in channels])} "
|
||||||
f"{subject} in {nmm:,} messages:"
|
f"{subject.lower()} in {nmm:,} messages:"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return (
|
return (
|
||||||
f"These {len(members)} members on these {len(channels)} channels "
|
f"These {len(members)} members on these {len(channels)} channels "
|
||||||
f"{subject} in {nmm:,} messages:"
|
f"{subject.lower()} in {nmm:,} messages:"
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user