diff --git a/src/logs/channel_logs.py b/src/logs/channel_logs.py index 501cc06..75c103e 100644 --- a/src/logs/channel_logs.py +++ b/src/logs/channel_logs.py @@ -22,7 +22,11 @@ class ChannelLogs: return self.id = int(channel["id"]) 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"]] def is_format(self): diff --git a/src/scanners/channels_scanner.py b/src/scanners/channels_scanner.py index 6211221..b3e7763 100644 --- a/src/scanners/channels_scanner.py +++ b/src/scanners/channels_scanner.py @@ -20,7 +20,7 @@ class ChannelsScanner(Scanner): + "arguments:\n" + COMMON_HELP_ARGS + "* - top , default is 10\n" - + "* all - include bots\n" + + "* all/everyone - include bots\n" + "Example: %chan 10 @user\n" + "```" ) @@ -28,7 +28,7 @@ class ChannelsScanner(Scanner): def __init__(self): super().__init__( has_digit_args=True, - valid_args=["all"], + valid_args=["all", "everyone"], help=ChannelsScanner.help(), intro_context="Channels", ) @@ -39,7 +39,7 @@ class ChannelsScanner(Scanner): for arg in args: if arg.isdigit(): self.top = int(arg) - self.all_messages = "all" in args + self.all_messages = "all" in args or "everyone" in args # Create mentions dict self.messages = defaultdict(Counter) return True diff --git a/src/scanners/composition_scanner.py b/src/scanners/composition_scanner.py index 8de4b93..daec2f7 100644 --- a/src/scanners/composition_scanner.py +++ b/src/scanners/composition_scanner.py @@ -19,22 +19,27 @@ class CompositionScanner(Scanner): + "%compo: Show composition statistics\n" + "arguments:\n" + COMMON_HELP_ARGS + + "* all/everyone - include bots\n" + "Example: %compo #mychannel1 @user\n" + "```" ) def __init__(self): super().__init__( + valid_args=["all", "everyone"], help=CompositionScanner.help(), intro_context="Composition", ) async def init(self, message: discord.Message, *args: str) -> bool: self.compo = Composition() + self.all_messages = "all" in args or "everyone" in args return True 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 def get_results(self, intro: str) -> List[str]: @@ -44,11 +49,19 @@ class CompositionScanner(Scanner): @staticmethod def analyse_message( - message: MessageLog, compo: Composition, raw_members: List[int] + message: MessageLog, + compo: Composition, + raw_members: List[int], + *, + all_messages: bool, ) -> bool: impacted = False # 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 compo.total_characters += len(message.content) diff --git a/src/scanners/emotes_scanner.py b/src/scanners/emotes_scanner.py index 29488af..8c7b93f 100644 --- a/src/scanners/emotes_scanner.py +++ b/src/scanners/emotes_scanner.py @@ -23,6 +23,7 @@ class EmotesScanner(Scanner): + "* all - list all common emojis in addition to this guild's\n" + "* members - show top member for each emojis\n" + "* sort:usage/reaction - other sorting methods\n" + + "* everyone - include bots\n" + "Example: %emojis 10 all #mychannel1 #mychannel2 @user\n" + "```" ) @@ -30,7 +31,7 @@ class EmotesScanner(Scanner): def __init__(self): super().__init__( has_digit_args=True, - valid_args=["all", "members", "sort:usage", "sort:reaction"], + valid_args=["all", "members", "sort:usage", "sort:reaction", "everyone"], help=EmotesScanner.help(), intro_context="Emoji usage", ) @@ -54,11 +55,16 @@ class EmotesScanner(Scanner): self.sort = "usage" elif "sort:reaction" in args: self.sort = "reaction" + self.all_messages = "everyone" in args return True def compute_message(self, channel: ChannelLogs, message: MessageLog): 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]: @@ -107,10 +113,15 @@ class EmotesScanner(Scanner): raw_members: List[int], *, all_emojis: bool, + all_messages: bool, ) -> bool: impacted = False # 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 # Find all emotes un the current message in the form "<:emoji:123456789>" # Filter for known emotes diff --git a/src/scanners/frequency_scanner.py b/src/scanners/frequency_scanner.py index 15a48bb..348be1b 100644 --- a/src/scanners/frequency_scanner.py +++ b/src/scanners/frequency_scanner.py @@ -19,22 +19,27 @@ class FrequencyScanner(Scanner): + "%freq: Show frequency-related statistics\n" + "arguments:\n" + COMMON_HELP_ARGS + + "* all/everyone - include bots\n" + "Example: %freq #mychannel1 @user\n" + "```" ) def __init__(self): super().__init__( + valid_args=["all", "everyone"], help=FrequencyScanner.help(), intro_context="Frequency", ) async def init(self, message: discord.Message, *args: str) -> bool: self.freq = Frequency() + self.all_messages = "all" in args or "everyone" in args return True 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]: FrequencyScanner.compute_results(self.freq) @@ -44,11 +49,19 @@ class FrequencyScanner(Scanner): @staticmethod def analyse_message( - message: MessageLog, freq: Frequency, raw_members: List[int] + message: MessageLog, + freq: Frequency, + raw_members: List[int], + *, + all_messages: bool ) -> bool: impacted = False # 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 freq.dates += [message.created_at] return impacted diff --git a/src/scanners/full_scanner.py b/src/scanners/full_scanner.py index 6d764e6..90c0b09 100644 --- a/src/scanners/full_scanner.py +++ b/src/scanners/full_scanner.py @@ -19,12 +19,14 @@ class FullScanner(Scanner): + "%scan: Show full statistics\n" + "arguments:\n" + COMMON_HELP_ARGS + + "* all/everyone - include bots\n" + "Example: %scan #mychannel1 @user\n" + "```" ) def __init__(self): super().__init__( + valid_args=["all", "everyone"], help=FullScanner.help(), intro_context="Full analysis", ) @@ -34,14 +36,25 @@ class FullScanner(Scanner): self.compo = Composition() self.pres = Presence() self.member_specific = len(self.members) > 0 + self.all_messages = "all" in args or "everyone" in args return True def compute_message(self, channel: ChannelLogs, message: MessageLog): - FrequencyScanner.analyse_message(message, self.freq, self.raw_members) - CompositionScanner.analyse_message(message, self.compo, self.raw_members) - PresenceScanner.analyse_message(channel, message, self.pres, self.raw_members) + FrequencyScanner.analyse_message( + message, self.freq, self.raw_members, all_messages=self.all_messages + ) + 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 ( - not message.bot + (not message.bot or self.all_messages) and len(self.raw_members) == 0 or message.author in self.raw_members ) diff --git a/src/scanners/mentions_scanner.py b/src/scanners/mentions_scanner.py index 9c701b0..8890390 100644 --- a/src/scanners/mentions_scanner.py +++ b/src/scanners/mentions_scanner.py @@ -29,6 +29,7 @@ class MentionsScanner(Scanner): + COMMON_HELP_ARGS + "* - top mentions, default is 10\n" + "* all - show role/channel/everyone/here mentions\n" + + "* everyone - include bots mentions\n" + "Example: %mentions 10 #mychannel1 #mychannel2 @user\n" + "```" ) @@ -36,7 +37,7 @@ class MentionsScanner(Scanner): def __init__(self): super().__init__( has_digit_args=True, - valid_args=["all"], + valid_args=["all", "everyone"], help=MentionsScanner.help(), intro_context="Mention usage", ) @@ -51,11 +52,16 @@ class MentionsScanner(Scanner): self.all_mentions = "all" in args # Create mentions dict self.mentions = defaultdict(Counter) + self.all_messages = "everyone" in args return True def compute_message(self, channel: ChannelLogs, message: MessageLog): 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]: @@ -85,10 +91,15 @@ class MentionsScanner(Scanner): raw_members: List[int], *, all_mentions: bool, + all_messages: bool, ) -> bool: impacted = False # 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 for member_id in message.mentions: name = mention(member_id) diff --git a/src/scanners/messages_scanner.py b/src/scanners/messages_scanner.py index c04e825..f576057 100644 --- a/src/scanners/messages_scanner.py +++ b/src/scanners/messages_scanner.py @@ -20,7 +20,7 @@ class MessagesScanner(Scanner): + "arguments:\n" + COMMON_HELP_ARGS + "* - top , default is 10\n" - + "* all - include bots\n" + + "* all/everyone - include bots\n" + "Example: %msg 10 #channel\n" + "```" ) @@ -28,7 +28,7 @@ class MessagesScanner(Scanner): def __init__(self): super().__init__( has_digit_args=True, - valid_args=["all"], + valid_args=["all", "everyone"], help=MessagesScanner.help(), intro_context="Messages", ) @@ -39,7 +39,7 @@ class MessagesScanner(Scanner): for arg in args: if arg.isdigit(): self.top = int(arg) - self.all_messages = "all" in args + self.all_messages = "all" in args or "everyone" in args # Create mentions dict self.messages = defaultdict(Counter) return True diff --git a/src/scanners/presence_scanner.py b/src/scanners/presence_scanner.py index e373ea4..b19e723 100644 --- a/src/scanners/presence_scanner.py +++ b/src/scanners/presence_scanner.py @@ -18,12 +18,14 @@ class PresenceScanner(Scanner): + "%pres: Show presence statistics\n" + "arguments:\n" + COMMON_HELP_ARGS + + "* all/everyone - include bots\n" + "Example: %pres #mychannel1 @user\n" + "```" ) def __init__(self): super().__init__( + valid_args=["all", "everyone"], help=PresenceScanner.help(), intro_context="Presence", ) @@ -31,11 +33,16 @@ class PresenceScanner(Scanner): async def init(self, message: discord.Message, *args: str) -> bool: self.pres = Presence() self.member_specific = len(self.members) > 0 + self.all_messages = "all" in args or "everyone" in args return True def compute_message(self, channel: ChannelLogs, message: MessageLog): 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]: @@ -55,10 +62,16 @@ class PresenceScanner(Scanner): message: MessageLog, pres: Presence, raw_members: List[int], + *, + all_messages: bool, ) -> bool: impacted = False # 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 pres.channel_usage[channel.id] += 1 for mention in message.mentions: