all/everyone to include bots on scans

This commit is contained in:
Klemek
2021-03-14 22:48:58 +01:00
parent f2c3185fad
commit 4956f45098
9 changed files with 103 additions and 25 deletions
+5 -1
View File
@@ -22,7 +22,11 @@ class ChannelLogs:
return return
self.id = int(channel["id"]) self.id = int(channel["id"])
self.name = channel["name"] self.name = channel["name"]
self.last_message_id = int(channel["last_message_id"]) if channel["last_message_id"] is not None else None self.last_message_id = (
int(channel["last_message_id"])
if channel["last_message_id"] is not None
else None
)
self.messages = [MessageLog(message) for message in channel["messages"]] self.messages = [MessageLog(message) for message in channel["messages"]]
def is_format(self): def is_format(self):
+3 -3
View File
@@ -20,7 +20,7 @@ class ChannelsScanner(Scanner):
+ "arguments:\n" + "arguments:\n"
+ COMMON_HELP_ARGS + COMMON_HELP_ARGS
+ "* <n> - top <n>, default is 10\n" + "* <n> - top <n>, default is 10\n"
+ "* all - include bots\n" + "* all/everyone - include bots\n"
+ "Example: %chan 10 @user\n" + "Example: %chan 10 @user\n"
+ "```" + "```"
) )
@@ -28,7 +28,7 @@ class ChannelsScanner(Scanner):
def __init__(self): def __init__(self):
super().__init__( super().__init__(
has_digit_args=True, has_digit_args=True,
valid_args=["all"], valid_args=["all", "everyone"],
help=ChannelsScanner.help(), help=ChannelsScanner.help(),
intro_context="Channels", intro_context="Channels",
) )
@@ -39,7 +39,7 @@ class ChannelsScanner(Scanner):
for arg in args: for arg in args:
if arg.isdigit(): if arg.isdigit():
self.top = int(arg) self.top = int(arg)
self.all_messages = "all" in args self.all_messages = "all" in args or "everyone" in args
# Create mentions dict # Create mentions dict
self.messages = defaultdict(Counter) self.messages = defaultdict(Counter)
return True return True
+16 -3
View File
@@ -19,22 +19,27 @@ class CompositionScanner(Scanner):
+ "%compo: Show composition statistics\n" + "%compo: Show composition statistics\n"
+ "arguments:\n" + "arguments:\n"
+ COMMON_HELP_ARGS + COMMON_HELP_ARGS
+ "* all/everyone - include bots\n"
+ "Example: %compo #mychannel1 @user\n" + "Example: %compo #mychannel1 @user\n"
+ "```" + "```"
) )
def __init__(self): def __init__(self):
super().__init__( super().__init__(
valid_args=["all", "everyone"],
help=CompositionScanner.help(), help=CompositionScanner.help(),
intro_context="Composition", intro_context="Composition",
) )
async def init(self, message: discord.Message, *args: str) -> bool: async def init(self, message: discord.Message, *args: str) -> bool:
self.compo = Composition() self.compo = Composition()
self.all_messages = "all" in args or "everyone" in args
return True return True
def compute_message(self, channel: ChannelLogs, message: MessageLog): def compute_message(self, channel: ChannelLogs, message: MessageLog):
ret = CompositionScanner.analyse_message(message, self.compo, self.raw_members) ret = CompositionScanner.analyse_message(
message, self.compo, self.raw_members, all_messages=self.all_messages
)
return ret return ret
def get_results(self, intro: str) -> List[str]: def get_results(self, intro: str) -> List[str]:
@@ -44,11 +49,19 @@ class CompositionScanner(Scanner):
@staticmethod @staticmethod
def analyse_message( def analyse_message(
message: MessageLog, compo: Composition, raw_members: List[int] message: MessageLog,
compo: Composition,
raw_members: List[int],
*,
all_messages: bool,
) -> bool: ) -> bool:
impacted = False impacted = False
# If author is included in the selection (empty list is all) # If author is included in the selection (empty list is all)
if not message.bot and len(raw_members) == 0 or message.author in raw_members: if (
(not message.bot or all_messages)
and len(raw_members) == 0
or message.author in raw_members
):
impacted = True impacted = True
compo.total_characters += len(message.content) compo.total_characters += len(message.content)
+14 -3
View File
@@ -23,6 +23,7 @@ class EmotesScanner(Scanner):
+ "* all - list all common emojis in addition to this guild's\n" + "* all - list all common emojis in addition to this guild's\n"
+ "* members - show top member for each emojis\n" + "* members - show top member for each emojis\n"
+ "* sort:usage/reaction - other sorting methods\n" + "* sort:usage/reaction - other sorting methods\n"
+ "* everyone - include bots\n"
+ "Example: %emojis 10 all #mychannel1 #mychannel2 @user\n" + "Example: %emojis 10 all #mychannel1 #mychannel2 @user\n"
+ "```" + "```"
) )
@@ -30,7 +31,7 @@ class EmotesScanner(Scanner):
def __init__(self): def __init__(self):
super().__init__( super().__init__(
has_digit_args=True, has_digit_args=True,
valid_args=["all", "members", "sort:usage", "sort:reaction"], valid_args=["all", "members", "sort:usage", "sort:reaction", "everyone"],
help=EmotesScanner.help(), help=EmotesScanner.help(),
intro_context="Emoji usage", intro_context="Emoji usage",
) )
@@ -54,11 +55,16 @@ class EmotesScanner(Scanner):
self.sort = "usage" self.sort = "usage"
elif "sort:reaction" in args: elif "sort:reaction" in args:
self.sort = "reaction" self.sort = "reaction"
self.all_messages = "everyone" in args
return True return True
def compute_message(self, channel: ChannelLogs, message: MessageLog): def compute_message(self, channel: ChannelLogs, message: MessageLog):
return EmotesScanner.analyse_message( return EmotesScanner.analyse_message(
message, self.emotes, self.raw_members, all_emojis=self.all_emojis message,
self.emotes,
self.raw_members,
all_emojis=self.all_emojis,
all_messages=self.all_messages,
) )
def get_results(self, intro: str) -> List[str]: def get_results(self, intro: str) -> List[str]:
@@ -107,10 +113,15 @@ class EmotesScanner(Scanner):
raw_members: List[int], raw_members: List[int],
*, *,
all_emojis: bool, all_emojis: bool,
all_messages: bool,
) -> bool: ) -> bool:
impacted = False impacted = False
# If author is included in the selection (empty list is all) # If author is included in the selection (empty list is all)
if not message.bot and len(raw_members) == 0 or message.author in raw_members: if (
(not message.bot or all_messages)
and len(raw_members) == 0
or message.author in raw_members
):
impacted = True impacted = True
# Find all emotes un the current message in the form "<:emoji:123456789>" # Find all emotes un the current message in the form "<:emoji:123456789>"
# Filter for known emotes # Filter for known emotes
+16 -3
View File
@@ -19,22 +19,27 @@ class FrequencyScanner(Scanner):
+ "%freq: Show frequency-related statistics\n" + "%freq: Show frequency-related statistics\n"
+ "arguments:\n" + "arguments:\n"
+ COMMON_HELP_ARGS + COMMON_HELP_ARGS
+ "* all/everyone - include bots\n"
+ "Example: %freq #mychannel1 @user\n" + "Example: %freq #mychannel1 @user\n"
+ "```" + "```"
) )
def __init__(self): def __init__(self):
super().__init__( super().__init__(
valid_args=["all", "everyone"],
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:
self.freq = Frequency() self.freq = Frequency()
self.all_messages = "all" in args or "everyone" in args
return True return True
def compute_message(self, channel: ChannelLogs, message: MessageLog): def compute_message(self, channel: ChannelLogs, message: MessageLog):
return FrequencyScanner.analyse_message(message, self.freq, self.raw_members) return FrequencyScanner.analyse_message(
message, self.freq, self.raw_members, all_messages=self.all_messages
)
def get_results(self, intro: str) -> List[str]: def get_results(self, intro: str) -> List[str]:
FrequencyScanner.compute_results(self.freq) FrequencyScanner.compute_results(self.freq)
@@ -44,11 +49,19 @@ class FrequencyScanner(Scanner):
@staticmethod @staticmethod
def analyse_message( def analyse_message(
message: MessageLog, freq: Frequency, raw_members: List[int] message: MessageLog,
freq: Frequency,
raw_members: List[int],
*,
all_messages: bool
) -> bool: ) -> bool:
impacted = False impacted = False
# 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 (
(not message.bot or all_messages)
and len(raw_members) == 0
or message.author in raw_members
):
impacted = True impacted = True
freq.dates += [message.created_at] freq.dates += [message.created_at]
return impacted return impacted
+17 -4
View File
@@ -19,12 +19,14 @@ class FullScanner(Scanner):
+ "%scan: Show full statistics\n" + "%scan: Show full statistics\n"
+ "arguments:\n" + "arguments:\n"
+ COMMON_HELP_ARGS + COMMON_HELP_ARGS
+ "* all/everyone - include bots\n"
+ "Example: %scan #mychannel1 @user\n" + "Example: %scan #mychannel1 @user\n"
+ "```" + "```"
) )
def __init__(self): def __init__(self):
super().__init__( super().__init__(
valid_args=["all", "everyone"],
help=FullScanner.help(), help=FullScanner.help(),
intro_context="Full analysis", intro_context="Full analysis",
) )
@@ -34,14 +36,25 @@ class FullScanner(Scanner):
self.compo = Composition() self.compo = Composition()
self.pres = Presence() self.pres = Presence()
self.member_specific = len(self.members) > 0 self.member_specific = len(self.members) > 0
self.all_messages = "all" in args or "everyone" in args
return True return True
def compute_message(self, channel: ChannelLogs, message: MessageLog): def compute_message(self, channel: ChannelLogs, message: MessageLog):
FrequencyScanner.analyse_message(message, self.freq, self.raw_members) FrequencyScanner.analyse_message(
CompositionScanner.analyse_message(message, self.compo, self.raw_members) message, self.freq, self.raw_members, all_messages=self.all_messages
PresenceScanner.analyse_message(channel, message, self.pres, self.raw_members) )
CompositionScanner.analyse_message(
message, self.compo, self.raw_members, all_messages=self.all_messages
)
PresenceScanner.analyse_message(
channel,
message,
self.pres,
self.raw_members,
all_messages=self.all_messages,
)
return ( return (
not message.bot (not message.bot or self.all_messages)
and len(self.raw_members) == 0 and len(self.raw_members) == 0
or message.author in self.raw_members or message.author in self.raw_members
) )
+14 -3
View File
@@ -29,6 +29,7 @@ class MentionsScanner(Scanner):
+ COMMON_HELP_ARGS + COMMON_HELP_ARGS
+ "* <n> - top <n> mentions, default is 10\n" + "* <n> - top <n> mentions, default is 10\n"
+ "* all - show role/channel/everyone/here mentions\n" + "* all - show role/channel/everyone/here mentions\n"
+ "* everyone - include bots mentions\n"
+ "Example: %mentions 10 #mychannel1 #mychannel2 @user\n" + "Example: %mentions 10 #mychannel1 #mychannel2 @user\n"
+ "```" + "```"
) )
@@ -36,7 +37,7 @@ class MentionsScanner(Scanner):
def __init__(self): def __init__(self):
super().__init__( super().__init__(
has_digit_args=True, has_digit_args=True,
valid_args=["all"], valid_args=["all", "everyone"],
help=MentionsScanner.help(), help=MentionsScanner.help(),
intro_context="Mention usage", intro_context="Mention usage",
) )
@@ -51,11 +52,16 @@ class MentionsScanner(Scanner):
self.all_mentions = "all" in args self.all_mentions = "all" in args
# Create mentions dict # Create mentions dict
self.mentions = defaultdict(Counter) self.mentions = defaultdict(Counter)
self.all_messages = "everyone" in args
return True return True
def compute_message(self, channel: ChannelLogs, message: MessageLog): def compute_message(self, channel: ChannelLogs, message: MessageLog):
return MentionsScanner.analyse_message( return MentionsScanner.analyse_message(
message, self.mentions, self.raw_members, all_mentions=self.all_mentions message,
self.mentions,
self.raw_members,
all_mentions=self.all_mentions,
all_messages=self.all_messages,
) )
def get_results(self, intro: str) -> List[str]: def get_results(self, intro: str) -> List[str]:
@@ -85,10 +91,15 @@ class MentionsScanner(Scanner):
raw_members: List[int], raw_members: List[int],
*, *,
all_mentions: bool, all_mentions: bool,
all_messages: bool,
) -> bool: ) -> bool:
impacted = False impacted = False
# If author is included in the selection (empty list is all) # If author is included in the selection (empty list is all)
if not message.bot and len(raw_members) == 0 or message.author in raw_members: if (
(not message.bot or all_messages)
and len(raw_members) == 0
or message.author in raw_members
):
impacted = True impacted = True
for member_id in message.mentions: for member_id in message.mentions:
name = mention(member_id) name = mention(member_id)
+3 -3
View File
@@ -20,7 +20,7 @@ class MessagesScanner(Scanner):
+ "arguments:\n" + "arguments:\n"
+ COMMON_HELP_ARGS + COMMON_HELP_ARGS
+ "* <n> - top <n>, default is 10\n" + "* <n> - top <n>, default is 10\n"
+ "* all - include bots\n" + "* all/everyone - include bots\n"
+ "Example: %msg 10 #channel\n" + "Example: %msg 10 #channel\n"
+ "```" + "```"
) )
@@ -28,7 +28,7 @@ class MessagesScanner(Scanner):
def __init__(self): def __init__(self):
super().__init__( super().__init__(
has_digit_args=True, has_digit_args=True,
valid_args=["all"], valid_args=["all", "everyone"],
help=MessagesScanner.help(), help=MessagesScanner.help(),
intro_context="Messages", intro_context="Messages",
) )
@@ -39,7 +39,7 @@ class MessagesScanner(Scanner):
for arg in args: for arg in args:
if arg.isdigit(): if arg.isdigit():
self.top = int(arg) self.top = int(arg)
self.all_messages = "all" in args self.all_messages = "all" in args or "everyone" in args
# Create mentions dict # Create mentions dict
self.messages = defaultdict(Counter) self.messages = defaultdict(Counter)
return True return True
+15 -2
View File
@@ -18,12 +18,14 @@ class PresenceScanner(Scanner):
+ "%pres: Show presence statistics\n" + "%pres: Show presence statistics\n"
+ "arguments:\n" + "arguments:\n"
+ COMMON_HELP_ARGS + COMMON_HELP_ARGS
+ "* all/everyone - include bots\n"
+ "Example: %pres #mychannel1 @user\n" + "Example: %pres #mychannel1 @user\n"
+ "```" + "```"
) )
def __init__(self): def __init__(self):
super().__init__( super().__init__(
valid_args=["all", "everyone"],
help=PresenceScanner.help(), help=PresenceScanner.help(),
intro_context="Presence", intro_context="Presence",
) )
@@ -31,11 +33,16 @@ class PresenceScanner(Scanner):
async def init(self, message: discord.Message, *args: str) -> bool: async def init(self, message: discord.Message, *args: str) -> bool:
self.pres = Presence() self.pres = Presence()
self.member_specific = len(self.members) > 0 self.member_specific = len(self.members) > 0
self.all_messages = "all" in args or "everyone" in args
return True return True
def compute_message(self, channel: ChannelLogs, message: MessageLog): def compute_message(self, channel: ChannelLogs, message: MessageLog):
return PresenceScanner.analyse_message( return PresenceScanner.analyse_message(
channel, message, self.pres, self.raw_members channel,
message,
self.pres,
self.raw_members,
all_messages=self.all_messages,
) )
def get_results(self, intro: str) -> List[str]: def get_results(self, intro: str) -> List[str]:
@@ -55,10 +62,16 @@ class PresenceScanner(Scanner):
message: MessageLog, message: MessageLog,
pres: Presence, pres: Presence,
raw_members: List[int], raw_members: List[int],
*,
all_messages: bool,
) -> bool: ) -> bool:
impacted = False impacted = False
# If author is included in the selection (empty list is all) # If author is included in the selection (empty list is all)
if not message.bot and len(raw_members) == 0 or message.author in raw_members: if (
(not message.bot or all_messages)
and len(raw_members) == 0
or message.author in raw_members
):
impacted = True impacted = True
pres.channel_usage[channel.id] += 1 pres.channel_usage[channel.id] += 1
for mention in message.mentions: for mention in message.mentions: